diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 4a2f50f9e3a29..e4d1f63763031 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -14,7 +14,9 @@ disabled: - x-pack/test/api_integration/config.ts - x-pack/test/fleet_api_integration/config.base.ts - x-pack/test/security_solution_api_integration/config/ess/config.base.ts + - x-pack/test/security_solution_api_integration/config/ess/config.base.basic.ts - x-pack/test/security_solution_api_integration/config/serverless/config.base.ts + - x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts - x-pack/test/security_solution_endpoint/config.base.ts - x-pack/test/security_solution_endpoint_api_int/config.base.ts @@ -164,8 +166,10 @@ enabled: - x-pack/test/alerting_api_integration/security_and_spaces/group1/config.ts - x-pack/test/alerting_api_integration/security_and_spaces/group2/config.ts - x-pack/test/alerting_api_integration/security_and_spaces/group3/config.ts + - x-pack/test/alerting_api_integration/security_and_spaces/group4/config.ts - x-pack/test/alerting_api_integration/security_and_spaces/group3/config_with_schedule_circuit_breaker.ts - x-pack/test/alerting_api_integration/security_and_spaces/group2/config_non_dedicated_task_runner.ts + - x-pack/test/alerting_api_integration/security_and_spaces/group4/config_non_dedicated_task_runner.ts - x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group1/config.ts - x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/config.ts - x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/config.ts @@ -316,6 +320,7 @@ enabled: - x-pack/test/functional/apps/transform/feature_controls/config.ts - x-pack/test/functional/apps/upgrade_assistant/config.ts - x-pack/test/functional/apps/uptime/config.ts + - x-pack/test/functional/apps/user_profiles/config.ts - x-pack/test/functional/apps/visualize/config.ts - x-pack/test/functional/apps/watcher/config.ts - x-pack/test/functional/config_security_basic.ts @@ -409,6 +414,8 @@ enabled: - x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group2.ts - x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group3.ts - x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group4.ts + - x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts + - x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts - x-pack/test_serverless/functional/test_suites/observability/config.screenshots.ts - x-pack/test_serverless/functional/test_suites/search/config.ts - x-pack/test_serverless/functional/test_suites/search/config.examples.ts @@ -417,6 +424,8 @@ enabled: - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group2.ts - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group3.ts - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group4.ts + - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts + - x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts - x-pack/test_serverless/functional/test_suites/security/config.ts - x-pack/test_serverless/functional/test_suites/security/config.examples.ts - x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts @@ -424,6 +433,8 @@ enabled: - x-pack/test_serverless/functional/test_suites/security/common_configs/config.group2.ts - x-pack/test_serverless/functional/test_suites/security/common_configs/config.group3.ts - x-pack/test_serverless/functional/test_suites/security/common_configs/config.group4.ts + - x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts + - x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts - x-pack/performance/journeys/ecommerce_dashboard.ts - x-pack/performance/journeys/ecommerce_dashboard_map_only.ts - x-pack/performance/journeys/flight_dashboard.ts @@ -443,7 +454,6 @@ enabled: - x-pack/performance/journeys/apm_service_inventory.ts - x-pack/test/custom_branding/config.ts - x-pack/test/profiling_api_integration/cloud/config.ts - - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/exceptions/workflows/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/exceptions/workflows/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/exceptions/operators_data_types/date_numeric_types/configs/serverless.config.ts @@ -478,3 +488,6 @@ enabled: - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles/configs/ess.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/serverless.config.ts - x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/configs/ess.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/serverless.config.ts + - x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/ess.config.ts + diff --git a/.buildkite/pipeline-utils/ci-stats/client.ts b/.buildkite/pipeline-utils/ci-stats/client.ts index 6a5c048464c70..d7367b89947ad 100644 --- a/.buildkite/pipeline-utils/ci-stats/client.ts +++ b/.buildkite/pipeline-utils/ci-stats/client.ts @@ -201,7 +201,7 @@ export class CiStatsClient { headers: this.defaultHeaders, }); } catch (error) { - console.error('CI Stats request error:', error); + console.error('CI Stats request error:', error?.response?.data?.message); if (attempt < maxAttempts) { const sec = attempt * 3; @@ -210,7 +210,7 @@ export class CiStatsClient { continue; } - throw error; + throw new Error('Failed to connect to CI Stats.'); } } } diff --git a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml index feac7bdb17848..2ee943d72ee03 100644 --- a/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml +++ b/.buildkite/pipelines/quality-gates/pipeline.tests-qa.yaml @@ -46,13 +46,3 @@ steps: USE_GROUP_LABEL: true agents: image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.6" - - - group: "Observability" - steps: - - label: ":judge::seedling: Trigger Manual Tests Phase - Observability" - command: "make -C /agent trigger-manual-verification-phase" - env: - NOTIFICATION_APPENDIX: " please execute your manual testing plan." - USE_GROUP_LABEL: true - agents: - image: "docker.elastic.co/ci-agent-images/manual-verification-agent:0.0.6" diff --git a/.buildkite/pipelines/security_solution/api_integration.yml b/.buildkite/pipelines/security_solution/api_integration.yml index b4c6cece31c4b..0fbc23bcab68a 100644 --- a/.buildkite/pipelines/security_solution/api_integration.yml +++ b/.buildkite/pipelines/security_solution/api_integration.yml @@ -1,7 +1,7 @@ steps: - - label: Running exception_workflows:runner:serverless + - label: Running exception_workflows:qa:serverless command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_workflows:qa:serverless - key: exception_workflows:runner:serverless + key: exception_workflows:qa:serverless agents: queue: n2-4-spot timeout_in_minutes: 120 @@ -10,9 +10,9 @@ steps: - exit_status: '*' limit: 2 - - label: Running exception_operators_date_numeric_types:runner:serverless + - label: Running exception_operators_date_numeric_types:qa:serverless command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_date_numeric_types:qa:serverless - key: exception_operators_date_numeric_types:runner:serverless + key: exception_operators_date_numeric_types:qa:serverless agents: queue: n2-4-spot timeout_in_minutes: 120 @@ -21,9 +21,20 @@ steps: - exit_status: '*' limit: 2 - - label: Running exception_operators_keyword_text_long:runner:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_keyword_text_long:qa:serverless - key: exception_operators_keyword_text_long:runner:serverless + - label: Running exception_operators_keyword:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_keyword:qa:serverless + key: exception_operators_keyword:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '*' + limit: 2 + + - label: Running exception_operators_ips:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_ips:qa:serverless + key: exception_operators_ips:qa:serverless agents: queue: n2-4-spot timeout_in_minutes: 120 @@ -32,9 +43,9 @@ steps: - exit_status: '*' limit: 2 - - label: Running exception_operators_ips_text_array:runner:serverless - command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_ips_text_array:qa:serverless - key: exception_operators_ips_text_array:runner:serverless + - label: Running exception_operators_long:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_long:qa:serverless + key: exception_operators_long:qa:serverless agents: queue: n2-4-spot timeout_in_minutes: 120 @@ -42,10 +53,22 @@ steps: automatic: - exit_status: '1' limit: 2 + - - label: Running rule_creation:runner:serverless + - label: Running exception_operators_text:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh exception_operators_text:qa:serverless + key: exception_operators_text:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running rule_creation:qa:serverless command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh rule_creation:qa:serverless - key: rule_creation:runner:serverless + key: rule_creation:qa:serverless agents: queue: n2-4-spot timeout_in_minutes: 120 @@ -64,4 +87,92 @@ steps: automatic: - exit_status: '1' limit: 2 - + + - label: Running entity_analytics:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh entity_analytics:qa:serverless + key: entity_analytics:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running prebuilt_rules_management:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh prebuilt_rules_management:qa:serverless + key: prebuilt_rules_management:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless + key: prebuilt_rules_bundled_prebuilt_rules_package:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running prebuilt_rules_large_prebuilt_rules_package:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh prebuilt_rules_large_prebuilt_rules_package:qa:serverless + key: prebuilt_rules_large_prebuilt_rules_package:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running prebuilt_rules_update_prebuilt_rules_package:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh prebuilt_rules_update_prebuilt_rules_package:qa:serverless + key: prebuilt_rules_update_prebuilt_rules_package:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running rule_execution_logic:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh rule_execution_logic:qa:serverless + key: rule_execution_logic:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running user_roles:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh user_roles:qa:serverless + key: user_roles:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + + - label: Running telemetry:qa:serverless + command: .buildkite/scripts/pipelines/security_solution_quality_gate/api-integration-tests.sh telemetry:qa:serverless + key: telemetry:qa:serverless + agents: + queue: n2-4-spot + timeout_in_minutes: 120 + retry: + automatic: + - exit_status: '1' + limit: 2 + \ No newline at end of file diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 41de2dc843d4d..65a3ff6ba2004 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -55,14 +55,14 @@ "repoName": "kibana", "pipelineSlug": "kibana-kme-test", - "enabled": false, + "enabled": true, "allow_org_users": true, "allowed_repo_permissions": ["admin", "write"], "allowed_list": ["barlowm", "renovate[bot]"], "set_commit_status": true, - "commit_status_context": "kibana-ci", + "commit_status_context": "kibana-ci-test", "build_on_commit": true, - "build_on_comment": true, + "build_on_comment": false, "trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))", "always_trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))", "skip_ci_labels": [], diff --git a/.buildkite/scripts/lifecycle/pre_build.sh b/.buildkite/scripts/lifecycle/pre_build.sh index 62f94dd493fa8..b8ccaf04f9bb9 100755 --- a/.buildkite/scripts/lifecycle/pre_build.sh +++ b/.buildkite/scripts/lifecycle/pre_build.sh @@ -8,8 +8,6 @@ if [[ "${GITHUB_BUILD_COMMIT_STATUS_ENABLED:-}" != "true" ]]; then "$(dirname "${0}")/commit_status_start.sh" fi -export CI_STATS_TOKEN="$(retry 5 5 vault read -field=api_token secret/kibana-issues/dev/kibana_ci_stats)" -export CI_STATS_HOST="$(retry 5 5 vault read -field=api_host secret/kibana-issues/dev/kibana_ci_stats)" ts-node "$(dirname "${0}")/ci_stats_start.ts" diff --git a/.buildkite/scripts/lifecycle/pre_command.sh b/.buildkite/scripts/lifecycle/pre_command.sh index 9cfa973b28024..965c09621caa0 100755 --- a/.buildkite/scripts/lifecycle/pre_command.sh +++ b/.buildkite/scripts/lifecycle/pre_command.sh @@ -77,16 +77,16 @@ EOF { CI_STATS_BUILD_ID="$(buildkite-agent meta-data get ci_stats_build_id --default '')" export CI_STATS_BUILD_ID + + CI_STATS_TOKEN="$(retry 5 5 vault read -field=api_token secret/kibana-issues/dev/kibana_ci_stats)" + export CI_STATS_TOKEN + + CI_STATS_HOST="$(retry 5 5 vault read -field=api_host secret/kibana-issues/dev/kibana_ci_stats)" + export CI_STATS_HOST if [[ "$CI_STATS_BUILD_ID" ]]; then echo "CI Stats Build ID: $CI_STATS_BUILD_ID" - CI_STATS_TOKEN="$(retry 5 5 vault read -field=api_token secret/kibana-issues/dev/kibana_ci_stats)" - export CI_STATS_TOKEN - - CI_STATS_HOST="$(retry 5 5 vault read -field=api_host secret/kibana-issues/dev/kibana_ci_stats)" - export CI_STATS_HOST - KIBANA_CI_STATS_CONFIG=$(jq -n \ --arg buildId "$CI_STATS_BUILD_ID" \ --arg apiUrl "https://$CI_STATS_HOST" \ diff --git a/.buildkite/scripts/steps/storybooks/build_and_upload.ts b/.buildkite/scripts/steps/storybooks/build_and_upload.ts index 83f1ecb2a759d..19fed0e78885f 100644 --- a/.buildkite/scripts/steps/storybooks/build_and_upload.ts +++ b/.buildkite/scripts/steps/storybooks/build_and_upload.ts @@ -16,7 +16,6 @@ const STORYBOOKS = [ 'canvas', 'cases', 'cell_actions', - 'ci_composite', 'cloud_chat', 'coloring', 'chart_icons', @@ -93,14 +92,12 @@ const upload = () => { console.log('--- Generating Storybooks HTML'); process.chdir(path.join('.', 'built_assets', 'storybook')); - fs.renameSync('ci_composite', 'composite'); const storybooks = execSync(`ls -1d */`) .toString() .trim() .split('\n') - .map((filePath) => filePath.replace('/', '')) - .filter((filePath) => filePath !== 'composite'); + .map((filePath) => filePath.replace('/', '')); const listHtml = storybooks .map((storybook) => `
  • ${storybook}
  • `) @@ -110,8 +107,6 @@ const upload = () => {

    Storybooks

    -

    Composite Storybook

    -

    All

    diff --git a/.ci/.storybook/main.js b/.ci/.storybook/main.js deleted file mode 100644 index c4e017179021a..0000000000000 --- a/.ci/.storybook/main.js +++ /dev/null @@ -1,34 +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. - */ - -const config = require('@kbn/storybook').defaultConfig; -const aliases = require('../../src/dev/storybook/aliases').storybookAliases; - -config.refs = {}; - -// Required due to https://github.com/storybookjs/storybook/issues/13834 -config.babel = async (options) => ({ - ...options, - plugins: ['@babel/plugin-transform-typescript', ...options.plugins], -}); - -for (const alias of Object.keys(aliases).filter((a) => a !== 'ci_composite')) { - // snake_case -> Title Case - const title = alias - .replace(/_/g, ' ') - .split(' ') - .map((n) => n[0].toUpperCase() + n.slice(1)) - .join(' '); - - config.refs[alias] = { - title: title, - url: `${process.env.STORYBOOK_BASE_URL}/${alias}`, - }; -} - -module.exports = config; diff --git a/.eslintrc.js b/.eslintrc.js index 82193a7e2ecb7..23706483a4426 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -941,7 +941,7 @@ module.exports = { ], rules: { '@kbn/i18n/strings_should_be_translated_with_i18n': 'warn', - '@kbn/i18n/strings_should_be_translated_with_formatted_message': 'warn', + '@kbn/i18n/i18n_translate_should_start_with_the_right_id': 'warn', }, }, { @@ -1539,6 +1539,17 @@ module.exports = { }, }, + /** + * Serverless Search overrides + */ + { + // All files + files: ['x-pack/plugins/serverless_search/**/*.{ts,tsx}', 'packages/kbn-search-*'], + rules: { + '@kbn/telemetry/event_generating_elements_should_be_instrumented': 'error', + }, + }, + /** * Canvas overrides */ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a17c788699938..2da7f440baf1e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -54,6 +54,7 @@ x-pack/plugins/banners @elastic/appex-sharedux packages/kbn-bazel-runner @elastic/kibana-operations examples/bfetch_explorer @elastic/appex-sharedux src/plugins/bfetch @elastic/appex-sharedux +packages/kbn-calculate-auto @elastic/obs-ux-management-team x-pack/plugins/canvas @elastic/kibana-presentation x-pack/test/cases_api_integration/common/plugins/cases @elastic/response-ops packages/kbn-cases-components @elastic/response-ops @@ -301,6 +302,7 @@ x-pack/plugins/cross_cluster_replication @elastic/platform-deployment-management packages/kbn-crypto @elastic/kibana-security packages/kbn-crypto-browser @elastic/kibana-core x-pack/plugins/custom_branding @elastic/appex-sharedux +packages/kbn-custom-icons @elastic/obs-ux-logs-team packages/kbn-custom-integrations @elastic/obs-ux-logs-team src/plugins/custom_integrations @elastic/fleet packages/kbn-cypress-config @elastic/kibana-operations @@ -344,6 +346,7 @@ packages/kbn-ebt-tools @elastic/kibana-core packages/kbn-ecs @elastic/kibana-core @elastic/security-threat-hunting-investigations x-pack/packages/security-solution/ecs_data_quality_dashboard @elastic/security-threat-hunting-investigations x-pack/plugins/ecs_data_quality_dashboard @elastic/security-threat-hunting-investigations +packages/kbn-elastic-agent-utils @elastic/obs-ux-logs-team x-pack/packages/kbn-elastic-assistant @elastic/security-solution x-pack/plugins/elastic_assistant @elastic/security-solution test/plugin_functional/plugins/elasticsearch_client_plugin @elastic/kibana-core @@ -365,7 +368,7 @@ src/plugins/es_ui_shared @elastic/platform-deployment-management packages/kbn-eslint-config @elastic/kibana-operations packages/kbn-eslint-plugin-disable @elastic/kibana-operations packages/kbn-eslint-plugin-eslint @elastic/kibana-operations -packages/kbn-eslint-plugin-i18n @elastic/obs-knowledge-team +packages/kbn-eslint-plugin-i18n @elastic/obs-knowledge-team @elastic/kibana-operations packages/kbn-eslint-plugin-imports @elastic/kibana-operations packages/kbn-eslint-plugin-telemetry @elastic/obs-knowledge-team x-pack/test/encrypted_saved_objects_api_integration/plugins/api_consumer_plugin @elastic/kibana-security @@ -533,7 +536,9 @@ x-pack/packages/ml/route_utils @elastic/ml-ui x-pack/packages/ml/runtime_field_utils @elastic/ml-ui x-pack/packages/ml/string_hash @elastic/ml-ui x-pack/packages/ml/trained_models_utils @elastic/ml-ui +x-pack/packages/ml/ui_actions @elastic/ml-ui x-pack/packages/ml/url_state @elastic/ml-ui +packages/kbn-mock-idp-plugin @elastic/kibana-security packages/kbn-monaco @elastic/appex-sharedux x-pack/plugins/monitoring_collection @elastic/obs-ux-infra_services-team x-pack/plugins/monitoring @elastic/obs-ux-infra_services-team @@ -748,7 +753,6 @@ test/server_integration/plugins/status_plugin_b @elastic/kibana-core packages/kbn-std @elastic/kibana-core packages/kbn-stdio-dev-helpers @elastic/kibana-operations packages/kbn-storybook @elastic/kibana-operations -packages/kbn-subscription-tracking @elastic/security-threat-hunting-investigations x-pack/plugins/synthetics @elastic/obs-ux-infra_services-team x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture @elastic/response-ops x-pack/test/plugin_api_perf/plugins/task_manager_performance @elastic/response-ops @@ -882,6 +886,9 @@ packages/kbn-zod-helpers @elastic/security-detection-rule-management /x-pack/test_serverless/api_integration/test_suites/common/scripts_tests @elastic/kibana-data-discovery /x-pack/test_serverless/api_integration/test_suites/common/search_oss @elastic/kibana-data-discovery /x-pack/test_serverless/api_integration/test_suites/common/search_xpack @elastic/kibana-data-discovery +/x-pack/test_serverless/functional/test_suites/common/context @elastic/kibana-data-discovery +/x-pack/test_serverless/functional/test_suites/common/discover @elastic/kibana-data-discovery +/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover @elastic/kibana-data-discovery /x-pack/test_serverless/functional/test_suites/common/examples/data_view_field_editor_example @elastic/kibana-data-discovery /x-pack/test_serverless/functional/test_suites/common/examples/discover_customization_examples @elastic/kibana-data-discovery /x-pack/test_serverless/functional/test_suites/common/examples/field_formats @elastic/kibana-data-discovery @@ -889,6 +896,7 @@ packages/kbn-zod-helpers @elastic/security-detection-rule-management /x-pack/test_serverless/functional/test_suites/common/examples/search @elastic/kibana-data-discovery /x-pack/test_serverless/functional/test_suites/common/examples/search_examples @elastic/kibana-data-discovery /x-pack/test_serverless/functional/test_suites/common/examples/unified_field_list_examples @elastic/kibana-data-discovery +/x-pack/test_serverless/functional/test_suites/common/management/data_views @elastic/kibana-data-discovery # Visualizations /src/plugins/visualize/ @elastic/kibana-visualizations @@ -1387,6 +1395,7 @@ x-pack/test/security_solution_api_integration/test_suites/detections_response/de x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/actions @elastic/security-detection-engine x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/alerts @elastic/security-detection-engine x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/user_roles @elastic/security-detection-engine +x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine @elastic/security-detection-engine /x-pack/plugins/security_solution/server/lib/detection_engine/scripts/roles_users @elastic/security-detection-engine ## Security Threat Intelligence - Under Security Platform @@ -1433,6 +1442,7 @@ x-pack/test/security_solution_api_integration/test_suites/detections_response/de ## Security Solution sub teams - security-telemetry (Data Engineering) x-pack/plugins/security_solution/server/usage/ @elastic/security-data-analytics x-pack/plugins/security_solution/server/lib/telemetry/ @elastic/security-data-analytics +x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry @elastic/security-data-analytics ## Security Solution sub teams - security-engineering-productivity /x-pack/test/security_solution_cypress/* @elastic/security-engineering-productivity @@ -1459,6 +1469,7 @@ x-pack/plugins/security_solution/public/overview/components/entity_analytics x-pack/plugins/security_solution/server/lib/entity_analytics @elastic/security-entity-analytics x-pack/plugins/security_solution/server/lib/risk_score @elastic/security-entity-analytics x-pack/test/security_solution_api_integration/test_suites/entity_analytics @elastic/security-entity-analytics +x-pack/plugins/security_solution/public/flyout/entity_details @elastic/security-entity-analytics # Security Defend Workflows - OSQuery Ownership /x-pack/plugins/security_solution/common/api/detection_engine/model/rule_response_actions @elastic/security-defend-workflows diff --git a/.github/paths-labeller.yml b/.github/paths-labeller.yml index 1c1b2742001b5..4f4057935265a 100644 --- a/.github/paths-labeller.yml +++ b/.github/paths-labeller.yml @@ -21,3 +21,5 @@ - "x-pack/plugins/synthetics/**/*.*" - "x-pack/plugins/ux/**/*.*" - "x-pack/plugins/observability/public/components/shared/exploratory_view/**/*.*" + - "Team:obs-ux-management": + - "x-pack/plugins/observability/**/*.*" diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 64143589d0167..64c4d32f35f17 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-11-16 +date: 2023-11-27 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 99efdc253e539..4c785a0867daf 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.devdocs.json b/api_docs/aiops.devdocs.json index 4a976c737c794..6649c83b16dfe 100644 --- a/api_docs/aiops.devdocs.json +++ b/api_docs/aiops.devdocs.json @@ -573,6 +573,29 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "aiops", + "id": "def-public.AiopsAppDependencies.uiActions", + "type": "Object", + "tags": [], + "label": "uiActions", + "description": [ + "\nUI actions." + ], + "signature": [ + { + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.UiActionsStart", + "text": "UiActionsStart" + }, + " | undefined" + ], + "path": "x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "aiops", "id": "def-public.AiopsAppDependencies.i18n", diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index abd069d6bcc74..a54f606decee3 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 69 | 1 | 4 | 1 | +| 70 | 1 | 4 | 1 | ## Client diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 9505e1de3807c..e80f957ba133d 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -7406,12 +7406,15 @@ "parentPluginId": "alerting", "id": "def-common.MaintenanceWindowSOProperties", "type": "Interface", - "tags": [], + "tags": [ + "deprecated" + ], "label": "MaintenanceWindowSOProperties", "description": [], "path": "x-pack/plugins/alerting/common/maintenance_window.ts", - "deprecated": false, + "deprecated": true, "trackAdoption": false, + "references": [], "children": [ { "parentPluginId": "alerting", @@ -7521,6 +7524,21 @@ "path": "x-pack/plugins/alerting/common/maintenance_window.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "alerting", + "id": "def-common.MaintenanceWindowSOProperties.scopedQuery", + "type": "CompoundType", + "tags": [], + "label": "scopedQuery", + "description": [], + "signature": [ + "ScopedQueryAttributes", + " | null | undefined" + ], + "path": "x-pack/plugins/alerting/common/maintenance_window.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -10187,7 +10205,9 @@ "parentPluginId": "alerting", "id": "def-common.MaintenanceWindow", "type": "Type", - "tags": [], + "tags": [ + "deprecated" + ], "label": "MaintenanceWindow", "description": [], "signature": [ @@ -10217,8 +10237,94 @@ "; eventStartTime: string | null; eventEndTime: string | null; id: string; }" ], "path": "x-pack/plugins/alerting/common/maintenance_window.ts", - "deprecated": false, + "deprecated": true, "trackAdoption": false, + "references": [ + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/tooltip_content.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/tooltip_content.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_get_maintenance_windows.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_get_maintenance_windows.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_alert_list.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_alert_list.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_alert_list.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_alert_list.tsx" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/types.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/types.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/index.mock.ts" + }, + { + "plugin": "triggersActionsUi", + "path": "x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/index.mock.ts" + } + ], "initialIsOpen": false }, { @@ -10237,7 +10343,9 @@ "section": "def-common.RRuleParams", "text": "RRuleParams" }, - "; categoryIds?: string[] | null | undefined; }" + "; categoryIds?: string[] | null | undefined; scopedQuery?: ", + "ScopedQueryAttributes", + " | null | undefined; }" ], "path": "x-pack/plugins/alerting/common/maintenance_window.ts", "deprecated": false, @@ -10263,7 +10371,9 @@ "parentPluginId": "alerting", "id": "def-common.MaintenanceWindowSOAttributes", "type": "Type", - "tags": [], + "tags": [ + "deprecated" + ], "label": "MaintenanceWindowSOAttributes", "description": [], "signature": [ @@ -10284,8 +10394,9 @@ } ], "path": "x-pack/plugins/alerting/common/maintenance_window.ts", - "deprecated": false, + "deprecated": true, "trackAdoption": false, + "references": [], "initialIsOpen": false }, { diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 2a7c56b3ec1e9..35e5224f252df 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 810 | 1 | 779 | 50 | +| 811 | 1 | 780 | 51 | ## Client diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 897cd39513a7b..0dfa84c0e4233 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -418,7 +418,7 @@ "label": "APIEndpoint", "description": [], "signature": [ - "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/title\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_service_summary\" | \"GET /internal/apm/assistant/get_error_document\" | \"POST /internal/apm/assistant/get_correlation_values\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"POST /internal/apm/assistant/get_services_list\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" + "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/index_pattern\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_service_summary\" | \"GET /internal/apm/assistant/get_error_document\" | \"POST /internal/apm/assistant/get_correlation_values\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"POST /internal/apm/assistant/get_services_list\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" ], "path": "x-pack/plugins/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts", "deprecated": false, @@ -597,7 +597,11 @@ "Type", "; endIndex: ", "Type", - "; }>]>; }> | undefined; handler: ({}: ", + "; }>, ", + "TypeC", + "<{ kuery: ", + "StringC", + "; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", " & { params: { path: { serviceName: string; }; query: { start: number; end: number; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", "Branded", @@ -617,7 +621,7 @@ "ApmDocumentType", ".TransactionEvent; rollupInterval: ", "RollupInterval", - "; } & { startIndex: number; endIndex: number; }; }; }) => Promise<{ functions: ", + "; } & { startIndex: number; endIndex: number; } & { kuery: string; }; }; }) => Promise<{ functions: ", { "pluginId": "@kbn/profiling-utils", "scope": "common", @@ -699,7 +703,11 @@ "LiteralC", "<", "RollupInterval", - ".None>]>; }>]>; }> | undefined; handler: ({}: ", + ".None>]>; }>, ", + "TypeC", + "<{ kuery: ", + "StringC", + "; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", " & { params: { path: { serviceName: string; }; query: { start: number; end: number; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", "Branded", @@ -719,7 +727,7 @@ "ApmDocumentType", ".TransactionEvent; rollupInterval: ", "RollupInterval", - "; }; }; }) => Promise<{ flamegraph: ", + "; } & { kuery: string; }; }; }) => Promise<{ flamegraph: ", { "pluginId": "@kbn/profiling-utils", "scope": "common", @@ -5855,7 +5863,41 @@ "section": "def-common.NonEmptyStringBrand", "text": "NonEmptyStringBrand" }, - ">]>; }>]>; }> | undefined; handler: ({}: ", + ">]>; }>, ", + "TypeC", + "<{ documentType: ", + "UnionC", + "<[", + "LiteralC", + "<", + "ApmDocumentType", + ".ServiceTransactionMetric>, ", + "LiteralC", + "<", + "ApmDocumentType", + ".TransactionMetric>, ", + "LiteralC", + "<", + "ApmDocumentType", + ".TransactionEvent>]>; rollupInterval: ", + "UnionC", + "<[", + "LiteralC", + "<", + "RollupInterval", + ".OneMinute>, ", + "LiteralC", + "<", + "RollupInterval", + ".TenMinutes>, ", + "LiteralC", + "<", + "RollupInterval", + ".SixtyMinutes>, ", + "LiteralC", + "<", + "RollupInterval", + ".None>]>; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", " & { params: { path: { serviceName: string; serviceNodeName: string; }; query: { kuery: string; } & { start: number; end: number; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", "Branded", @@ -5867,7 +5909,15 @@ "section": "def-common.NonEmptyStringBrand", "text": "NonEmptyStringBrand" }, - ">; }; }; }) => Promise<", + ">; } & { documentType: ", + "ApmDocumentType", + ".TransactionMetric | ", + "ApmDocumentType", + ".ServiceTransactionMetric | ", + "ApmDocumentType", + ".TransactionEvent; rollupInterval: ", + "RollupInterval", + "; }; }; }) => Promise<", "ServiceNodeMetadataResponse", ">; } & ", "APMRouteCreateOptions", @@ -7373,9 +7423,9 @@ }, ">)[]; }>; } & ", "APMRouteCreateOptions", - "; \"GET /internal/apm/data_view/title\": { endpoint: \"GET /internal/apm/data_view/title\"; params?: undefined; handler: ({}: ", + "; \"GET /internal/apm/data_view/index_pattern\": { endpoint: \"GET /internal/apm/data_view/index_pattern\"; params?: undefined; handler: ({}: ", "APMRouteHandlerResources", - ") => Promise<{ apmDataViewTitle: string; }>; } & ", + ") => Promise<{ apmDataViewIndexPattern: string; }>; } & ", "APMRouteCreateOptions", "; \"POST /internal/apm/data_view/static\": { endpoint: \"POST /internal/apm/data_view/static\"; params?: undefined; handler: ({}: ", "APMRouteHandlerResources", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 3054b4228c6b3..b9021eb002b5c 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-11-16 +date: 2023-11-27 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 1e3faec44ddb2..809f8c21afdae 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-11-16 +date: 2023-11-27 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 564cc08e57cf5..d55f11cd8fd64 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-11-16 +date: 2023-11-27 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 d621ec7e6c16c..550b553d91c75 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-11-16 +date: 2023-11-27 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 c6297e0f08f47..c14441a4d8b1a 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-11-16 +date: 2023-11-27 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 14322f9c1f0ed..79384b8823504 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-11-16 +date: 2023-11-27 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 81ea481070a8d..2175518b83b8a 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-11-16 +date: 2023-11-27 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 8f10078c47f8c..ce5bc2efd59f1 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-11-16 +date: 2023-11-27 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 1deca15b7abc3..4a5e0348815e0 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-11-16 +date: 2023-11-27 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 e2da1f02675a3..fc3f1b6adfdc1 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-11-16 +date: 2023-11-27 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 07c00eb8fa709..a6640e58293bc 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-11-16 +date: 2023-11-27 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 180e2a6565f3a..dc98d1f692df6 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-11-16 +date: 2023-11-27 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 70873f3466d25..2a6baef1755e0 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-11-16 +date: 2023-11-27 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 81ea3c2c6302e..cb42d5c3df9cc 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-11-16 +date: 2023-11-27 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 20737866a276f..ec170ede51374 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-11-16 +date: 2023-11-27 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 ecaa1207437a9..d99580e8b5176 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-11-16 +date: 2023-11-27 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 23c814c9c8c47..e9a4c5d3bd829 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-11-16 +date: 2023-11-27 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 bab1ba8b7e7eb..20fd53d59d982 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-11-16 +date: 2023-11-27 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 1388e49e66aba..3ebdee284f01b 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index 04a304f93dd8f..7ddcca4750bf7 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -2690,7 +2690,7 @@ "section": "def-common.PluginInitializerContext", "text": "PluginInitializerContext" }, - "; }>; asyncSearch: Readonly<{ pollInterval?: number | undefined; } & { waitForCompletion: moment.Duration; keepAlive: moment.Duration; batchedReduceSize: number; }>; sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; notTouchedTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; }>>" + "; }>; asyncSearch: Readonly<{ pollInterval?: number | undefined; } & { waitForCompletion: moment.Duration; keepAlive: moment.Duration; batchedReduceSize: number; }>; sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; notTouchedTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; enableUiSettingsValidations: boolean; }>>" ], "path": "src/plugins/data/public/plugin.ts", "deprecated": false, @@ -12839,7 +12839,7 @@ "section": "def-common.PluginInitializerContext", "text": "PluginInitializerContext" }, - "; }>; asyncSearch: Readonly<{ pollInterval?: number | undefined; } & { waitForCompletion: moment.Duration; keepAlive: moment.Duration; batchedReduceSize: number; }>; sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; notTouchedTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; }>>" + "; }>; asyncSearch: Readonly<{ pollInterval?: number | undefined; } & { waitForCompletion: moment.Duration; keepAlive: moment.Duration; batchedReduceSize: number; }>; sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; notTouchedTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; enableUiSettingsValidations: boolean; }>>" ], "path": "src/plugins/data/server/plugin.ts", "deprecated": false, diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 1028805d3b13b..05273d61198ec 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index a85420c2c721d..24918a9b2d9bf 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index bf6f39e5a7abc..fe3f4b793d43a 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -267,7 +267,7 @@ "\nCurrent session management\n{@link ISessionService}" ], "signature": [ - "{ start: () => string; save: () => Promise; clear: () => void; destroy: () => void; readonly state$: ", + "{ start: () => string; clear: () => void; save: () => Promise; destroy: () => void; readonly state$: ", "Observable", "<", { @@ -723,7 +723,7 @@ "\nCurrent session management\n{@link ISessionService}" ], "signature": [ - "{ start: () => string; save: () => Promise; clear: () => void; destroy: () => void; readonly state$: ", + "{ start: () => string; clear: () => void; save: () => Promise; destroy: () => void; readonly state$: ", "Observable", "<", { @@ -1279,7 +1279,7 @@ "label": "ISessionService", "description": [], "signature": [ - "{ start: () => string; save: () => Promise; clear: () => void; destroy: () => void; readonly state$: ", + "{ start: () => string; clear: () => void; save: () => Promise; destroy: () => void; readonly state$: ", "Observable", "<", { @@ -1480,7 +1480,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{} & { search: Readonly<{} & { aggs: Readonly<{} & { shardDelay: Readonly<{} & { enabled: boolean; }>; }>; asyncSearch: Readonly<{ pollInterval?: number | undefined; } & { waitForCompletion: moment.Duration; keepAlive: moment.Duration; batchedReduceSize: number; }>; sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; notTouchedTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; }>" + "Readonly<{} & { search: Readonly<{} & { aggs: Readonly<{} & { shardDelay: Readonly<{} & { enabled: boolean; }>; }>; asyncSearch: Readonly<{ pollInterval?: number | undefined; } & { waitForCompletion: moment.Duration; keepAlive: moment.Duration; batchedReduceSize: number; }>; sessions: Readonly<{} & { enabled: boolean; management: Readonly<{} & { refreshInterval: moment.Duration; maxSessions: number; refreshTimeout: moment.Duration; expiresSoonWarning: moment.Duration; }>; notTouchedTimeout: moment.Duration; maxUpdateRetries: number; defaultExpiration: moment.Duration; }>; }>; enableUiSettingsValidations: boolean; }>" ], "path": "src/plugins/data/server/search/session/session_service.ts", "deprecated": false, diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 63aedbc218d54..1153d9278b2b8 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 52bcd8c7aaa6c..7f24893ac9419 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-11-16 +date: 2023-11-27 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 02ead0b2a86ec..192413dcae237 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-11-16 +date: 2023-11-27 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 0b12410853007..9627485b6d55c 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-11-16 +date: 2023-11-27 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 399cc8f171c19..b655c5a401b3f 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-11-16 +date: 2023-11-27 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 276e39cc37316..4e379a7d611ee 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.devdocs.json b/api_docs/dataset_quality.devdocs.json index d1a6ce1df8d6d..86ad32dd897cc 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -5,7 +5,20 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "datasetQuality", + "id": "def-public.datasetQualityAppTitle", + "type": "string", + "tags": [], + "label": "datasetQualityAppTitle", + "description": [], + "path": "x-pack/plugins/dataset_quality/common/translations.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [], "setup": { "parentPluginId": "datasetQuality", @@ -31,7 +44,22 @@ "path": "x-pack/plugins/dataset_quality/public/types.ts", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "datasetQuality", + "id": "def-public.DatasetQualityPluginStart.DatasetQuality", + "type": "CompoundType", + "tags": [], + "label": "DatasetQuality", + "description": [], + "signature": [ + "React.ComponentClass<{}, any> | React.FunctionComponent<{}>" + ], + "path": "x-pack/plugins/dataset_quality/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], "lifecycle": "start", "initialIsOpen": true } @@ -63,7 +91,129 @@ } ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "datasetQuality", + "id": "def-common.APIClientRequestParamsOf", + "type": "Type", + "tags": [], + "label": "APIClientRequestParamsOf", + "description": [], + "signature": [ + "{ \"GET /internal/dataset_quality/data_streams/stats\": { endpoint: \"GET /internal/dataset_quality/data_streams/stats\"; params?: ", + "TypeC", + "<{ query: ", + "IntersectionC", + "<[", + "PartialC", + "<{ type: ", + "UnionC", + "<[", + "LiteralC", + "<\"logs\">, ", + "LiteralC", + "<\"metrics\">, ", + "LiteralC", + "<\"traces\">, ", + "LiteralC", + "<\"synthetics\">, ", + "LiteralC", + "<\"profiling\">]>; }>, ", + "PartialC", + "<{ datasetQuery: ", + "StringC", + "; }>]>; }> | undefined; handler: ({}: ", + "DatasetQualityRouteHandlerResources", + " & { params: { query: { type?: \"metrics\" | \"synthetics\" | \"profiling\" | \"traces\" | \"logs\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<", + "DataStreamsStatResponse", + ">; } & ", + "DatasetQualityRouteCreateOptions", + "; }[TEndpoint] extends { endpoint: any; params?: infer TRouteParamsRT | undefined; handler: ({}: any) => Promise; } & ", + "ServerRouteCreateOptions", + " ? TRouteParamsRT extends ", + { + "pluginId": "@kbn/server-route-repository", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryPluginApi", + "section": "def-common.RouteParamsRT", + "text": "RouteParamsRT" + }, + " ? ClientRequestParamsOfType : {} : never" + ], + "path": "x-pack/plugins/dataset_quality/common/rest/create_call_dataset_quality_api.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "datasetQuality", + "id": "def-common.APIReturnType", + "type": "Type", + "tags": [], + "label": "APIReturnType", + "description": [], + "signature": [ + "{ \"GET /internal/dataset_quality/data_streams/stats\": { endpoint: \"GET /internal/dataset_quality/data_streams/stats\"; params?: ", + "TypeC", + "<{ query: ", + "IntersectionC", + "<[", + "PartialC", + "<{ type: ", + "UnionC", + "<[", + "LiteralC", + "<\"logs\">, ", + "LiteralC", + "<\"metrics\">, ", + "LiteralC", + "<\"traces\">, ", + "LiteralC", + "<\"synthetics\">, ", + "LiteralC", + "<\"profiling\">]>; }>, ", + "PartialC", + "<{ datasetQuery: ", + "StringC", + "; }>]>; }> | undefined; handler: ({}: ", + "DatasetQualityRouteHandlerResources", + " & { params: { query: { type?: \"metrics\" | \"synthetics\" | \"profiling\" | \"traces\" | \"logs\" | undefined; } & { datasetQuery?: string | undefined; }; }; }) => Promise<", + "DataStreamsStatResponse", + ">; } & ", + "DatasetQualityRouteCreateOptions", + "; }[TEndpoint] extends { endpoint: any; params?: any; handler: ({}: any) => Promise; } & ", + "ServerRouteCreateOptions", + " ? TReturnType : never" + ], + "path": "x-pack/plugins/dataset_quality/common/rest/create_call_dataset_quality_api.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "datasetQuality", + "id": "def-common.FetchOptions", + "type": "Type", + "tags": [], + "label": "FetchOptions", + "description": [], + "signature": [ + "Omit<", + { + "pluginId": "@kbn/core-http-browser", + "scope": "common", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-common.HttpFetchOptions", + "text": "HttpFetchOptions" + }, + ", \"body\"> & { pathname: string; method?: string | undefined; body?: any; }" + ], + "path": "x-pack/plugins/dataset_quality/common/fetch_options.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 2791eb615437a..a674a78cc2596 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.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 | |-------------------|-----------|------------------------|-----------------| -| 3 | 0 | 3 | 0 | +| 8 | 0 | 8 | 3 | ## Client @@ -31,8 +31,14 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux ### Start +### Consts, variables and types + + ## Common ### Interfaces +### Consts, variables and types + + diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index a89f7618fd20c..2a8359bcba49e 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -27,9 +27,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | stackAlerts, graph, infra, inputControlVis, securitySolution, savedObjects | - | | | dashboard, dataVisualizer, stackAlerts, expressionPartitionVis | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | +| | triggersActionsUi | - | +| | inspector, data, savedObjects, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, controls, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, advancedSettings, exploratoryView, fleet, telemetry, maps, banners, reporting, timelines, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, monitoring, securitySolution, synthetics, uptime, cloudLinks, console, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | +| | @kbn/core, visualizations, triggersActionsUi, advancedSettings | - | | | observability, @kbn/securitysolution-data-table, securitySolution | - | | | monitoring | - | -| | inspector, data, savedObjects, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, visualizations, controls, dashboard, licensing, savedObjectsTagging, dataViewFieldEditor, lens, security, triggersActionsUi, cases, observabilityShared, advancedSettings, exploratoryView, fleet, telemetry, maps, banners, reporting, timelines, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, monitoring, securitySolution, synthetics, uptime, cloudLinks, console, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | | | alerting, discover, securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | @@ -122,7 +124,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | canvas | - | | | canvas | - | | | spaces, savedObjectsManagement | - | -| | @kbn/core, visualizations, triggersActionsUi, advancedSettings | - | | | reporting | - | | | @kbn/reporting-export-types-pdf, reporting | - | | | @kbn/core-elasticsearch-server-internal, @kbn/core-plugins-server-internal, observabilityOnboarding, console | - | @@ -164,6 +165,8 @@ Safe to remove. | Deprecated API | Plugin Id | | ---------------|------------| | | alerting | +| | alerting | +| | alerting | | | data | | | data | | | data | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 93ec1d6ddeb59..ab5c0b0fabbcb 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1488,6 +1488,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [tooltip_content.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/tooltip_content.tsx#:~:text=MaintenanceWindow), [tooltip_content.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/tooltip_content.tsx#:~:text=MaintenanceWindow), [cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx#:~:text=MaintenanceWindow), [cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx#:~:text=MaintenanceWindow), [cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx#:~:text=MaintenanceWindow), [cell.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/maintenance_windows/cell.tsx#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow), [bulk_get_maintenance_windows.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/apis/bulk_get_maintenance_windows.ts#:~:text=MaintenanceWindow)+ 11 more | - | | | [use_bulk_edit_response.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_bulk_edit_response.tsx#:~:text=toMountPoint), [use_bulk_edit_response.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_bulk_edit_response.tsx#:~:text=toMountPoint), [use_bulk_edit_response.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_bulk_edit_response.tsx#:~:text=toMountPoint), [use_bulk_operation_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_bulk_operation_toast.tsx#:~:text=toMountPoint), [use_bulk_operation_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_bulk_operation_toast.tsx#:~:text=toMountPoint), [use_bulk_operation_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_bulk_operation_toast.tsx#:~:text=toMountPoint), [rule_add.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx#:~:text=toMountPoint), [rule_add.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx#:~:text=toMountPoint), [rule_edit.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx#:~:text=toMountPoint), [rule_edit.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_edit.tsx#:~:text=toMountPoint)+ 6 more | - | | | [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/app.tsx#:~:text=KibanaThemeProvider), [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/app.tsx#:~:text=KibanaThemeProvider), [app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/app.tsx#:~:text=KibanaThemeProvider), [connectors_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/connectors_app.tsx#:~:text=KibanaThemeProvider), [connectors_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/connectors_app.tsx#:~:text=KibanaThemeProvider), [connectors_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/connectors_app.tsx#:~:text=KibanaThemeProvider), [test_utils.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/test_utils.tsx#:~:text=KibanaThemeProvider), [test_utils.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/test_utils.tsx#:~:text=KibanaThemeProvider), [test_utils.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/test_utils.tsx#:~:text=KibanaThemeProvider) | - | | | [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute), [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute), [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute), [rule_reducer.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_reducer.ts#:~:text=SavedObjectAttribute) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 90dde6624eb22..b12acd1a4ec18 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 6f5d7e3396c4a..853d9f2547e22 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-11-16 +date: 2023-11-27 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 71b2e1cea2a01..1a4c534c5d803 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.devdocs.json b/api_docs/discover_enhanced.devdocs.json index 2a08df38909fa..f0194c72301a8 100644 --- a/api_docs/discover_enhanced.devdocs.json +++ b/api_docs/discover_enhanced.devdocs.json @@ -639,15 +639,15 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -663,15 +663,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; }" + ") => void; }" ], "path": "x-pack/plugins/discover_enhanced/public/plugin.ts", "deprecated": false, @@ -760,15 +760,17 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly getTrigger: (triggerId: string) => ", + "TriggerContract", + "; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -784,17 +786,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; readonly getTrigger: (triggerId: string) => ", - "TriggerContract", - "; readonly hasAction: (actionId: string) => boolean; readonly getAction: (id: string) => ", + ") => void; readonly getAction: (id: string) => ", { "pluginId": "uiActions", "scope": "public", diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 9df5fae9e631f..696c8660dbf5b 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-11-16 +date: 2023-11-27 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 fbb6be3ad8e26..4fefcb3b2c16b 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-11-16 +date: 2023-11-27 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 dd27d3fabe5a6..7b8440900fb10 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index b898e64c67d24..426bbd6909c68 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -7675,15 +7675,15 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -7699,15 +7699,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; }" + ") => void; }" ], "path": "src/plugins/embeddable/public/plugin.tsx", "deprecated": false, @@ -7735,15 +7735,17 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly getTrigger: (triggerId: string) => ", + "TriggerContract", + "; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -7759,17 +7761,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; readonly getTrigger: (triggerId: string) => ", - "TriggerContract", - "; readonly hasAction: (actionId: string) => boolean; readonly getAction: (id: string) => ", + ") => void; readonly getAction: (id: string) => ", { "pluginId": "uiActions", "scope": "public", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index bfad9f63f4827..b4080118f2eb9 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-11-16 +date: 2023-11-27 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 b0a5975752c71..35b9f9bd825e3 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-11-16 +date: 2023-11-27 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 69551457934c1..f45196630b9fa 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-11-16 +date: 2023-11-27 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 d5d1d961a6c1d..c8fd1dc1e7607 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-11-16 +date: 2023-11-27 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 6a1598ef21c82..b22d8267fba22 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-11-16 +date: 2023-11-27 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 c8c74aa4937ac..20050fd23c1b3 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-11-16 +date: 2023-11-27 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 f5b2d014ce508..fe5e20213bb16 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-11-16 +date: 2023-11-27 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 4209dbd4c24be..0bf739bda4842 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-11-16 +date: 2023-11-27 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 8f195a5c24201..9a5d0457f7d04 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-11-16 +date: 2023-11-27 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 39711a5340556..d1f88e781ee6e 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-11-16 +date: 2023-11-27 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 b4436f848d99d..d10c9d59893c7 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-11-16 +date: 2023-11-27 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 ff81db920e838..563fc6e02849c 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-11-16 +date: 2023-11-27 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 84b62bccb1a44..45d26f6f71e99 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-11-16 +date: 2023-11-27 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 490307858c686..232fae505126e 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-11-16 +date: 2023-11-27 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 03703f1840aa1..1ffa2b80760dc 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-11-16 +date: 2023-11-27 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 05fa7dd8d18ef..10f8b604648c8 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-11-16 +date: 2023-11-27 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 fc41ff6fb20d9..b2d950c1cbbb4 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-11-16 +date: 2023-11-27 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 b0dcd2bb7eb3a..38428d4b10a7e 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-11-16 +date: 2023-11-27 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 3287beca87e47..bfa49b6cb0b89 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-11-16 +date: 2023-11-27 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 46bbdf399e6c8..e9981ec0a962b 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-11-16 +date: 2023-11-27 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 5a302e8a3727a..c981ba192e680 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-11-16 +date: 2023-11-27 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 776e9939050e4..3ce13d6012637 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.devdocs.json b/api_docs/expressions.devdocs.json index b22b81fce29c4..6c9f54399a958 100644 --- a/api_docs/expressions.devdocs.json +++ b/api_docs/expressions.devdocs.json @@ -3802,7 +3802,7 @@ "id": "def-public.ExpressionRenderHandler.Unnamed.$2", "type": "Object", "tags": [], - "label": "{\n onRenderError,\n renderMode,\n syncColors,\n syncTooltips,\n syncCursor,\n interactive,\n hasCompatibleActions = async () => false,\n getCompatibleCellValueActions = async () => [],\n executionContext,\n shouldShowLegendAction,\n }", + "label": "{\n onRenderError,\n renderMode,\n syncColors,\n syncTooltips,\n syncCursor,\n interactive,\n hasCompatibleActions = async () => false,\n getCompatibleCellValueActions = async () => [],\n executionContext,\n }", "description": [], "signature": [ "ExpressionRenderHandlerParams" @@ -7350,38 +7350,6 @@ } ], "returnComment": [] - }, - { - "parentPluginId": "expressions", - "id": "def-public.ExecutionContext.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/common/execution/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-public.ExecutionContext.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/common/execution/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -11012,38 +10980,6 @@ "path": "src/plugins/expressions/public/types/index.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "expressions", - "id": "def-public.IExpressionLoaderParams.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/public/types/index.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-public.IExpressionLoaderParams.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/public/types/index.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -11426,38 +11362,6 @@ "trackAdoption": false, "children": [], "returnComment": [] - }, - { - "parentPluginId": "expressions", - "id": "def-public.IInterpreterRenderHandlers.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/common/expression_renderers/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-public.IInterpreterRenderHandlers.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/common/expression_renderers/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -11801,38 +11705,6 @@ "path": "src/plugins/expressions/public/react_expression_renderer/react_expression_renderer.tsx", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "expressions", - "id": "def-public.ReactExpressionRendererProps.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/public/react_expression_renderer/react_expression_renderer.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-public.ReactExpressionRendererProps.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/public/react_expression_renderer/react_expression_renderer.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -18885,38 +18757,6 @@ } ], "returnComment": [] - }, - { - "parentPluginId": "expressions", - "id": "def-server.ExecutionContext.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/common/execution/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-server.ExecutionContext.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/common/execution/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -21566,38 +21406,6 @@ "trackAdoption": false, "children": [], "returnComment": [] - }, - { - "parentPluginId": "expressions", - "id": "def-server.IInterpreterRenderHandlers.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/common/expression_renderers/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-server.IInterpreterRenderHandlers.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/common/expression_renderers/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -31016,38 +30824,6 @@ } ], "returnComment": [] - }, - { - "parentPluginId": "expressions", - "id": "def-common.ExecutionContext.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/common/execution/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-common.ExecutionContext.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/common/execution/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -35922,38 +35698,6 @@ "trackAdoption": false, "children": [], "returnComment": [] - }, - { - "parentPluginId": "expressions", - "id": "def-common.IInterpreterRenderHandlers.shouldShowLegendAction", - "type": "Function", - "tags": [], - "label": "shouldShowLegendAction", - "description": [], - "signature": [ - "((actionId: string) => boolean) | undefined" - ], - "path": "src/plugins/expressions/common/expression_renderers/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "expressions", - "id": "def-common.IInterpreterRenderHandlers.shouldShowLegendAction.$1", - "type": "string", - "tags": [], - "label": "actionId", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/expressions/common/expression_renderers/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 0a5f31956155a..eea81fe45852a 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.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 | |-------------------|-----------|------------------------|-----------------| -| 2224 | 17 | 1765 | 5 | +| 2208 | 17 | 1749 | 5 | ## Client diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 3d43ce341fbc7..3a326f4eb73c1 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-11-16 +date: 2023-11-27 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 8d3ee144d054e..85ad4da1539ec 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-11-16 +date: 2023-11-27 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 97d7ebfb2f5b3..6bf50fc358aca 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-11-16 +date: 2023-11-27 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 f2663b244e344..78895c44ec166 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-11-16 +date: 2023-11-27 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 db553dcf2263a..748a56e2297ab 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-11-16 +date: 2023-11-27 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 98c3b0c71954c..d65c36e26e381 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-11-16 +date: 2023-11-27 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 9bbc2d194bf10..8ad168e34270f 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-11-16 +date: 2023-11-27 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 4daaac8bc9109..ce79990460941 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.devdocs.json b/api_docs/home.devdocs.json index 4de7593782f6b..964cceb399baa 100644 --- a/api_docs/home.devdocs.json +++ b/api_docs/home.devdocs.json @@ -1766,6 +1766,26 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "home", + "id": "def-server.TutorialContext.staticAssets", + "type": "Object", + "tags": [], + "label": "staticAssets", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.IStaticAssets", + "text": "IStaticAssets" + } + ], + "path": "src/plugins/home/server/services/tutorials/lib/tutorials_registry_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "home", "id": "def-server.TutorialContext.Unnamed", @@ -1911,7 +1931,9 @@ "label": "SampleDatasetProvider", "description": [], "signature": [ - "() => ", + "(context: ", + "SampleDatasetProviderContext", + ") => ", { "pluginId": "@kbn/utility-types", "scope": "common", @@ -1925,7 +1947,22 @@ "deprecated": false, "trackAdoption": false, "returnComment": [], - "children": [], + "children": [ + { + "parentPluginId": "home", + "id": "def-server.SampleDatasetProvider.$1", + "type": "Object", + "tags": [], + "label": "context", + "description": [], + "signature": [ + "SampleDatasetProviderContext" + ], + "path": "src/plugins/home/server/services/sample_data/lib/sample_dataset_registry_types.ts", + "deprecated": false, + "trackAdoption": false + } + ], "initialIsOpen": false }, { diff --git a/api_docs/home.mdx b/api_docs/home.mdx index f015c61e918cf..92b55ad21bc9b 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 149 | 0 | 109 | 0 | +| 151 | 0 | 111 | 1 | ## Client diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 8b37c7c3f558a..c928583a22919 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-11-16 +date: 2023-11-27 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 d728f1d5e1647..ec776a6d62a5c 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-11-16 +date: 2023-11-27 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 d99952c4838c8..611a638958fe3 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-11-16 +date: 2023-11-27 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 19401203c7f51..37023530f2a11 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 0cc16e89bd7d4..df3d703fd9d85 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-11-16 +date: 2023-11-27 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 63d7438c8904d..d971d928917d1 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-11-16 +date: 2023-11-27 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 189b6610ee659..c9d0a05702cb9 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index aabb76d630a7b..528f1303d21c2 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.devdocs.json b/api_docs/kbn_aiops_utils.devdocs.json index 4ab34fcaf1db4..b733fd1318ca7 100644 --- a/api_docs/kbn_aiops_utils.devdocs.json +++ b/api_docs/kbn_aiops_utils.devdocs.json @@ -336,12 +336,10 @@ "parentPluginId": "@kbn/aiops-utils", "id": "def-common.WindowParameters.baselineMin", "type": "number", - "tags": [ - "type" - ], + "tags": [], "label": "baselineMin", "description": [ - "\nBaseline minimum value" + "Baseline minimum value" ], "path": "x-pack/packages/ml/aiops_utils/window_parameters.ts", "deprecated": false, @@ -351,12 +349,10 @@ "parentPluginId": "@kbn/aiops-utils", "id": "def-common.WindowParameters.baselineMax", "type": "number", - "tags": [ - "type" - ], + "tags": [], "label": "baselineMax", "description": [ - "\nBaseline maximum value" + "Baseline maximum value" ], "path": "x-pack/packages/ml/aiops_utils/window_parameters.ts", "deprecated": false, @@ -366,12 +362,10 @@ "parentPluginId": "@kbn/aiops-utils", "id": "def-common.WindowParameters.deviationMin", "type": "number", - "tags": [ - "type" - ], + "tags": [], "label": "deviationMin", "description": [ - "\nDeviation minimum value" + "Deviation minimum value" ], "path": "x-pack/packages/ml/aiops_utils/window_parameters.ts", "deprecated": false, @@ -381,12 +375,10 @@ "parentPluginId": "@kbn/aiops-utils", "id": "def-common.WindowParameters.deviationMax", "type": "number", - "tags": [ - "type" - ], + "tags": [], "label": "deviationMax", "description": [ - "\nDeviation maximum value" + "Deviation maximum value" ], "path": "x-pack/packages/ml/aiops_utils/window_parameters.ts", "deprecated": false, diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 23e0ca70b44cf..f45a227523130 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 76f8c964865d5..b6e93757c6b34 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-11-16 +date: 2023-11-27 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 c5357a0678468..5fa02845e48a7 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 14d1758ac4e23..b79c113c8204f 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 fe156ca3268c5..66ee126b1aaa3 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-11-16 +date: 2023-11-27 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 41da2e03a3d14..9b8e645857f9f 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.devdocs.json b/api_docs/kbn_analytics_client.devdocs.json index 49f322df02d0f..08766a1c077db 100644 --- a/api_docs/kbn_analytics_client.devdocs.json +++ b/api_docs/kbn_analytics_client.devdocs.json @@ -718,14 +718,6 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/services/analytics/analytics_service.ts" }, - { - "plugin": "@kbn/subscription-tracking", - "path": "packages/kbn-subscription-tracking/src/use_go_to_subscription.ts" - }, - { - "plugin": "@kbn/subscription-tracking", - "path": "packages/kbn-subscription-tracking/src/use_impression.ts" - }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/services/telemetry/fleet_usage_sender.ts" @@ -1360,6 +1352,10 @@ "deprecated": false, "trackAdoption": true, "references": [ + { + "plugin": "@kbn/core-execution-context-browser-internal", + "path": "packages/core/execution-context/core-execution-context-browser-internal/src/execution_context_service.ts" + }, { "plugin": "@kbn/core-application-browser-internal", "path": "packages/core/application/core-application-browser-internal/src/register_analytics_context_provider.ts" @@ -1392,10 +1388,6 @@ "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/analytics_service.ts" }, - { - "plugin": "@kbn/core-execution-context-browser-internal", - "path": "packages/core/execution-context/core-execution-context-browser-internal/src/execution_context_service.ts" - }, { "plugin": "@kbn/core-chrome-browser-internal", "path": "packages/core/chrome/core-chrome-browser-internal/src/register_analytics_context_provider.ts" diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 05b22ea25bd41..5b8af2726d88c 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-11-16 +date: 2023-11-27 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 f1cf88e92bbaa..eab9eca71d379 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 409d8363c8987..03cffafba4a2b 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 92ee042360f6f..659b783fc5f3a 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-11-16 +date: 2023-11-27 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 609bfbb645caf..60e1c41062ec0 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_analytics_shippers_fullstory.devdocs.json index 7a55836c7d02f..5878e65af7ef1 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.devdocs.json +++ b/api_docs/kbn_analytics_shippers_fullstory.devdocs.json @@ -288,7 +288,7 @@ "tags": [], "label": "shutdown", "description": [ - "\nShuts down the shipper.\nIt doesn't really do anything inside because this shipper doesn't hold any internal queues." + "\nShuts down the shipper." ], "signature": [ "() => void" @@ -350,6 +350,20 @@ "path": "packages/analytics/shippers/fullstory/src/fullstory_shipper.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/analytics-shippers-fullstory", + "id": "def-common.FullStoryShipperConfig.pageVarsDebounceTimeMs", + "type": "number", + "tags": [], + "label": "pageVarsDebounceTimeMs", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/analytics/shippers/fullstory/src/fullstory_shipper.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index c0222701054b5..adb745424930d 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 21 | 0 | 0 | 0 | +| 22 | 0 | 1 | 0 | ## Common diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 73674f838d059..8ff38bbef4178 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index d6f27633bf48b..7ae1be487e79e 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_apm_synthtrace.devdocs.json index 721b44855b3cb..c591fc9fd2533 100644 --- a/api_docs/kbn_apm_synthtrace.devdocs.json +++ b/api_docs/kbn_apm_synthtrace.devdocs.json @@ -430,6 +430,77 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.LogsSynthtraceEsClient", + "type": "Class", + "tags": [], + "label": "LogsSynthtraceEsClient", + "description": [], + "signature": [ + { + "pluginId": "@kbn/apm-synthtrace", + "scope": "server", + "docId": "kibKbnApmSynthtracePluginApi", + "section": "def-server.LogsSynthtraceEsClient", + "text": "LogsSynthtraceEsClient" + }, + " extends ", + "SynthtraceEsClient", + "<", + { + "pluginId": "@kbn/apm-synthtrace-client", + "scope": "common", + "docId": "kibKbnApmSynthtraceClientPluginApi", + "section": "def-common.LogDocument", + "text": "LogDocument" + }, + ">" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.LogsSynthtraceEsClient.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace", + "id": "def-server.LogsSynthtraceEsClient.Unnamed.$1", + "type": "CompoundType", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ client: ", + "default", + "; logger: ", + "Logger", + "; } & ", + "LogsSynthtraceEsClientOptions" + ], + "path": "packages/kbn-apm-synthtrace/src/lib/logs/logs_synthtrace_es_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/apm-synthtrace", "id": "def-server.MonitoringSynthtraceEsClient", diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 8a707c835f0f0..bd4e169262596 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 31 | 0 | 31 | 7 | +| 34 | 0 | 34 | 8 | ## Server diff --git a/api_docs/kbn_apm_synthtrace_client.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index fed87d8205926..4d7c6ca9c465d 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -2542,6 +2542,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.LogDocument", + "type": "Type", + "tags": [], + "label": "LogDocument", + "description": [], + "signature": [ + "{ '@timestamp'?: number | undefined; } & Partial<{ 'input.type': string; 'log.file.path'?: string | undefined; 'service.name'?: string | undefined; 'data_stream.namespace': string; 'data_stream.type': string; 'data_stream.dataset': string; message?: string | undefined; 'event.dataset': string; 'log.level'?: string | undefined; 'host.name'?: string | undefined; 'trace.id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.resource.id'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.instance.id'?: string | undefined; }>" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/apm-synthtrace-client", "id": "def-common.MonitoringDocument", @@ -2866,6 +2881,36 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.log", + "type": "Object", + "tags": [], + "label": "log", + "description": [], + "path": "packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.log.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "() => Log" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/apm-synthtrace-client", "id": "def-common.monitoring", diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 312a88198bc42..77c1ea266b358 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 181 | 0 | 181 | 27 | +| 184 | 0 | 184 | 27 | ## Common diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 7af7f1cef044f..036736bc17e15 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 e89aa154d812f..4fb585f8ebb70 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.devdocs.json b/api_docs/kbn_calculate_auto.devdocs.json new file mode 100644 index 0000000000000..486f642e16b23 --- /dev/null +++ b/api_docs/kbn_calculate_auto.devdocs.json @@ -0,0 +1,168 @@ +{ + "id": "@kbn/calculate-auto", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [ + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto", + "type": "Object", + "tags": [], + "label": "calculateAuto", + "description": [], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.near", + "type": "Function", + "tags": [], + "label": "near", + "description": [], + "signature": [ + "(buckets: number, duration: moment.Duration) => moment.Duration | undefined" + ], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.near.$1", + "type": "number", + "tags": [], + "label": "buckets", + "description": [], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.near.$2", + "type": "Object", + "tags": [], + "label": "duration", + "description": [], + "signature": [ + "moment.Duration" + ], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.lessThan", + "type": "Function", + "tags": [], + "label": "lessThan", + "description": [], + "signature": [ + "(buckets: number, duration: moment.Duration) => moment.Duration | undefined" + ], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.lessThan.$1", + "type": "number", + "tags": [], + "label": "buckets", + "description": [], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.lessThan.$2", + "type": "Object", + "tags": [], + "label": "duration", + "description": [], + "signature": [ + "moment.Duration" + ], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.atLeast", + "type": "Function", + "tags": [], + "label": "atLeast", + "description": [], + "signature": [ + "(buckets: number, duration: moment.Duration) => moment.Duration | undefined" + ], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.atLeast.$1", + "type": "number", + "tags": [], + "label": "buckets", + "description": [], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/calculate-auto", + "id": "def-common.calculateAuto.atLeast.$2", + "type": "Object", + "tags": [], + "label": "duration", + "description": [], + "signature": [ + "moment.Duration" + ], + "path": "packages/kbn-calculate-auto/src/calculate_auto.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx new file mode 100644 index 0000000000000..8e0909592b335 --- /dev/null +++ b/api_docs/kbn_calculate_auto.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnCalculateAutoPluginApi +slug: /kibana-dev-docs/api/kbn-calculate-auto +title: "@kbn/calculate-auto" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/calculate-auto plugin +date: 2023-11-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] +--- +import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; + + + +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 10 | 0 | 10 | 0 | + +## Common + +### Objects + + diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 5f522e29787b4..3bea56c9ca0c6 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.devdocs.json b/api_docs/kbn_cell_actions.devdocs.json index dcc406e62c1d0..ffa6f3f322ab3 100644 --- a/api_docs/kbn_cell_actions.devdocs.json +++ b/api_docs/kbn_cell_actions.devdocs.json @@ -1309,36 +1309,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/cell-actions", - "id": "def-common.COPY_CELL_ACTION_TYPE", - "type": "string", - "tags": [], - "label": "COPY_CELL_ACTION_TYPE", - "description": [], - "signature": [ - "\"cellAction-copy\"" - ], - "path": "packages/kbn-cell-actions/src/constants.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/cell-actions", - "id": "def-common.FILTER_CELL_ACTION_TYPE", - "type": "string", - "tags": [], - "label": "FILTER_CELL_ACTION_TYPE", - "description": [], - "signature": [ - "\"cellAction-filter\"" - ], - "path": "packages/kbn-cell-actions/src/constants.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/cell-actions", "id": "def-common.UseDataGridColumnsCellActions", diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 3fa31abc0ff29..1acab6744b7a8 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-threat-hunting-explore](https://github.com/orgs/elast | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 62 | 1 | 44 | 3 | +| 60 | 1 | 42 | 3 | ## Common diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index 2af9ff7332b85..9a043b9134c7f 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-11-16 +date: 2023-11-27 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 3eeaf3cd311cb..05d682dba70c9 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-11-16 +date: 2023-11-27 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 7462733fc884f..ab8affb9735c5 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-11-16 +date: 2023-11-27 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 3de480ed21955..abe3c18176b20 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-11-16 +date: 2023-11-27 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 04e7240b39f84..3f1d9c1657136 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-11-16 +date: 2023-11-27 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 106c7c3e03f4c..1cd1a633b6ba1 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-11-16 +date: 2023-11-27 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 4acc329f7b742..3c18329d587f0 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index b278289fb313a..89d1810298464 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-11-16 +date: 2023-11-27 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 8a9bde089c70e..8a6a9cba88e89 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.devdocs.json b/api_docs/kbn_config_mocks.devdocs.json index 29e17d6500043..c470bc5513b23 100644 --- a/api_docs/kbn_config_mocks.devdocs.json +++ b/api_docs/kbn_config_mocks.devdocs.json @@ -310,7 +310,7 @@ }, "[]][], [], unknown>; atPath: jest.MockInstance<", "Observable", - ", [path: ", + ", [", { "pluginId": "@kbn/config", "scope": "common", @@ -318,7 +318,7 @@ "section": "def-common.ConfigPath", "text": "ConfigPath" }, - "], unknown>; atPathSync: jest.MockInstance; atPathSync: jest.MockInstance & { staticAssets: ", + "InternalStaticAssets", + "; }" ], "path": "packages/core/apps/core-apps-browser-internal/src/core_app.ts", "deprecated": false, @@ -305,18 +309,22 @@ { "parentPluginId": "@kbn/core-apps-browser-internal", "id": "def-common.CoreAppsServiceStartDeps.http", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "http", "description": [], "signature": [ + "Omit<", { "pluginId": "@kbn/core-http-browser", "scope": "common", "docId": "kibKbnCoreHttpBrowserPluginApi", "section": "def-common.HttpSetup", "text": "HttpSetup" - } + }, + ", \"staticAssets\"> & { staticAssets: ", + "InternalStaticAssets", + "; }" ], "path": "packages/core/apps/core-apps-browser-internal/src/core_app.ts", "deprecated": false, diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index dc71b26849f48..08ab1164fbb41 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 0ee803e0744ea..27000c0530aec 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 eaabeb2aba8e4..645d88b5b266c 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 c3cf9ff8c65f7..f2e5bcbb9783c 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 2025c1859d305..043bd6712088c 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-11-16 +date: 2023-11-27 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 46b5ea9148310..44b033406e0fa 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 c2956651186b5..72f9844b37fa8 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 00dafd0d77c00..092275e875ff9 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 5d371de09c55e..7f9898ae8d722 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-11-16 +date: 2023-11-27 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 f1378e9adc70c..539fc1e40a708 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-11-16 +date: 2023-11-27 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 42b48847c1dc7..8c7eded4cd1ef 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 8db90e89076f4..a06c76609b838 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 8218a43de3ef6..d80d9e534e75b 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 9ee0774c8ef8d..a4bb2394b6f55 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 5f619525c811b..e70f752b475a2 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 8e2b103fd6d0d..2e4c9e7548e2e 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 92a3b393312a1..b40817098f29e 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 98d7ccc849ffe..ab3dcd0b3539e 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-11-16 +date: 2023-11-27 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 6d596de7ccd1b..2948ae6635851 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-11-16 +date: 2023-11-27 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 cd145170012d7..f3fe7fed111b5 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 b3c56d63cce16..4cbd89edcff1d 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 1c85a8bf3ba70..7903db787984f 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_core_deprecations_browser_internal.devdocs.json index 57e6318b3165c..0e0e8b0e1498c 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.devdocs.json +++ b/api_docs/kbn_core_deprecations_browser_internal.devdocs.json @@ -75,11 +75,11 @@ "signature": [ "({ http }: { http: ", { - "pluginId": "@kbn/core-http-browser", + "pluginId": "@kbn/core-http-browser-internal", "scope": "common", - "docId": "kibKbnCoreHttpBrowserPluginApi", - "section": "def-common.HttpSetup", - "text": "HttpSetup" + "docId": "kibKbnCoreHttpBrowserInternalPluginApi", + "section": "def-common.InternalHttpStart", + "text": "InternalHttpStart" }, "; }) => ", { @@ -108,18 +108,22 @@ { "parentPluginId": "@kbn/core-deprecations-browser-internal", "id": "def-common.DeprecationsService.start.$1.http", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "http", "description": [], "signature": [ + "Omit<", { "pluginId": "@kbn/core-http-browser", "scope": "common", "docId": "kibKbnCoreHttpBrowserPluginApi", "section": "def-common.HttpSetup", "text": "HttpSetup" - } + }, + ", \"staticAssets\"> & { staticAssets: ", + "InternalStaticAssets", + "; }" ], "path": "packages/core/deprecations/core-deprecations-browser-internal/src/deprecations_service.ts", "deprecated": false, diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index bb1e47e819956..9c05537e96943 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 5b7ed830d6a54..68a8c01331a30 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 1516f640f69d7..df2b8bb03c2f9 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-11-16 +date: 2023-11-27 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 939aa1d4781ef..e82cea70ace49 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-11-16 +date: 2023-11-27 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 b8ec0277deff1..0bb01ada307c4 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 0d897a649adc0..385563dc26f24 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 bdaaf1d44fccb..9ad1327832319 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 cdd5e7c326e8a..8587c910cf5c8 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 a2fb261fc8f01..67c47cad52b17 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-11-16 +date: 2023-11-27 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 729b38e60a5c3..e6f93f603fd48 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 ad7f55b1e5bfd..14587b357f069 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 14c49dcb61f0d..150b9cd6c525e 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 7ba8917104613..209cb6ac4337c 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-11-16 +date: 2023-11-27 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 cb8834354b9e6..b727705e0ea34 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 8e11f3f668e01..d43d583970e96 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 fd28961e92c33..dfa3d87d33dc1 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 53dbc7f736451..7624bdf5cd5ba 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 0f90f7b33c80b..315af705097ae 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 7b896d7816398..c81fe00accb6f 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 825f0f87bd7eb..44a4d7c9d151d 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 6e813d506614d..5948a7dbdfbe1 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-11-16 +date: 2023-11-27 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 4645c255a61ed..dc81e1c023db6 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-11-16 +date: 2023-11-27 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 8d717516e1ee8..e102c4a94e0ff 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 4cc7ac4de5ed0..d3ab8e3208022 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 2b7657a91f4b1..1c79dca6e892f 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 03cd6e56b12a8..b82f7e5e5e3e8 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_core_http_browser.devdocs.json index 5c9408cb33437..dbd5f96eea8c6 100644 --- a/api_docs/kbn_core_http_browser.devdocs.json +++ b/api_docs/kbn_core_http_browser.devdocs.json @@ -1340,6 +1340,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-browser", + "id": "def-common.HttpSetup.staticAssets", + "type": "Object", + "tags": [], + "label": "staticAssets", + "description": [ + "\nAPIs for creating hrefs to static assets.\nSee {@link IStaticAssets}" + ], + "signature": [ + { + "pluginId": "@kbn/core-http-browser", + "scope": "common", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-common.IStaticAssets", + "text": "IStaticAssets" + } + ], + "path": "packages/core/http/core-http-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-browser", "id": "def-common.HttpSetup.anonymousPaths", @@ -1868,6 +1890,19 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-browser", + "id": "def-common.IBasePath.assetsHrefBase", + "type": "string", + "tags": [], + "label": "assetsHrefBase", + "description": [ + "\nHref (hypertext reference) intended to be used as the base for constructing\nother hrefs to static assets." + ], + "path": "packages/core/http/core-http-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-browser", "id": "def-common.IBasePath.publicBaseUrl", @@ -2153,6 +2188,56 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-browser", + "id": "def-common.IStaticAssets", + "type": "Interface", + "tags": [], + "label": "IStaticAssets", + "description": [ + "\nAPIs for creating hrefs to static assets.\n" + ], + "path": "packages/core/http/core-http-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-browser", + "id": "def-common.IStaticAssets.getPluginAssetHref", + "type": "Function", + "tags": [], + "label": "getPluginAssetHref", + "description": [ + "\nGets the full href to the current plugin's asset,\ngiven its path relative to the plugin's `public/assets` folder.\n" + ], + "signature": [ + "(assetPath: string) => string" + ], + "path": "packages/core/http/core-http-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-browser", + "id": "def-common.IStaticAssets.getPluginAssetHref.$1", + "type": "string", + "tags": [], + "label": "assetPath", + "description": [], + "signature": [ + "string" + ], + "path": "packages/core/http/core-http-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-browser", "id": "def-common.ResponseErrorBody", diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index c6a24b6621717..baed95ac07630 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 111 | 4 | 36 | 0 | +| 116 | 4 | 37 | 0 | ## Common diff --git a/api_docs/kbn_core_http_browser_internal.devdocs.json b/api_docs/kbn_core_http_browser_internal.devdocs.json index 1bc1f355c68f9..1d5f1e532d6c0 100644 --- a/api_docs/kbn_core_http_browser_internal.devdocs.json +++ b/api_docs/kbn_core_http_browser_internal.devdocs.json @@ -46,6 +46,42 @@ "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.BasePath.serverBasePath", + "type": "string", + "tags": [], + "label": "serverBasePath", + "description": [], + "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.BasePath.assetsHrefBase", + "type": "string", + "tags": [], + "label": "assetsHrefBase", + "description": [], + "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.BasePath.publicBaseUrl", + "type": "string", + "tags": [], + "label": "publicBaseUrl", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-browser-internal", "id": "def-common.BasePath.Unnamed", @@ -63,47 +99,68 @@ { "parentPluginId": "@kbn/core-http-browser-internal", "id": "def-common.BasePath.Unnamed.$1", - "type": "string", - "tags": [], - "label": "basePath", - "description": [], - "signature": [ - "string" - ], - "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/core-http-browser-internal", - "id": "def-common.BasePath.Unnamed.$2", - "type": "string", + "type": "Object", "tags": [], - "label": "serverBasePath", + "label": "{\n basePath,\n serverBasePath,\n assetsHrefBase,\n publicBaseUrl,\n }", "description": [], - "signature": [ - "string" - ], "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/core-http-browser-internal", - "id": "def-common.BasePath.Unnamed.$3", - "type": "string", - "tags": [], - "label": "publicBaseUrl", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false + "children": [ + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.BasePath.Unnamed.$1.basePath", + "type": "string", + "tags": [], + "label": "basePath", + "description": [], + "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.BasePath.Unnamed.$1.serverBasePath", + "type": "string", + "tags": [], + "label": "serverBasePath", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.BasePath.Unnamed.$1.assetsHrefBase", + "type": "string", + "tags": [], + "label": "assetsHrefBase", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.BasePath.Unnamed.$1.publicBaseUrl", + "type": "string", + "tags": [], + "label": "publicBaseUrl", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-browser-internal/src/base_path.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "returnComment": [] @@ -195,7 +252,58 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.InternalHttpSetup", + "type": "Type", + "tags": [], + "label": "InternalHttpSetup", + "description": [], + "signature": [ + "Omit<", + { + "pluginId": "@kbn/core-http-browser", + "scope": "common", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-common.HttpSetup", + "text": "HttpSetup" + }, + ", \"staticAssets\"> & { staticAssets: ", + "InternalStaticAssets", + "; }" + ], + "path": "packages/core/http/core-http-browser-internal/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-http-browser-internal", + "id": "def-common.InternalHttpStart", + "type": "Type", + "tags": [], + "label": "InternalHttpStart", + "description": [], + "signature": [ + "Omit<", + { + "pluginId": "@kbn/core-http-browser", + "scope": "common", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-common.HttpSetup", + "text": "HttpSetup" + }, + ", \"staticAssets\"> & { staticAssets: ", + "InternalStaticAssets", + "; }" + ], + "path": "packages/core/http/core-http-browser-internal/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 09c5e377e2b70..4b15996de0351 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; @@ -21,10 +21,13 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 10 | 0 | 10 | 1 | +| 17 | 0 | 17 | 2 | ## Common ### Classes +### Consts, variables and types + + diff --git a/api_docs/kbn_core_http_browser_mocks.devdocs.json b/api_docs/kbn_core_http_browser_mocks.devdocs.json index 39526d744321e..9829c4677a1bd 100644 --- a/api_docs/kbn_core_http_browser_mocks.devdocs.json +++ b/api_docs/kbn_core_http_browser_mocks.devdocs.json @@ -140,6 +140,14 @@ "section": "def-common.IBasePath", "text": "IBasePath" }, + "; staticAssets: ", + { + "pluginId": "@kbn/core-http-browser", + "scope": "common", + "docId": "kibKbnCoreHttpBrowserPluginApi", + "section": "def-common.IStaticAssets", + "text": "IStaticAssets" + }, "; anonymousPaths: ", { "pluginId": "@kbn/core-http-browser", @@ -401,7 +409,7 @@ "label": "createBasePath", "description": [], "signature": [ - "({ publicBaseUrl, serverBasePath, }?: { publicBaseUrl?: string | undefined; serverBasePath?: string | undefined; }) => jest.Mocked<", + "({ publicBaseUrl, serverBasePath, assetsHrefBase, }?: { publicBaseUrl?: string | undefined; serverBasePath?: string | undefined; assetsHrefBase?: string | undefined; }) => jest.Mocked<", { "pluginId": "@kbn/core-http-browser", "scope": "common", @@ -424,7 +432,7 @@ "label": "__0", "description": [], "signature": [ - "{ publicBaseUrl?: string | undefined; serverBasePath?: string | undefined; }" + "{ publicBaseUrl?: string | undefined; serverBasePath?: string | undefined; assetsHrefBase?: string | undefined; }" ], "path": "packages/core/http/core-http-browser-mocks/src/base_path.mock.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 96a2ad090c401..8c0cf29f2d731 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 8d8a41aa64a53..86daca76fc382 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-11-16 +date: 2023-11-27 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 c35ce23823fec..0975937db3306 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 4e8df44698906..3bf602bd3615f 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-11-16 +date: 2023-11-27 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 d47c318a07078..da990c02fd7d1 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-11-16 +date: 2023-11-27 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 6ab812b7ed9ab..df9af692211d8 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 2d55704c31c03..9b1677d697292 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 d5848e3bb43bd..8a8894b644b40 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 49d307af713ed..4ed29d5e8e4b3 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index de83f68911548..e098888f5a035 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -1829,6 +1829,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.HttpServiceSetup.staticAssets", + "type": "Object", + "tags": [], + "label": "staticAssets", + "description": [ + "\nAPIs for creating hrefs to static assets.\nSee {@link IStaticAssets}" + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.IStaticAssets", + "text": "IStaticAssets" + } + ], + "path": "packages/core/http/core-http-server/src/http_contract.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-common.HttpServiceSetup.csp", @@ -2009,6 +2031,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.HttpServiceStart.staticAssets", + "type": "Object", + "tags": [], + "label": "staticAssets", + "description": [ + "\nAPIs for creating hrefs to static assets.\nSee {@link IStaticAssets}" + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.IStaticAssets", + "text": "IStaticAssets" + } + ], + "path": "packages/core/http/core-http-server/src/http_contract.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-common.HttpServiceStart.auth", @@ -3688,6 +3732,10 @@ "plugin": "assetManager", "path": "x-pack/plugins/asset_manager/server/routes/assets/containers.ts" }, + { + "plugin": "assetManager", + "path": "x-pack/plugins/asset_manager/server/routes/assets/pods.ts" + }, { "plugin": "banners", "path": "x-pack/plugins/banners/server/routes/info.ts" @@ -5806,6 +5854,10 @@ "plugin": "@kbn/core-ui-settings-server-internal", "path": "packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/set.ts" }, + { + "plugin": "@kbn/core-ui-settings-server-internal", + "path": "packages/core/ui-settings/core-ui-settings-server-internal/src/routes/internal/validate.ts" + }, { "plugin": "@kbn/core-capabilities-server-internal", "path": "packages/core/capabilities/core-capabilities-server-internal/src/routes/resolve_capabilities.ts" @@ -9639,6 +9691,56 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.IStaticAssets", + "type": "Interface", + "tags": [], + "label": "IStaticAssets", + "description": [ + "\nAPIs for creating hrefs to static assets.\n" + ], + "path": "packages/core/http/core-http-server/src/static_assets.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.IStaticAssets.getPluginAssetHref", + "type": "Function", + "tags": [], + "label": "getPluginAssetHref", + "description": [ + "\nGets the full href to the current plugin's asset,\ngiven its path relative to the plugin's `public/assets` folder.\n" + ], + "signature": [ + "(assetPath: string) => string" + ], + "path": "packages/core/http/core-http-server/src/static_assets.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.IStaticAssets.getPluginAssetHref.$1", + "type": "string", + "tags": [], + "label": "assetPath", + "description": [], + "signature": [ + "string" + ], + "path": "packages/core/http/core-http-server/src/static_assets.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-common.KibanaErrorResponseFactory", @@ -13621,27 +13723,27 @@ }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms_audit_messages.ts" + "path": "x-pack/plugins/transform/server/routes/api/audit_messages/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms_nodes.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_nodes/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_all/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_single/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_stats_all/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_stats_single/register_route.ts" }, { "plugin": "uptime", @@ -14016,7 +14118,7 @@ }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_create/register_route.ts" }, { "plugin": "uptime", @@ -14871,39 +14973,39 @@ }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/field_histograms.ts" + "path": "x-pack/plugins/transform/server/routes/api/field_histograms/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_update/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/reauthorize_transforms/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/reset_transforms/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/transforms_preview/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/start_transforms/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/stop_transforms/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/delete_transforms/register_route.ts" }, { "plugin": "transform", - "path": "x-pack/plugins/transform/server/routes/api/transforms.ts" + "path": "x-pack/plugins/transform/server/routes/api/schedule_now_transforms/register_route.ts" }, { "plugin": "controls", diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 69ec0d058df74..e80f74758bc7a 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 449 | 1 | 178 | 0 | +| 454 | 1 | 179 | 0 | ## Common diff --git a/api_docs/kbn_core_http_server_internal.devdocs.json b/api_docs/kbn_core_http_server_internal.devdocs.json index 73de455f5bffe..777bf0f988ab2 100644 --- a/api_docs/kbn_core_http_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_server_internal.devdocs.json @@ -693,17 +693,9 @@ "label": "setup", "description": [], "signature": [ - "(config: ", - { - "pluginId": "@kbn/core-http-server-internal", - "scope": "common", - "docId": "kibKbnCoreHttpServerInternalPluginApi", - "section": "def-common.HttpConfig", - "text": "HttpConfig" - }, - ", executionContext?: ", - "IExecutionContext", - " | undefined) => Promise<", + "({ config$, executionContext, }: ", + "HttpServerSetupOptions", + ") => Promise<", "HttpServerSetup", ">" ], @@ -716,37 +708,15 @@ "id": "def-common.HttpServer.setup.$1", "type": "Object", "tags": [], - "label": "config", + "label": "{\n config$,\n executionContext,\n }", "description": [], "signature": [ - { - "pluginId": "@kbn/core-http-server-internal", - "scope": "common", - "docId": "kibKbnCoreHttpServerInternalPluginApi", - "section": "def-common.HttpConfig", - "text": "HttpConfig" - } + "HttpServerSetupOptions" ], "path": "packages/core/http/core-http-server-internal/src/http_server.ts", "deprecated": false, "trackAdoption": false, "isRequired": true - }, - { - "parentPluginId": "@kbn/core-http-server-internal", - "id": "def-common.HttpServer.setup.$2", - "type": "Object", - "tags": [], - "label": "executionContext", - "description": [], - "signature": [ - "IExecutionContext", - " | undefined" - ], - "path": "packages/core/http/core-http-server-internal/src/http_server.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false } ], "returnComment": [] diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index c73351b576d2d..4e6d6c8ea2cd3 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 59 | 0 | 53 | 7 | +| 58 | 0 | 52 | 9 | ## Common diff --git a/api_docs/kbn_core_http_server_mocks.devdocs.json b/api_docs/kbn_core_http_server_mocks.devdocs.json index 2c0ed686470bf..7451177dbb1bb 100644 --- a/api_docs/kbn_core_http_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_server_mocks.devdocs.json @@ -252,6 +252,14 @@ "section": "def-common.ICspConfig", "text": "ICspConfig" }, + "; staticAssets: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.IStaticAssets", + "text": "IStaticAssets" + }, "; registerRouteHandlerContext: jest.MockInstance<", { "pluginId": "@kbn/core-http-server", @@ -340,7 +348,7 @@ "section": "def-common.HttpServiceSetup", "text": "HttpServiceSetup" }, - ", \"createRouter\" | \"basePath\"> & { basePath: BasePathMocked; createRouter: jest.MockedFunction<() => ", + ", \"createRouter\" | \"basePath\"> & { basePath: BasePathMocked; staticAssets: StaticAssetsMocked; createRouter: jest.MockedFunction<() => ", { "pluginId": "@kbn/core-http-router-server-mocks", "scope": "common", @@ -371,6 +379,14 @@ "section": "def-common.IBasePath", "text": "IBasePath" }, + "; staticAssets: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.IStaticAssets", + "text": "IStaticAssets" + }, "; auth: ", { "pluginId": "@kbn/core-http-server", @@ -395,7 +411,7 @@ "section": "def-common.HttpServiceStart", "text": "HttpServiceStart" }, - " & { basePath: BasePathMocked; }" + " & { basePath: BasePathMocked; staticAssets: StaticAssetsMocked; }" ], "path": "packages/core/http/core-http-server-mocks/src/http_service.mock.ts", "deprecated": false, @@ -486,7 +502,7 @@ }, ">) => void], unknown>; } & Omit<", "InternalHttpServicePreboot", - ", \"basePath\" | \"staticAssets\"> & { basePath: BasePathMocked; staticAssets: StaticAssetsMocked; }" + ", \"basePath\" | \"staticAssets\"> & { basePath: BasePathMocked; staticAssets: InternalStaticAssetsMocked; }" ], "path": "packages/core/http/core-http-server-mocks/src/http_service.mock.ts", "deprecated": false, @@ -625,7 +641,7 @@ }, ">], unknown>; } & Omit<", "InternalHttpServiceSetup", - ", \"createRouter\" | \"basePath\" | \"auth\" | \"staticAssets\" | \"authRequestHeaders\"> & { auth: AuthMocked; basePath: BasePathMocked; staticAssets: StaticAssetsMocked; createRouter: jest.MockedFunction<(path: string) => ", + ", \"createRouter\" | \"basePath\" | \"auth\" | \"staticAssets\" | \"authRequestHeaders\"> & { auth: AuthMocked; basePath: BasePathMocked; staticAssets: InternalStaticAssetsMocked; createRouter: jest.MockedFunction<(path: string) => ", { "pluginId": "@kbn/core-http-router-server-mocks", "scope": "common", @@ -656,7 +672,9 @@ "label": "InternalHttpServiceStartMock", "description": [], "signature": [ - "{ isListening: jest.MockInstance; basePath: ", + "{ staticAssets: ", + "InternalStaticAssets", + "; isListening: jest.MockInstance; basePath: ", { "pluginId": "@kbn/core-http-server", "scope": "common", @@ -682,7 +700,7 @@ }, ", [], unknown>; } & ", "InternalHttpServiceStart", - " & { basePath: BasePathMocked; }" + " & { basePath: BasePathMocked; staticAssets: InternalStaticAssetsMocked; }" ], "path": "packages/core/http/core-http-server-mocks/src/http_service.mock.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index e70fdddbe69f8..87d235a9f8fd2 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 9305b77d9d696..52484b107acdf 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 8e30a9928bc7a..7ed630e2b8c72 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 d88e0e3a32c04..6478f1efdf94c 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-11-16 +date: 2023-11-27 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 67a0105427b18..8e718fea0f47e 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 27634b6d7d8e7..1f56ffbbaaedb 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 8e96dd1593f0a..105bc78cbc63e 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 dd835c6f2488f..c9b28fbbf1c3e 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 855e4b70b0985..547d3c712b757 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 3ff751bc15f56..596d7339adb99 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 9a3054fca09e7..341b14928e805 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 35bf496984fda..9d45812f0f5c2 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-11-16 +date: 2023-11-27 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 698f2f3105d2c..ff84dd07f48d4 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 a328d5c73083f..de35509c4ea21 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 c77747874f4e5..20b9dbfd2d37f 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 96261df56bc85..e6c50ffc61d0e 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-11-16 +date: 2023-11-27 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 1a5bd3676d53a..96525c27ed62d 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 700a2f0444662..1a935e2df3ff6 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 21fffacb7a025..961c0d6e7b016 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 9d50d48dd9b91..98ab36e03ea18 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 90d40160bdd60..85212aa238a4a 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-11-16 +date: 2023-11-27 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 fcb251894033d..52264d1cb91fb 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 648476b471d7b..c423b1cabeb66 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 d64bea6e8ceb2..d4264d3c5621d 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 64fb1e71ad526..0eff86b9aa99d 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-11-16 +date: 2023-11-27 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 70776e7f01710..d52f863ed0466 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 326e2fd1a347d..22786b6970d3d 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 4c274ad815872..2f0a99a95c7ce 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 f224b2f42c617..fd3e4a6710e0a 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 295f912277225..d57b4b10eac09 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 970addfac64d1..b6c5fc996c7a1 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 a46d760d36982..a2b6d90ff72aa 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 74169fb6b52f9..ccc6b2416d5d0 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 0ac7db1caa86c..7905d0fba4e30 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 0f12ec12987fa..5e6226ed5f33d 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 3cc884220fde5..11f772f5feb17 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 ba98fb28ee933..3b2799bb0639e 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2023-11-16 +date: 2023-11-27 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 8dd6ec1f0070e..93272c2ea58c1 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-11-16 +date: 2023-11-27 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 2e161fa2396ef..c956ce575b049 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 76b4ce950ac39..a5e8ee01f4db5 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-11-16 +date: 2023-11-27 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 4da0a4add6f7f..fcfed80eb01e5 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 611f8deaddb62..47e45bfb9e1f4 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 24702fd09bd5c..3101f4200bf22 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 be52019337cf2..089772ede243f 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 30381c53066bd..56e01c8eac8fc 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 b8d9b047e9fc2..5fe79228b4386 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 80903bbc0c714..0c294493aae0b 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-11-16 +date: 2023-11-27 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 735f71ed70953..36400f64e4b0e 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 5a4cfdbcabdf5..2b47d5bd77838 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 edb1dda31a9f2..8755a1f005a7f 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 3c2235d8b525e..6194164b638f2 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_core_saved_objects_browser_internal.devdocs.json index 1510b6de85275..59b17ac34b720 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_browser_internal.devdocs.json @@ -99,11 +99,11 @@ "signature": [ "({ http }: { http: ", { - "pluginId": "@kbn/core-http-browser", + "pluginId": "@kbn/core-http-browser-internal", "scope": "common", - "docId": "kibKbnCoreHttpBrowserPluginApi", - "section": "def-common.HttpSetup", - "text": "HttpSetup" + "docId": "kibKbnCoreHttpBrowserInternalPluginApi", + "section": "def-common.InternalHttpStart", + "text": "InternalHttpStart" }, "; }) => Promise<", { @@ -133,18 +133,22 @@ { "parentPluginId": "@kbn/core-saved-objects-browser-internal", "id": "def-common.SavedObjectsService.start.$1.http", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "http", "description": [], "signature": [ + "Omit<", { "pluginId": "@kbn/core-http-browser", "scope": "common", "docId": "kibKbnCoreHttpBrowserPluginApi", "section": "def-common.HttpSetup", "text": "HttpSetup" - } + }, + ", \"staticAssets\"> & { staticAssets: ", + "InternalStaticAssets", + "; }" ], "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts", "deprecated": false, diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index e92be68f2c60c..74b66e3b99134 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 444409eceaf98..78684025efc38 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 9c58104676a71..abd590cd0397e 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-11-16 +date: 2023-11-27 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 17fa146e01bf1..cfada81330a93 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 cb1c421f73361..a713f479d27ed 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 c6a2df2bdfb81..daff07821d993 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 ba4476ba76971..ed994357aba4f 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 00ce80eec7f77..b715ccd14274a 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-11-16 +date: 2023-11-27 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 094fb5682e9ec..9db58dd7e0371 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 4b3b2779f9119..8adedbc4daf2c 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 c564ca08a048d..82c212b119c63 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-11-16 +date: 2023-11-27 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 6721891c631ab..910d8ae6211e4 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-11-16 +date: 2023-11-27 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 af18c864dafd0..50f52f3edbe5d 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 25887ac55df6d..e78779057612e 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-11-16 +date: 2023-11-27 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 abd13b6e9436b..91a0158a9ecde 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 93a8f6300d55e..fbb27d9972536 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 7fd05afebd092..cf1b2f923170e 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_core_test_helpers_http_setup_browser.devdocs.json index 5d94094ad2028..745890bc75129 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.devdocs.json +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.devdocs.json @@ -49,11 +49,11 @@ }, ">; http: ", { - "pluginId": "@kbn/core-http-browser", + "pluginId": "@kbn/core-http-browser-internal", "scope": "common", - "docId": "kibKbnCoreHttpBrowserPluginApi", - "section": "def-common.HttpSetup", - "text": "HttpSetup" + "docId": "kibKbnCoreHttpBrowserInternalPluginApi", + "section": "def-common.InternalHttpSetup", + "text": "InternalHttpSetup" }, "; }" ], @@ -123,7 +123,7 @@ "label": "injectedMetadata", "description": [], "signature": [ - "{ getBasePath: jest.MockInstance; getServerBasePath: jest.MockInstance; getPublicBaseUrl: jest.MockInstance; getKibanaBuildNumber: jest.MockInstance; getKibanaBranch: jest.MockInstance; getKibanaVersion: jest.MockInstance; getCspConfig: jest.MockInstance<{ warnLegacyBrowsers: boolean; }, [], unknown>; getExternalUrlConfig: jest.MockInstance<{ policy: ", + "{ getBasePath: jest.MockInstance; getServerBasePath: jest.MockInstance; getPublicBaseUrl: jest.MockInstance; getAssetsHrefBase: jest.MockInstance; getKibanaBuildNumber: jest.MockInstance; getKibanaBranch: jest.MockInstance; getKibanaVersion: jest.MockInstance; getCspConfig: jest.MockInstance<{ warnLegacyBrowsers: boolean; }, [], unknown>; getExternalUrlConfig: jest.MockInstance<{ policy: ", "InjectedMetadataExternalUrlPolicy", "[]; }, [], unknown>; getTheme: jest.MockInstance<{ darkMode: boolean; version: \"v8\"; }, [], unknown>; getElasticsearchInfo: jest.MockInstance<", "InjectedMetadataClusterInfo", 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 4b3175e691341..c1f88acd65ea1 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 c0efbacdd0bb1..1135ad8fb5967 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-11-16 +date: 2023-11-27 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 fcfabc7d2b9db..643c319e2a3dc 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2023-11-16 +date: 2023-11-27 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 0761d79e0d95e..83eba804369bd 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-11-16 +date: 2023-11-27 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 8743138f0298a..3047aec23c93b 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 444d0a84a8df7..5be6e6d57e67b 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-11-16 +date: 2023-11-27 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 adc8eb15e68ea..84fc637370df6 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_core_ui_settings_browser.devdocs.json index 4804d0fac6dac..db4b4e223d17c 100644 --- a/api_docs/kbn_core_ui_settings_browser.devdocs.json +++ b/api_docs/kbn_core_ui_settings_browser.devdocs.json @@ -425,6 +425,57 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-ui-settings-browser", + "id": "def-common.IUiSettingsClient.validateValue", + "type": "Function", + "tags": [], + "label": "validateValue", + "description": [ + "\nValidates a uiSettings value and returns a ValueValidation object." + ], + "signature": [ + "(key: string, value: any) => Promise<", + "ValueValidation", + ">" + ], + "path": "packages/core/ui-settings/core-ui-settings-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-ui-settings-browser", + "id": "def-common.IUiSettingsClient.validateValue.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "packages/core/ui-settings/core-ui-settings-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-ui-settings-browser", + "id": "def-common.IUiSettingsClient.validateValue.$2", + "type": "Any", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/ui-settings/core-ui-settings-browser/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index fc5b8e1a44ae1..09870c2fa7e15 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 30 | 1 | 18 | 0 | +| 33 | 2 | 20 | 1 | ## Common diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 4717d5b705d39..5025ee6bb0f6b 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 0132060ef647c..c410be1ceba34 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 051290535f759..4d2fcf705ec06 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_core_ui_settings_server.devdocs.json index 9db8a89dd3d1f..37732beadfc9a 100644 --- a/api_docs/kbn_core_ui_settings_server.devdocs.json +++ b/api_docs/kbn_core_ui_settings_server.devdocs.json @@ -355,6 +355,55 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-ui-settings-server", + "id": "def-common.IUiSettingsClient.validate", + "type": "Function", + "tags": [], + "label": "validate", + "description": [ + "\nValidates the uiSettings value and returns a ValueValidation object." + ], + "signature": [ + "(key: string, value: unknown) => Promise" + ], + "path": "packages/core/ui-settings/core-ui-settings-server/src/ui_settings_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-ui-settings-server", + "id": "def-common.IUiSettingsClient.validate.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "packages/core/ui-settings/core-ui-settings-server/src/ui_settings_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-ui-settings-server", + "id": "def-common.IUiSettingsClient.validate.$2", + "type": "Unknown", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/core/ui-settings/core-ui-settings-server/src/ui_settings_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index b226da910d714..89976c832607f 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.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 | |-------------------|-----------|------------------------|-----------------| -| 34 | 1 | 17 | 0 | +| 37 | 1 | 19 | 0 | ## Common diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index a07743c906bbe..33ff2fc464284 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 9d05216df57ff..1013ee4c0cbbb 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 a7250b6348207..0efaf11644fdb 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-11-16 +date: 2023-11-27 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 776bb1b3e2a7c..c23d8db9377fa 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 8382c5d6b080c..96b6f9ea624a7 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 6c39b8b24267d..2a9a352678552 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-11-16 +date: 2023-11-27 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 c68e453848d86..eb4e746ea0956 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-11-16 +date: 2023-11-27 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 09c71e11eb188..ce431e25e306c 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 8fd8b457f272f..a7165f9876f29 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-11-16 +date: 2023-11-27 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 b741fd434c654..cbc8889329c85 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.devdocs.json b/api_docs/kbn_custom_icons.devdocs.json new file mode 100644 index 0000000000000..7bf78ecff15a2 --- /dev/null +++ b/api_docs/kbn_custom_icons.devdocs.json @@ -0,0 +1,369 @@ +{ + "id": "@kbn/custom-icons", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.AgentIcon", + "type": "Function", + "tags": [], + "label": "AgentIcon", + "description": [], + "signature": [ + "({ agentName, size = 'l', ...props }: ", + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.AgentIconProps", + "text": "AgentIconProps" + }, + ") => JSX.Element" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.AgentIcon.$1", + "type": "Object", + "tags": [], + "label": "{ agentName, size = 'l', ...props }", + "description": [], + "signature": [ + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.AgentIconProps", + "text": "AgentIconProps" + } + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.CloudProviderIcon", + "type": "Function", + "tags": [], + "label": "CloudProviderIcon", + "description": [], + "signature": [ + "({ cloudProvider, ...props }: ", + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.CloudProviderIconProps", + "text": "CloudProviderIconProps" + }, + ") => JSX.Element" + ], + "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.CloudProviderIcon.$1", + "type": "Object", + "tags": [], + "label": "{ cloudProvider, ...props }", + "description": [], + "signature": [ + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.CloudProviderIconProps", + "text": "CloudProviderIconProps" + } + ], + "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.getAgentIcon", + "type": "Function", + "tags": [], + "label": "getAgentIcon", + "description": [], + "signature": [ + "(agentName: string | undefined, isDarkMode: boolean) => string" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.getAgentIcon.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.getAgentIcon.$2", + "type": "boolean", + "tags": [], + "label": "isDarkMode", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.getCloudProviderIcon", + "type": "Function", + "tags": [], + "label": "getCloudProviderIcon", + "description": [], + "signature": [ + "(cloudProvider: ", + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.CloudProvider", + "text": "CloudProvider" + }, + ") => \"cloudSunny\" | \"logoAWS\" | \"logoAzure\" | \"logoGCP\"" + ], + "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/get_cloud_provider_icon.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.getCloudProviderIcon.$1", + "type": "CompoundType", + "tags": [], + "label": "cloudProvider", + "description": [], + "signature": [ + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.CloudProvider", + "text": "CloudProvider" + } + ], + "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/get_cloud_provider_icon.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.getServerlessIcon", + "type": "Function", + "tags": [], + "label": "getServerlessIcon", + "description": [], + "signature": [ + "(serverlessType: ", + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.ServerlessType", + "text": "ServerlessType" + }, + " | undefined) => string" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/get_serverless_icon.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.getServerlessIcon.$1", + "type": "CompoundType", + "tags": [], + "label": "serverlessType", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.ServerlessType", + "text": "ServerlessType" + }, + " | undefined" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/get_serverless_icon.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.AgentIconProps", + "type": "Interface", + "tags": [], + "label": "AgentIconProps", + "description": [], + "signature": [ + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.AgentIconProps", + "text": "AgentIconProps" + }, + " extends Omit<", + "EuiIconProps", + ", \"type\">" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.AgentIconProps.agentName", + "type": "CompoundType", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.AgentName", + "text": "AgentName" + }, + " | undefined" + ], + "path": "packages/kbn-custom-icons/src/components/agent_icon/index.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.CloudProviderIconProps", + "type": "Interface", + "tags": [], + "label": "CloudProviderIconProps", + "description": [], + "signature": [ + { + "pluginId": "@kbn/custom-icons", + "scope": "common", + "docId": "kibKbnCustomIconsPluginApi", + "section": "def-common.CloudProviderIconProps", + "text": "CloudProviderIconProps" + }, + " extends Omit<", + "EuiIconProps", + ", \"type\">" + ], + "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.CloudProviderIconProps.cloudProvider", + "type": "CompoundType", + "tags": [], + "label": "cloudProvider", + "description": [], + "signature": [ + "\"aws\" | \"azure\" | \"gcp\" | \"unknownProvider\" | null | undefined" + ], + "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/custom-icons", + "id": "def-common.CloudProvider", + "type": "Type", + "tags": [], + "label": "CloudProvider", + "description": [], + "signature": [ + "\"aws\" | \"azure\" | \"gcp\" | \"unknownProvider\" | null | undefined" + ], + "path": "packages/kbn-custom-icons/src/components/cloud_provider_icon/get_cloud_provider_icon.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx new file mode 100644 index 0000000000000..c49c3ed166477 --- /dev/null +++ b/api_docs/kbn_custom_icons.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnCustomIconsPluginApi +slug: /kibana-dev-docs/api/kbn-custom-icons +title: "@kbn/custom-icons" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/custom-icons plugin +date: 2023-11-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] +--- +import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; + + + +Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 16 | 0 | 16 | 0 | + +## Common + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 67837181e54f3..1327df35c3f9b 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-11-16 +date: 2023-11-27 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 8e67ef43452c9..84a83f48f4e50 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index e95124d51e3d4..dd3045cfc7a71 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 8e4ae3ecdfd03..0ce599d64ea8f 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-11-16 +date: 2023-11-27 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 882b9fda4cf34..6a5ef4d076502 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-11-16 +date: 2023-11-27 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 4adaa6eeec308..1802c464d64f1 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-11-16 +date: 2023-11-27 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 c575cbfbda218..6d504a94b89ba 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-11-16 +date: 2023-11-27 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 279a828cbe84a..8cfa53ca4243e 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-11-16 +date: 2023-11-27 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 07c06bd01fe2b..757e26b3d0851 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-11-16 +date: 2023-11-27 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 bd5117564cbeb..b99d47e979146 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-11-16 +date: 2023-11-27 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 1cda3dfdf6cc9..ac3729e66242d 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-11-16 +date: 2023-11-27 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 3878c6f84ee50..9c164b6ce0e9d 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-11-16 +date: 2023-11-27 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 0e79c5c0b93c5..84a171eea9a2d 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-11-16 +date: 2023-11-27 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 2910fa34db36d..3fdee1b5fc478 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-11-16 +date: 2023-11-27 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 63b6d26c64f32..9cff77751cdf1 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-11-16 +date: 2023-11-27 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 3bbf3fa4b50aa..c14a521a73276 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-11-16 +date: 2023-11-27 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 c8c3a0bbee67a..344218d9b760a 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-11-16 +date: 2023-11-27 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 c2796e378be55..bd7ce85ebd75a 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 c6fd7cf2abb10..4a483c4cd98ff 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 4c91d4cbee507..d621bb6b27a68 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -840,7 +840,7 @@ "label": "fleet", "description": [], "signature": [ - "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; }" + "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; }" ], "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 956715f22011e..80f52eccfc2c5 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-11-16 +date: 2023-11-27 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 93ddee1f4b738..6088ceeb5c45a 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 cfca9512a5004..266ab3853065e 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-11-16 +date: 2023-11-27 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 e5ea9774fd2f5..2401374909e46 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-11-16 +date: 2023-11-27 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 026ece1775d52..3a804b93f01e5 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-11-16 +date: 2023-11-27 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 e1eb83ecca662..ea0e3034d00b5 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_elastic_agent_utils.devdocs.json new file mode 100644 index 0000000000000..84eff4c15229a --- /dev/null +++ b/api_docs/kbn_elastic_agent_utils.devdocs.json @@ -0,0 +1,631 @@ +{ + "id": "@kbn/elastic-agent-utils", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isAndroidAgentName", + "type": "Function", + "tags": [], + "label": "isAndroidAgentName", + "description": [], + "signature": [ + "(agentName: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isAndroidAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isAWSLambdaAgentName", + "type": "Function", + "tags": [], + "label": "isAWSLambdaAgentName", + "description": [], + "signature": [ + "(serverlessType: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isAWSLambdaAgentName.$1", + "type": "string", + "tags": [], + "label": "serverlessType", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isAzureFunctionsAgentName", + "type": "Function", + "tags": [], + "label": "isAzureFunctionsAgentName", + "description": [], + "signature": [ + "(serverlessType: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isAzureFunctionsAgentName.$1", + "type": "string", + "tags": [], + "label": "serverlessType", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isIosAgentName", + "type": "Function", + "tags": [], + "label": "isIosAgentName", + "description": [], + "signature": [ + "(agentName: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isIosAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isJavaAgentName", + "type": "Function", + "tags": [], + "label": "isJavaAgentName", + "description": [], + "signature": [ + "(agentName: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isJavaAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isJRubyAgentName", + "type": "Function", + "tags": [], + "label": "isJRubyAgentName", + "description": [], + "signature": [ + "(agentName: string | undefined, runtimeName: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isJRubyAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isJRubyAgentName.$2", + "type": "string", + "tags": [], + "label": "runtimeName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isMobileAgentName", + "type": "Function", + "tags": [], + "label": "isMobileAgentName", + "description": [], + "signature": [ + "(agentName: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isMobileAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isOpenTelemetryAgentName", + "type": "Function", + "tags": [], + "label": "isOpenTelemetryAgentName", + "description": [], + "signature": [ + "(agentName: string) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isOpenTelemetryAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isRumAgentName", + "type": "Function", + "tags": [], + "label": "isRumAgentName", + "description": [], + "signature": [ + "(agentName: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isRumAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isRumOrMobileAgentName", + "type": "Function", + "tags": [], + "label": "isRumOrMobileAgentName", + "description": [], + "signature": [ + "(agentName: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isRumOrMobileAgentName.$1", + "type": "string", + "tags": [], + "label": "agentName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isServerlessAgentName", + "type": "Function", + "tags": [], + "label": "isServerlessAgentName", + "description": [], + "signature": [ + "(serverlessType: string | undefined) => boolean" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.isServerlessAgentName.$1", + "type": "string", + "tags": [], + "label": "serverlessType", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_guards.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.AGENT_NAMES", + "type": "Array", + "tags": [], + "label": "AGENT_NAMES", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.AgentName", + "text": "AgentName" + }, + "[]" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.AgentName", + "type": "Type", + "tags": [], + "label": "AgentName", + "description": [], + "signature": [ + "\"java\" | \"go\" | \"dotnet\" | \"php\" | \"ruby\" | \"otlp\" | \"android/java\" | \"iOS/swift\" | \"rum-js\" | \"js-base\" | \"opentelemetry/webjs\" | \"opentelemetry/java\" | \"nodejs\" | \"python\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\"" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.ELASTIC_AGENT_NAMES", + "type": "Array", + "tags": [], + "label": "ELASTIC_AGENT_NAMES", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.ElasticAgentName", + "text": "ElasticAgentName" + }, + "[]" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.ElasticAgentName", + "type": "Type", + "tags": [], + "label": "ElasticAgentName", + "description": [ + "\nWe cannot mark these arrays as const and derive their type\nbecause we need to be able to assign them as mutable entities for ES queries." + ], + "signature": [ + "\"java\" | \"go\" | \"dotnet\" | \"php\" | \"ruby\" | \"android/java\" | \"iOS/swift\" | \"rum-js\" | \"js-base\" | \"nodejs\" | \"python\"" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.JAVA_AGENT_NAMES", + "type": "Array", + "tags": [], + "label": "JAVA_AGENT_NAMES", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.JavaAgentName", + "text": "JavaAgentName" + }, + "[]" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.JavaAgentName", + "type": "Type", + "tags": [], + "label": "JavaAgentName", + "description": [], + "signature": [ + "\"java\" | \"opentelemetry/java\"" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.OPEN_TELEMETRY_AGENT_NAMES", + "type": "Array", + "tags": [], + "label": "OPEN_TELEMETRY_AGENT_NAMES", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.OpenTelemetryAgentName", + "text": "OpenTelemetryAgentName" + }, + "[]" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.OpenTelemetryAgentName", + "type": "Type", + "tags": [], + "label": "OpenTelemetryAgentName", + "description": [], + "signature": [ + "\"otlp\" | \"opentelemetry/webjs\" | \"opentelemetry/java\" | \"opentelemetry/cpp\" | \"opentelemetry/dotnet\" | \"opentelemetry/erlang\" | \"opentelemetry/go\" | \"opentelemetry/nodejs\" | \"opentelemetry/php\" | \"opentelemetry/python\" | \"opentelemetry/ruby\" | \"opentelemetry/rust\" | \"opentelemetry/swift\"" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.RUM_AGENT_NAMES", + "type": "Array", + "tags": [], + "label": "RUM_AGENT_NAMES", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.RumAgentName", + "text": "RumAgentName" + }, + "[]" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.RumAgentName", + "type": "Type", + "tags": [], + "label": "RumAgentName", + "description": [], + "signature": [ + "\"rum-js\" | \"js-base\" | \"opentelemetry/webjs\"" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.SERVERLESS_TYPE", + "type": "Array", + "tags": [], + "label": "SERVERLESS_TYPE", + "description": [], + "signature": [ + { + "pluginId": "@kbn/elastic-agent-utils", + "scope": "common", + "docId": "kibKbnElasticAgentUtilsPluginApi", + "section": "def-common.ServerlessType", + "text": "ServerlessType" + }, + "[]" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/elastic-agent-utils", + "id": "def-common.ServerlessType", + "type": "Type", + "tags": [], + "label": "ServerlessType", + "description": [], + "signature": [ + "\"aws.lambda\" | \"azure.functions\"" + ], + "path": "packages/kbn-elastic-agent-utils/src/agent_names.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx new file mode 100644 index 0000000000000..2dca4abc65a17 --- /dev/null +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnElasticAgentUtilsPluginApi +slug: /kibana-dev-docs/api/kbn-elastic-agent-utils +title: "@kbn/elastic-agent-utils" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/elastic-agent-utils plugin +date: 2023-11-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] +--- +import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; + + + +Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 35 | 0 | 34 | 0 | + +## Common + +### Functions + + +### Consts, variables and types + + diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 5cde4c3ad25eb..ac984b73af80f 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 19e005519406d..efdb5cf0aefb5 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-11-16 +date: 2023-11-27 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 feca9bd4bdf1c..b4f624292feca 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-11-16 +date: 2023-11-27 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 9abe569c9e6b5..d8b37010acfae 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-11-16 +date: 2023-11-27 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 a20beb160dc9d..5fcfa1b4bb7b1 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-11-16 +date: 2023-11-27 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 5845573fb4ae8..3d1fc27db30b0 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-11-16 +date: 2023-11-27 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 366cdec67c8c7..ad2143a75401b 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-11-16 +date: 2023-11-27 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 e0d7211513df7..83482cf5c22ca 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-11-16 +date: 2023-11-27 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 03d1d494ef0a5..2eda51c59225d 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-11-16 +date: 2023-11-27 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 bca15df2c67bd..fac320c7b71cd 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-11-16 +date: 2023-11-27 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 8ee2498fdb00d..82d7132fed95a 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-11-16 +date: 2023-11-27 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 aab8071d09c55..c2421793b2a60 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 b3e0721d84b8e..d5ae17d725099 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-11-16 +date: 2023-11-27 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 c6390d89bfdab..297c6ac6bb252 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-11-16 +date: 2023-11-27 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_generate.mdx b/api_docs/kbn_generate.mdx index 27ce99c92bc32..12e59f2064f12 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-11-16 +date: 2023-11-27 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 2a12d265387b3..aa5f51b7fb0a3 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-11-16 +date: 2023-11-27 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 15f0991bf7e3c..96bd944fb69af 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-11-16 +date: 2023-11-27 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 f67f4d9cfb89e..06509631e4413 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-11-16 +date: 2023-11-27 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 68b6bf281411a..e6a86fa5c2543 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-11-16 +date: 2023-11-27 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 3e1243046ba4e..4e01acd9a95d6 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 9d521afacf7dd..46aa657fac060 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-11-16 +date: 2023-11-27 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 481cb6766e777..1c74f6d53e84b 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-11-16 +date: 2023-11-27 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 62b7c2f31e44c..fcd6b3b18a73b 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-11-16 +date: 2023-11-27 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 eff401f76683f..819f4bba6dbed 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-11-16 +date: 2023-11-27 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 4822e06ba5a90..1dda9b2b0a83b 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-11-16 +date: 2023-11-27 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 173a7796634d7..19276e94655bf 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-11-16 +date: 2023-11-27 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 9ca66fdfeeadb..27d490faa585e 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-11-16 +date: 2023-11-27 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 e94ffcf8e7796..428b5d23dee0f 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-11-16 +date: 2023-11-27 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 4255f14ce2116..6a89ab405985c 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 f058d33c6cfe1..410884860612d 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-11-16 +date: 2023-11-27 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 98094849fd802..276651e608834 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-11-16 +date: 2023-11-27 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 656670cab4d47..e63b7699ad4ac 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-11-16 +date: 2023-11-27 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 c2a9ffbf09976..0bd509185808f 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-11-16 +date: 2023-11-27 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 e05ea9131bfdf..b4a9664930e47 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_lens_embeddable_utils.devdocs.json index 3bc9508b445d6..9c3efd71d2cf9 100644 --- a/api_docs/kbn_lens_embeddable_utils.devdocs.json +++ b/api_docs/kbn_lens_embeddable_utils.devdocs.json @@ -3433,6 +3433,48 @@ "path": "packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/xy_chart.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-embeddable-utils", + "id": "def-public.XYVisualOptions.valueLabels", + "type": "CompoundType", + "tags": [], + "label": "valueLabels", + "description": [], + "signature": [ + { + "pluginId": "expressionXY", + "scope": "common", + "docId": "kibExpressionXYPluginApi", + "section": "def-common.ValueLabelMode", + "text": "ValueLabelMode" + }, + " | undefined" + ], + "path": "packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/xy_chart.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/lens-embeddable-utils", + "id": "def-public.XYVisualOptions.axisTitlesVisibilitySettings", + "type": "Object", + "tags": [], + "label": "axisTitlesVisibilitySettings", + "description": [], + "signature": [ + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.AxesSettingsConfig", + "text": "AxesSettingsConfig" + }, + " | undefined" + ], + "path": "packages/kbn-lens-embeddable-utils/attribute_builder/visualization_types/xy_chart.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -3606,7 +3648,15 @@ }, " | undefined; reducedTimeRange?: string | undefined; timeScale?: ", "TimeScaleUnit", - " | undefined; format?: { id: string; params?: { decimals: number; compact?: boolean | undefined; } | undefined; } | undefined; }, \"formula\"> & { color?: string | undefined; value: string; }" + " | undefined; format?: { id: string; params?: { decimals: number; compact?: boolean | undefined; } | undefined; } | undefined; }, \"formula\"> & { color?: string | undefined; fill?: ", + { + "pluginId": "expressionXY", + "scope": "common", + "docId": "kibExpressionXYPluginApi", + "section": "def-common.FillStyle", + "text": "FillStyle" + }, + " | undefined; value: string; }" ], "path": "packages/kbn-lens-embeddable-utils/attribute_builder/types.ts", "deprecated": false, diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index aa1233ffc36b6..7e028cebce8ef 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 158 | 0 | 155 | 0 | +| 160 | 0 | 157 | 0 | ## Client diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index bb27e52d7b244..56c9f77439303 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-11-16 +date: 2023-11-27 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 f0706e42dd29c..1540af7c267c8 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 8cbb1448f6f94..955f3809c421d 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-11-16 +date: 2023-11-27 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 f509a205739f7..5bae8706f2efc 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-11-16 +date: 2023-11-27 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 dff4e250a6658..1808200e40e6a 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2023-11-16 +date: 2023-11-27 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 0300ff570e0d9..3c4f8160fe488 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_management_settings_components_field_input.devdocs.json index 06eb3024d2690..6dc83478cd1b3 100644 --- a/api_docs/kbn_management_settings_components_field_input.devdocs.json +++ b/api_docs/kbn_management_settings_components_field_input.devdocs.json @@ -117,6 +117,28 @@ "path": "packages/kbn-management/settings/components/field_input/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputKibanaDependencies.settings", + "type": "Object", + "tags": [], + "label": "settings", + "description": [], + "signature": [ + "{ client: ", + { + "pluginId": "@kbn/core-ui-settings-browser", + "scope": "common", + "docId": "kibKbnCoreUiSettingsBrowserPluginApi", + "section": "def-common.IUiSettingsClient", + "text": "IUiSettingsClient" + }, + "; }" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -311,6 +333,55 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputServices.validateChange", + "type": "Function", + "tags": [], + "label": "validateChange", + "description": [], + "signature": [ + "(key: string, value: any) => Promise<", + "ValueValidation", + ">" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputServices.validateChange.$1", + "type": "string", + "tags": [], + "label": "key", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/management-settings-components-field-input", + "id": "def-common.FieldInputServices.validateChange.$2", + "type": "Any", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-management/settings/components/field_input/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 996684cf890a8..f90aef74612bf 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/platform-deployment-management](https://github.com/orgs/elasti | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 20 | 0 | 5 | 0 | +| 24 | 1 | 9 | 0 | ## Common diff --git a/api_docs/kbn_management_settings_components_field_row.devdocs.json b/api_docs/kbn_management_settings_components_field_row.devdocs.json index 57ee28447a32b..052a3e23ff500 100644 --- a/api_docs/kbn_management_settings_components_field_row.devdocs.json +++ b/api_docs/kbn_management_settings_components_field_row.devdocs.json @@ -80,7 +80,7 @@ "\nKibana-specific Provider that maps Kibana plugins and services to a {@link FieldRowProvider}." ], "signature": [ - "({ children, docLinks, notifications, }: React.PropsWithChildren<", + "({ children, docLinks, notifications, settings, }: React.PropsWithChildren<", { "pluginId": "@kbn/management-settings-components-field-row", "scope": "common", @@ -99,7 +99,7 @@ "id": "def-common.FieldRowKibanaProvider.$1", "type": "CompoundType", "tags": [], - "label": "{\n children,\n docLinks,\n notifications,\n}", + "label": "{\n children,\n docLinks,\n notifications,\n settings,\n}", "description": [], "signature": [ "React.PropsWithChildren<", diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index b7d9c63d46c7e..6bdedab4443be 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-11-16 +date: 2023-11-27 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 7b6d4111710ba..7ec32e001fa26 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2023-11-16 +date: 2023-11-27 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 cd4c29c89a5e1..f4ce8f12492b8 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-11-16 +date: 2023-11-27 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 3c40ac2affa6f..0838caf95bc24 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-11-16 +date: 2023-11-27 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 d3b0e6f85de4d..6f046fe84760e 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-11-16 +date: 2023-11-27 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 e1707d5e5c4e8..3b1b56c99458e 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-11-16 +date: 2023-11-27 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 d6c1d9205dfbc..381815a2c9697 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-11-16 +date: 2023-11-27 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 88eef8bd37464..43b4829ddc1f2 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-11-16 +date: 2023-11-27 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 36922e6925453..6cfe10fa2c493 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-11-16 +date: 2023-11-27 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 c39dc03e509a3..4d02066402514 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 a69c8cd6b562f..e11c9596a3116 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 e779cc1083991..d9d648565f15a 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 ed4d9fefe747d..ffe06966b7eac 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-11-16 +date: 2023-11-27 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 f160234bd3f7b..12e8602225c8d 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2023-11-16 +date: 2023-11-27 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 5a0f3fdffe950..95c46eb783e59 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_ml_data_grid.devdocs.json index 0e63c9f639c1c..14fcad6d9b0ad 100644 --- a/api_docs/kbn_ml_data_grid.devdocs.json +++ b/api_docs/kbn_ml_data_grid.devdocs.json @@ -347,10 +347,10 @@ }, { "parentPluginId": "@kbn/ml-data-grid", - "id": "def-common.getFieldsFromKibanaIndexPattern", + "id": "def-common.getFieldsFromKibanaDataView", "type": "Function", "tags": [], - "label": "getFieldsFromKibanaIndexPattern", + "label": "getFieldsFromKibanaDataView", "description": [ "\nRetrieves fields from a Kibana data view." ], @@ -371,7 +371,7 @@ "children": [ { "parentPluginId": "@kbn/ml-data-grid", - "id": "def-common.getFieldsFromKibanaIndexPattern.$1", + "id": "def-common.getFieldsFromKibanaDataView.$1", "type": "Object", "tags": [], "label": "dataView", @@ -2489,12 +2489,12 @@ }, { "parentPluginId": "@kbn/ml-data-grid", - "id": "def-common.UseIndexDataReturnType.indexPatternFields", + "id": "def-common.UseIndexDataReturnType.dataViewFields", "type": "Array", "tags": [], - "label": "indexPatternFields", + "label": "dataViewFields", "description": [ - "\nOptional index pattern fields." + "\nOptional data view fields." ], "signature": [ "string[] | undefined" diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index e0ca15fc4d751..7d6067a8f9417 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-11-16 +date: 2023-11-27 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 fa09cdc394da9..c1c9baaae3ff8 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-11-16 +date: 2023-11-27 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 cc6eb09ac8d3e..de6be91f086db 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 abb315ecc6a99..6c87f5e17018f 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 16e23cfc25c48..036e048089e88 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-11-16 +date: 2023-11-27 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 9bd7dd87854a7..bdc92fce9b5bc 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-11-16 +date: 2023-11-27 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 8d467f203c2bf..cd62733f7e93f 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-11-16 +date: 2023-11-27 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 0f87482f4ae3d..ffa8819d1fecb 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-11-16 +date: 2023-11-27 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 c22ed444a3846..0cc81a085e2d8 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-11-16 +date: 2023-11-27 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 0b2a5c31fae69..7790343fc0b76 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-11-16 +date: 2023-11-27 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 0867d6b273f7a..0c5bd2328233b 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 de86a37513a8c..0d58307edcf16 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 2aea55e5a1e64..50239b86d0e59 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 0b2babc59f207..fe45c9a233062 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 1a286951d5864..a40ab59683988 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 0459040752e4d..02b1cc6d6635d 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-11-16 +date: 2023-11-27 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 0a09588940bd3..e93125b1e697e 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_ml_ui_actions.devdocs.json new file mode 100644 index 0000000000000..6fe15ef82553e --- /dev/null +++ b/api_docs/kbn_ml_ui_actions.devdocs.json @@ -0,0 +1,298 @@ +{ + "id": "@kbn/ml-ui-actions", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CategorizeFieldContext", + "type": "Interface", + "tags": [], + "label": "CategorizeFieldContext", + "description": [], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CategorizeFieldContext.field", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + } + ], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CategorizeFieldContext.dataView", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + } + ], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CategorizeFieldContext.originatingApp", + "type": "string", + "tags": [], + "label": "originatingApp", + "description": [], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CategorizeFieldContext.additionalFilter", + "type": "Object", + "tags": [], + "label": "additionalFilter", + "description": [], + "signature": [ + "{ from: number; to: number; field?: { name: string; value: string; } | undefined; } | undefined" + ], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CreateCategorizationADJobContext", + "type": "Interface", + "tags": [], + "label": "CreateCategorizationADJobContext", + "description": [], + "path": "x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CreateCategorizationADJobContext.field", + "type": "Object", + "tags": [], + "label": "field", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewField", + "text": "DataViewField" + } + ], + "path": "x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CreateCategorizationADJobContext.dataView", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + } + ], + "path": "x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CreateCategorizationADJobContext.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "QueryDslQueryContainer" + ], + "path": "x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CreateCategorizationADJobContext.timeRange", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [], + "signature": [ + "{ from: string; to: string; mode?: \"absolute\" | \"relative\" | undefined; }" + ], + "path": "x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.ACTION_CATEGORIZE_FIELD", + "type": "string", + "tags": [], + "label": "ACTION_CATEGORIZE_FIELD", + "description": [], + "signature": [ + "\"ACTION_CATEGORIZE_FIELD\"" + ], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CATEGORIZE_FIELD_TRIGGER", + "type": "string", + "tags": [], + "label": "CATEGORIZE_FIELD_TRIGGER", + "description": [], + "signature": [ + "\"CATEGORIZE_FIELD_TRIGGER\"" + ], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_ACTION", + "type": "string", + "tags": [], + "label": "CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_ACTION", + "description": [], + "signature": [ + "\"createMLADCategorizationJobAction\"" + ], + "path": "x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER", + "type": "string", + "tags": [], + "label": "CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER", + "description": [], + "signature": [ + "\"CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER\"" + ], + "path": "x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.categorizeFieldTrigger", + "type": "Object", + "tags": [], + "label": "categorizeFieldTrigger", + "description": [], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.categorizeFieldTrigger.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.categorizeFieldTrigger.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/ml-ui-actions", + "id": "def-common.categorizeFieldTrigger.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "path": "x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx new file mode 100644 index 0000000000000..f7dfefcbd6999 --- /dev/null +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnMlUiActionsPluginApi +slug: /kibana-dev-docs/api/kbn-ml-ui-actions +title: "@kbn/ml-ui-actions" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/ml-ui-actions plugin +date: 2023-11-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] +--- +import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; + + + +Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 18 | 0 | 18 | 0 | + +## Common + +### Objects + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 17b5193dbc83e..5f7c12e70e4ca 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index f8ef704a8ff1f..3320e5bce9ab2 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-11-16 +date: 2023-11-27 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 56e5bbb6482f8..079e6d3c2d185 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-11-16 +date: 2023-11-27 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 ccda394924ffc..fc0c109e8428d 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_observability_alerting_test_data.devdocs.json index 96da803aa4b60..d75f51f28846a 100644 --- a/api_docs/kbn_observability_alerting_test_data.devdocs.json +++ b/api_docs/kbn_observability_alerting_test_data.devdocs.json @@ -434,7 +434,7 @@ "label": "criteria", "description": [], "signature": [ - "{ aggType: string; comparator: ", + "{ comparator: ", "Comparator", "; threshold: number[]; timeSize: number; timeUnit: string; metrics: { name: string; filter: string; aggType: ", "Aggregators", @@ -597,7 +597,7 @@ "label": "criteria", "description": [], "signature": [ - "{ aggType: string; comparator: ", + "{ comparator: ", "Comparator", "; threshold: number[]; timeSize: number; timeUnit: string; metrics: { name: string; filter: string; aggType: ", "Aggregators", @@ -774,7 +774,7 @@ "label": "criteria", "description": [], "signature": [ - "{ aggType: string; comparator: ", + "{ comparator: ", "Comparator", "; threshold: number[]; timeSize: number; timeUnit: string; metrics: { name: string; filter: string; aggType: ", "Aggregators", @@ -937,7 +937,7 @@ "label": "criteria", "description": [], "signature": [ - "{ aggType: string; comparator: ", + "{ comparator: ", "Comparator", "; threshold: number[]; timeSize: number; timeUnit: string; metrics: { name: string; field: string; aggType: ", "Aggregators", @@ -1100,7 +1100,7 @@ "label": "criteria", "description": [], "signature": [ - "{ aggType: string; comparator: ", + "{ comparator: ", "Comparator", "; threshold: number[]; timeSize: number; timeUnit: string; metrics: { name: string; field: string; aggType: ", "Aggregators", @@ -1277,7 +1277,7 @@ "label": "criteria", "description": [], "signature": [ - "{ aggType: string; comparator: ", + "{ comparator: ", "Comparator", "; threshold: number[]; timeSize: number; timeUnit: string; metrics: { name: string; field: string; aggType: ", "Aggregators", diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 596f990e31fa8..dccd37bd409d3 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2023-11-16 +date: 2023-11-27 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_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index a38da4be53048..fd64ac097223d 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-11-16 +date: 2023-11-27 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 9f6322c9f087b..866016a5d2de1 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-11-16 +date: 2023-11-27 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 7763f9b79e4ee..f55a35b3110ed 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-11-16 +date: 2023-11-27 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 df617bbac03d2..621e573cdd710 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-11-16 +date: 2023-11-27 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_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 4556ae39a65e4..a1ff7f8ad796e 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 14421a7c80627..5a53b9b96eaa7 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-11-16 +date: 2023-11-27 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 ec8306b1fd837..fd161af3c372c 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.devdocs.json b/api_docs/kbn_profiling_utils.devdocs.json index 597124dd75175..f49a43e57c1f9 100644 --- a/api_docs/kbn_profiling_utils.devdocs.json +++ b/api_docs/kbn_profiling_utils.devdocs.json @@ -2699,6 +2699,18 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/profiling-utils", + "id": "def-common.TopNComparisonFunctionSortField", + "type": "Enum", + "tags": [], + "label": "TopNComparisonFunctionSortField", + "description": [], + "path": "packages/kbn-profiling-utils/common/functions.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/profiling-utils", "id": "def-common.TopNFunctionSortField", @@ -2990,6 +3002,82 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/profiling-utils", + "id": "def-common.topNComparisonFunctionSortFieldRt", + "type": "Object", + "tags": [], + "label": "topNComparisonFunctionSortFieldRt", + "description": [], + "signature": [ + "UnionC", + "<[", + "LiteralC", + "<", + { + "pluginId": "@kbn/profiling-utils", + "scope": "common", + "docId": "kibKbnProfilingUtilsPluginApi", + "section": "def-common.TopNComparisonFunctionSortField", + "text": "TopNComparisonFunctionSortField" + }, + ".ComparisonRank>, ", + "LiteralC", + "<", + { + "pluginId": "@kbn/profiling-utils", + "scope": "common", + "docId": "kibKbnProfilingUtilsPluginApi", + "section": "def-common.TopNComparisonFunctionSortField", + "text": "TopNComparisonFunctionSortField" + }, + ".ComparisonFrame>, ", + "LiteralC", + "<", + { + "pluginId": "@kbn/profiling-utils", + "scope": "common", + "docId": "kibKbnProfilingUtilsPluginApi", + "section": "def-common.TopNComparisonFunctionSortField", + "text": "TopNComparisonFunctionSortField" + }, + ".ComparisonSamples>, ", + "LiteralC", + "<", + { + "pluginId": "@kbn/profiling-utils", + "scope": "common", + "docId": "kibKbnProfilingUtilsPluginApi", + "section": "def-common.TopNComparisonFunctionSortField", + "text": "TopNComparisonFunctionSortField" + }, + ".ComparisonSelfCPU>, ", + "LiteralC", + "<", + { + "pluginId": "@kbn/profiling-utils", + "scope": "common", + "docId": "kibKbnProfilingUtilsPluginApi", + "section": "def-common.TopNComparisonFunctionSortField", + "text": "TopNComparisonFunctionSortField" + }, + ".ComparisonTotalCPU>, ", + "LiteralC", + "<", + { + "pluginId": "@kbn/profiling-utils", + "scope": "common", + "docId": "kibKbnProfilingUtilsPluginApi", + "section": "def-common.TopNComparisonFunctionSortField", + "text": "TopNComparisonFunctionSortField" + }, + ".ComparisonDiff>]>" + ], + "path": "packages/kbn-profiling-utils/common/functions.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/profiling-utils", "id": "def-common.topNFunctionSortFieldRt", diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 86badc0e585ec..8d6a4d686d1e9 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 171 | 0 | 28 | 0 | +| 173 | 0 | 30 | 0 | ## Common diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 67a8c86aaf8b1..d3bb1f8c33cf5 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-11-16 +date: 2023-11-27 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 2575b407c76e2..399d81627081a 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-11-16 +date: 2023-11-27 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 b0afe199e9ad2..c3349c4759a88 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-11-16 +date: 2023-11-27 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 36e77747123b6..756d2d716a140 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-11-16 +date: 2023-11-27 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 a87316950a556..a2a5eb471a013 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-11-16 +date: 2023-11-27 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 172ff21e7a517..778c2f167fb68 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-11-16 +date: 2023-11-27 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 b0eb24de31908..23383f3cfc400 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-11-16 +date: 2023-11-27 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 b72b1e56e37a1..b5813906f33c8 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-11-16 +date: 2023-11-27 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 dc8ae220028e1..0b319a6845e8b 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-11-16 +date: 2023-11-27 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 b70dc4ee827a9..161ab58735927 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-11-16 +date: 2023-11-27 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 bc0a310b96c7f..d747f9fe44597 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-11-16 +date: 2023-11-27 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 04502f0b603d5..7f5e25d409a59 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-11-16 +date: 2023-11-27 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 cbabbb3542a21..51f9689c56879 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-11-16 +date: 2023-11-27 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 e59358e3bcaf7..84c0040b26565 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2023-11-16 +date: 2023-11-27 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 19723d89f5871..84b93ef64aea8 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2023-11-16 +date: 2023-11-27 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 6112c4f0bfc3b..ed853f5c227a1 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2023-11-16 +date: 2023-11-27 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 e80e700bd2cf9..aa1cec42ce3b8 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2023-11-16 +date: 2023-11-27 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 086d6edf5d3a0..3764476edbbca 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2023-11-16 +date: 2023-11-27 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 33f9aecbbc29b..552efdf99bdf2 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2023-11-16 +date: 2023-11-27 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 c67ab41fcf43d..2262bbb5d47e8 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2023-11-16 +date: 2023-11-27 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 6861b7b789720..dd3085f024839 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2023-11-16 +date: 2023-11-27 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 d3e6352855a00..ef55ec4a395ca 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2023-11-16 +date: 2023-11-27 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 a99eafa2538eb..c8152e5f28a4c 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2023-11-16 +date: 2023-11-27 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 e7cf47e62c84e..3ac9b9eac437e 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index c93ae48160847..56dcc47067b94 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-11-16 +date: 2023-11-27 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 d542afec010cb..3ef5d9072f7a9 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 3c377155867d4..dca8f6ae501ee 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_search_api_panels.devdocs.json index 8558d593d4290..5c01dba786845 100644 --- a/api_docs/kbn_search_api_panels.devdocs.json +++ b/api_docs/kbn_search_api_panels.devdocs.json @@ -279,7 +279,7 @@ "label": "IngestData", "description": [], "signature": [ - "({ codeSnippet, selectedLanguage, setSelectedLanguage, docLinks, assetBasePath, application, sharePlugin, languages, consoleRequest, }: React.PropsWithChildren) => JSX.Element" + "({ codeSnippet, selectedLanguage, setSelectedLanguage, docLinks, assetBasePath, application, sharePlugin, languages, consoleRequest, additionalIngestionPanel, }: React.PropsWithChildren) => JSX.Element" ], "path": "packages/kbn-search-api-panels/components/ingest_data.tsx", "deprecated": false, @@ -290,7 +290,7 @@ "id": "def-common.IngestData.$1", "type": "CompoundType", "tags": [], - "label": "{\n codeSnippet,\n selectedLanguage,\n setSelectedLanguage,\n docLinks,\n assetBasePath,\n application,\n sharePlugin,\n languages,\n consoleRequest,\n}", + "label": "{\n codeSnippet,\n selectedLanguage,\n setSelectedLanguage,\n docLinks,\n assetBasePath,\n application,\n sharePlugin,\n languages,\n consoleRequest,\n additionalIngestionPanel,\n}", "description": [], "signature": [ "React.PropsWithChildren" @@ -306,29 +306,29 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.InstallClientPanel", + "id": "def-common.IngestionsPanel", "type": "Function", "tags": [], - "label": "InstallClientPanel", + "label": "IngestionsPanel", "description": [], "signature": [ - "({ codeSnippet, consoleRequest, language, languages, setSelectedLanguage, assetBasePath, application, sharePlugin, isPanelLeft, overviewPanelProps, }: React.PropsWithChildren) => JSX.Element" + "({ additionalIngestionPanel, docLinks, assetBasePath, }: React.PropsWithChildren) => JSX.Element" ], - "path": "packages/kbn-search-api-panels/components/install_client.tsx", + "path": "packages/kbn-search-api-panels/components/ingestions_panel.tsx", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.InstallClientPanel.$1", + "id": "def-common.IngestionsPanel.$1", "type": "CompoundType", "tags": [], - "label": "{\n codeSnippet,\n consoleRequest,\n language,\n languages,\n setSelectedLanguage,\n assetBasePath,\n application,\n sharePlugin,\n isPanelLeft = true,\n overviewPanelProps,\n}", + "label": "{\n additionalIngestionPanel,\n docLinks,\n assetBasePath,\n}", "description": [], "signature": [ - "React.PropsWithChildren" + "React.PropsWithChildren" ], - "path": "packages/kbn-search-api-panels/components/install_client.tsx", + "path": "packages/kbn-search-api-panels/components/ingestions_panel.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -339,45 +339,29 @@ }, { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.IntegrationsPanel", + "id": "def-common.InstallClientPanel", "type": "Function", "tags": [], - "label": "IntegrationsPanel", + "label": "InstallClientPanel", "description": [], "signature": [ - "({ docLinks, assetBasePath, }: React.PropsWithChildren<", - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.IntegrationsPanelProps", - "text": "IntegrationsPanelProps" - }, - ">) => JSX.Element" + "({ codeSnippet, consoleRequest, language, languages, setSelectedLanguage, assetBasePath, application, sharePlugin, isPanelLeft, overviewPanelProps, }: React.PropsWithChildren) => JSX.Element" ], - "path": "packages/kbn-search-api-panels/components/integrations_panel.tsx", + "path": "packages/kbn-search-api-panels/components/install_client.tsx", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.IntegrationsPanel.$1", + "id": "def-common.InstallClientPanel.$1", "type": "CompoundType", "tags": [], - "label": "{\n docLinks,\n assetBasePath,\n}", + "label": "{\n codeSnippet,\n consoleRequest,\n language,\n languages,\n setSelectedLanguage,\n assetBasePath,\n application,\n sharePlugin,\n isPanelLeft = true,\n overviewPanelProps,\n}", "description": [], "signature": [ - "React.PropsWithChildren<", - { - "pluginId": "@kbn/search-api-panels", - "scope": "common", - "docId": "kibKbnSearchApiPanelsPluginApi", - "section": "def-common.IntegrationsPanelProps", - "text": "IntegrationsPanelProps" - }, - ">" + "React.PropsWithChildren" ], - "path": "packages/kbn-search-api-panels/components/integrations_panel.tsx", + "path": "packages/kbn-search-api-panels/components/install_client.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -599,45 +583,6 @@ } ], "interfaces": [ - { - "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.IntegrationsPanelProps", - "type": "Interface", - "tags": [], - "label": "IntegrationsPanelProps", - "description": [], - "path": "packages/kbn-search-api-panels/components/integrations_panel.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.IntegrationsPanelProps.docLinks", - "type": "Object", - "tags": [], - "label": "docLinks", - "description": [], - "signature": [ - "{ beats: string; connectors: string; logstash: string; }" - ], - "path": "packages/kbn-search-api-panels/components/integrations_panel.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-api-panels", - "id": "def-common.IntegrationsPanelProps.assetBasePath", - "type": "string", - "tags": [], - "label": "assetBasePath", - "description": [], - "path": "packages/kbn-search-api-panels/components/integrations_panel.tsx", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/search-api-panels", "id": "def-common.LanguageDefinition", diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index d9f68be0e350d..f6fd1b0ac962b 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 69 | 0 | 69 | 0 | +| 66 | 0 | 66 | 0 | ## Common diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index c76aff70b345b..7c984b960694f 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.devdocs.json b/api_docs/kbn_search_response_warnings.devdocs.json index ec2406fc599db..e17c541ee9744 100644 --- a/api_docs/kbn_search_response_warnings.devdocs.json +++ b/api_docs/kbn_search_response_warnings.devdocs.json @@ -19,6 +19,78 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/search-response-warnings", + "id": "def-common.getWarningsDescription", + "type": "Function", + "tags": [], + "label": "getWarningsDescription", + "description": [], + "signature": [ + "(warnings: ", + "SearchResponseIncompleteWarning", + "[]) => string" + ], + "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/i18n_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-response-warnings", + "id": "def-common.getWarningsDescription.$1", + "type": "Array", + "tags": [], + "label": "warnings", + "description": [], + "signature": [ + "SearchResponseIncompleteWarning", + "[]" + ], + "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/i18n_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-response-warnings", + "id": "def-common.getWarningsTitle", + "type": "Function", + "tags": [], + "label": "getWarningsTitle", + "description": [], + "signature": [ + "(warnings: ", + "SearchResponseIncompleteWarning", + "[]) => string" + ], + "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/i18n_utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-response-warnings", + "id": "def-common.getWarningsTitle.$1", + "type": "Array", + "tags": [], + "label": "warnings", + "description": [], + "signature": [ + "SearchResponseIncompleteWarning", + "[]" + ], + "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/i18n_utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/search-response-warnings", "id": "def-common.hasUnsupportedDownsampledAggregationFailure", @@ -185,6 +257,39 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/search-response-warnings", + "id": "def-common.ViewDetailsPopover", + "type": "Function", + "tags": [], + "label": "ViewDetailsPopover", + "description": [], + "signature": [ + "(props: Props) => JSX.Element | null" + ], + "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/view_details_popover.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/search-response-warnings", + "id": "def-common.ViewDetailsPopover.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "Props" + ], + "path": "packages/kbn-search-response-warnings/src/components/search_response_warnings/view_details_popover.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [], diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 945b2ae3e6997..2b7077a7831ec 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 14 | 0 | 12 | 1 | +| 20 | 0 | 18 | 1 | ## Common diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index acfe12918e43a..507953da04d21 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-11-16 +date: 2023-11-27 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 83314b028e90c..1da33f2f7e413 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-11-16 +date: 2023-11-27 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 954e8635746a8..7a3f1ad969859 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-11-16 +date: 2023-11-27 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 8314689fb6727..edc3b5501f734 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-11-16 +date: 2023-11-27 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 9a5e450d64ca5..55f72249e0785 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_securitysolution_data_table.devdocs.json index 7bdb8cf370862..b003dd04c9e82 100644 --- a/api_docs/kbn_securitysolution_data_table.devdocs.json +++ b/api_docs/kbn_securitysolution_data_table.devdocs.json @@ -1864,6 +1864,14 @@ "section": "def-common.TableEntityType", "text": "TableEntityType" }, + "; \"risk-inputs\": ", + { + "pluginId": "@kbn/securitysolution-data-table", + "scope": "common", + "docId": "kibKbnSecuritysolutionDataTablePluginApi", + "section": "def-common.TableEntityType", + "text": "TableEntityType" + }, "; }" ], "path": "x-pack/packages/security-solution/data_table/common/types/data_table/index.ts", diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index a47ddc3626bed..752f157daab3c 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-11-16 +date: 2023-11-27 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 37d81e7a893d1..f5557c02a3b5c 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-11-16 +date: 2023-11-27 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 2139e894450e1..0f1e833b1d9f4 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 a60e455be1903..5443c6add842c 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-11-16 +date: 2023-11-27 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 a5f7d5a720963..7d4beeb6b0eb1 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-11-16 +date: 2023-11-27 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 1230620c33ce0..b51b472147d26 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 4d7f46b3fbae4..65ddef0b0eb72 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-11-16 +date: 2023-11-27 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 72e993e176104..e62d2db1e425d 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-11-16 +date: 2023-11-27 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 b8f33bd276518..7c9418a80b6d6 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-11-16 +date: 2023-11-27 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 9358eaf1778c0..97780286c3726 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 43ff4d8d86e7c..62a9b52611beb 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-11-16 +date: 2023-11-27 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 da004a21dfea1..49515d75e36fe 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-11-16 +date: 2023-11-27 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 a89758a11264a..2a9a06d05fa72 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-11-16 +date: 2023-11-27 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 ed415baa56521..a5ad21eb596fb 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 78284029c6d3c..ea798c7a6e488 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-11-16 +date: 2023-11-27 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 d89bf951b8909..83e71ee4c643d 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-11-16 +date: 2023-11-27 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 f1ca29e4324d7..615ecb46009c0 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_server_http_tools.devdocs.json index ace0c332ca518..768f9868081a4 100644 --- a/api_docs/kbn_server_http_tools.devdocs.json +++ b/api_docs/kbn_server_http_tools.devdocs.json @@ -177,6 +177,52 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.SslConfig.isEqualTo", + "type": "Function", + "tags": [], + "label": "isEqualTo", + "description": [], + "signature": [ + "(otherConfig: ", + { + "pluginId": "@kbn/server-http-tools", + "scope": "common", + "docId": "kibKbnServerHttpToolsPluginApi", + "section": "def-common.SslConfig", + "text": "SslConfig" + }, + ") => boolean" + ], + "path": "packages/kbn-server-http-tools/src/ssl/ssl_config.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.SslConfig.isEqualTo.$1", + "type": "Object", + "tags": [], + "label": "otherConfig", + "description": [], + "signature": [ + { + "pluginId": "@kbn/server-http-tools", + "scope": "common", + "docId": "kibKbnServerHttpToolsPluginApi", + "section": "def-common.SslConfig", + "text": "SslConfig" + } + ], + "path": "packages/kbn-server-http-tools/src/ssl/ssl_config.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false @@ -492,6 +538,125 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.getServerTLSOptions", + "type": "Function", + "tags": [], + "label": "getServerTLSOptions", + "description": [ + "\nConverts Kibana `SslConfig` into `TLSOptions` that are accepted by the Hapi server,\nand by https.Server.setSecureContext()" + ], + "signature": [ + "(ssl: ", + { + "pluginId": "@kbn/server-http-tools", + "scope": "common", + "docId": "kibKbnServerHttpToolsPluginApi", + "section": "def-common.ISslConfig", + "text": "ISslConfig" + }, + ") => ", + "ServerOptions", + " | undefined" + ], + "path": "packages/kbn-server-http-tools/src/get_server_options.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.getServerTLSOptions.$1", + "type": "Object", + "tags": [], + "label": "ssl", + "description": [], + "signature": [ + { + "pluginId": "@kbn/server-http-tools", + "scope": "common", + "docId": "kibKbnServerHttpToolsPluginApi", + "section": "def-common.ISslConfig", + "text": "ISslConfig" + } + ], + "path": "packages/kbn-server-http-tools/src/get_server_options.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.setTlsConfig", + "type": "Function", + "tags": [], + "label": "setTlsConfig", + "description": [], + "signature": [ + "(hapiServer: ", + "Server", + ", sslConfig: ", + { + "pluginId": "@kbn/server-http-tools", + "scope": "common", + "docId": "kibKbnServerHttpToolsPluginApi", + "section": "def-common.ISslConfig", + "text": "ISslConfig" + }, + ") => void" + ], + "path": "packages/kbn-server-http-tools/src/set_tls_config.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.setTlsConfig.$1", + "type": "Object", + "tags": [], + "label": "hapiServer", + "description": [], + "signature": [ + "Server" + ], + "path": "packages/kbn-server-http-tools/src/set_tls_config.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/server-http-tools", + "id": "def-common.setTlsConfig.$2", + "type": "Object", + "tags": [], + "label": "sslConfig", + "description": [], + "signature": [ + { + "pluginId": "@kbn/server-http-tools", + "scope": "common", + "docId": "kibKbnServerHttpToolsPluginApi", + "section": "def-common.ISslConfig", + "text": "ISslConfig" + } + ], + "path": "packages/kbn-server-http-tools/src/set_tls_config.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [ diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 39dd797375d76..9e54f0a494c72 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 54 | 0 | 51 | 1 | +| 61 | 0 | 57 | 1 | ## Common diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 50fecfe29e162..6495770b5f165 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-11-16 +date: 2023-11-27 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 6dceb8358359c..627aeed7e7975 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-11-16 +date: 2023-11-27 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 9cfec64031908..08d8224681a2e 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-11-16 +date: 2023-11-27 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 63f0b32b0f2fd..1556f824669a3 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-11-16 +date: 2023-11-27 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 27dd6e08fe451..ad41683099835 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-11-16 +date: 2023-11-27 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 7f594a11d155d..5f3395813b4f3 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-11-16 +date: 2023-11-27 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 b50171c4b28f5..518c647b16084 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-11-16 +date: 2023-11-27 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 30112dfacaec2..1a59cec3df394 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-11-16 +date: 2023-11-27 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 0ad6bb9cae25d..2071c397d3419 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-11-16 +date: 2023-11-27 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 4f62db815bb12..67efa360022a2 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-11-16 +date: 2023-11-27 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 9af0278eb636a..a2b252afffa5b 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-11-16 +date: 2023-11-27 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 2597afee40c8b..b24a811e7a2da 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-11-16 +date: 2023-11-27 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 42e8b367cc01c..2474dfd520df8 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 5bd9ca718f0d8..a3f7c71536e50 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-11-16 +date: 2023-11-27 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 d8e841f557bec..aa3e4be20aa1c 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2023-11-16 +date: 2023-11-27 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 fc319ba7b1727..6427403f67ca3 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-11-16 +date: 2023-11-27 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 5d16acbe371a8..ae22ff568ed1b 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-11-16 +date: 2023-11-27 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 98e21161e49af..5156a3fb18c41 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 132f52fb52ad7..cbb3ec18e81ca 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 3cb96a8c84b47..14ef7677eda3c 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-11-16 +date: 2023-11-27 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 ba5b55fe70c17..d5fc7d2f4bacf 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-11-16 +date: 2023-11-27 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 36937770ff197..2b49d1343f112 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-11-16 +date: 2023-11-27 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 538be5651a652..dcff7c006c53c 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_shared_ux_link_redirect_app.devdocs.json index ae8568c37433d..aa7633649473f 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.devdocs.json +++ b/api_docs/kbn_shared_ux_link_redirect_app.devdocs.json @@ -29,7 +29,9 @@ "\nA service-enabled component that provides Kibana-specific functionality to the `RedirectAppLinks`\npure component.\n" ], "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" + "({ children, ...props }: React.PropsWithChildren>) => JSX.Element" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx", "deprecated": false, @@ -38,12 +40,14 @@ { "parentPluginId": "@kbn/shared-ux-link-redirect-app", "id": "def-common.RedirectAppLinks.$1", - "type": "Object", + "type": "CompoundType", "tags": [], - "label": "{ children }", + "label": "{\n children,\n ...props\n}", "description": [], "signature": [ - "{ children?: React.ReactNode; }" + "React.PropsWithChildren>" ], "path": "packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx", "deprecated": false, @@ -64,7 +68,7 @@ "\nUtility component that will intercept click events on children anchor (``) elements to call\n`navigateToUrl` with the link's href. This will trigger SPA friendly navigation when the link points\nto a valid Kibana app.\n" ], "signature": [ - "({ children, navigateToUrl, currentAppId, }: React.PropsWithChildren<", + "({ children, navigateToUrl, currentAppId, ...containerProps }: React.PropsWithChildren<", "RedirectAppLinksComponentProps", ">) => JSX.Element" ], @@ -77,7 +81,7 @@ "id": "def-common.RedirectAppLinks.$1", "type": "CompoundType", "tags": [], - "label": "{\n children,\n navigateToUrl,\n currentAppId,\n}", + "label": "{\n children,\n navigateToUrl,\n currentAppId,\n ...containerProps\n}", "description": [], "signature": [ "React.PropsWithChildren<", @@ -317,9 +321,11 @@ "Props for the `RedirectAppLinks` component." ], "signature": [ + "(", "RedirectAppLinksKibanaDependencies", " | ", - "RedirectAppLinksServices" + "RedirectAppLinksServices", + ") & React.ClassAttributes & React.HTMLAttributes" ], "path": "packages/shared-ux/link/redirect_app/types/index.d.ts", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 9b9e16d37e10c..4f936dfedb215 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-11-16 +date: 2023-11-27 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 1c9aed9177222..87ea1867d73e7 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 8b9880d8e2c30..dcd183b065486 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-11-16 +date: 2023-11-27 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 4148f5aa9bb7d..f535d02e139c6 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 ce94459105031..a87bd9f1d5869 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-11-16 +date: 2023-11-27 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 0f0e2b5249369..51dd2bff0c776 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 dfb064bb8f274..68aa2f1d9d20d 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-11-16 +date: 2023-11-27 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 3fcba2e9a7d10..eca4e7ae0e407 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 914f0dfe2e92b..d7be625f17fac 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-11-16 +date: 2023-11-27 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 2014e9f282395..d8e11d74a6604 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 24fb883d80c31..29af46a5457ce 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-11-16 +date: 2023-11-27 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 05879319e3bd4..70a715bc84c50 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-11-16 +date: 2023-11-27 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 3a5f7a3ff9acd..fe00d62d66515 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 7e3bff9e8e1fc..bbb8b930152a5 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 7790de025448c..d7491f8fb0605 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-11-16 +date: 2023-11-27 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 bf75854940084..070f55c61b0fb 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-11-16 +date: 2023-11-27 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 65a4f10bb7165..0528f8d96557f 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 2746bdc980ce4..00d9eddda204f 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-11-16 +date: 2023-11-27 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 3968d04cd7954..32cf5281f9a3a 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-11-16 +date: 2023-11-27 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 5478a5d9d8c60..4c26b0496c82e 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-11-16 +date: 2023-11-27 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 0e019d281ec0c..a87e196f18360 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-11-16 +date: 2023-11-27 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 eb9dc7a265492..4539b650bbb49 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index b900f78725434..90136cd9784e5 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.devdocs.json b/api_docs/kbn_slo_schema.devdocs.json index e11a54eb98d65..4e8b55b423af0 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -398,115 +398,7 @@ "initialIsOpen": false } ], - "interfaces": [ - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Paginated", - "type": "Interface", - "tags": [], - "label": "Paginated", - "description": [], - "signature": [ - { - "pluginId": "@kbn/slo-schema", - "scope": "common", - "docId": "kibKbnSloSchemaPluginApi", - "section": "def-common.Paginated", - "text": "Paginated" - }, - "" - ], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Paginated.total", - "type": "number", - "tags": [], - "label": "total", - "description": [], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Paginated.page", - "type": "number", - "tags": [], - "label": "page", - "description": [], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Paginated.perPage", - "type": "number", - "tags": [], - "label": "perPage", - "description": [], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Paginated.results", - "type": "Array", - "tags": [], - "label": "results", - "description": [], - "signature": [ - "T[]" - ], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Pagination", - "type": "Interface", - "tags": [], - "label": "Pagination", - "description": [], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Pagination.page", - "type": "number", - "tags": [], - "label": "page", - "description": [], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.Pagination.perPage", - "type": "number", - "tags": [], - "label": "perPage", - "description": [], - "path": "x-pack/packages/kbn-slo-schema/src/models/pagination.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], + "interfaces": [], "enums": [ { "parentPluginId": "@kbn/slo-schema", @@ -729,28 +621,17 @@ }, { "parentPluginId": "@kbn/slo-schema", - "id": "def-common.FindSLODefinitionsParams", + "id": "def-common.FindSloDefinitionsResponse", "type": "Type", - "tags": [], - "label": "FindSLODefinitionsParams", - "description": [], - "signature": [ - "{ search?: string | undefined; includeOutdatedOnly?: boolean | undefined; page?: string | undefined; perPage?: string | undefined; }" + "tags": [ + "private" + ], + "label": "FindSloDefinitionsResponse", + "description": [ + "\nThe response type for /internal/observability/slo/_definitions\n" ], - "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.FindSLODefinitionsResponse", - "type": "Type", - "tags": [], - "label": "FindSLODefinitionsResponse", - "description": [], "signature": [ - "{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; })[]; }" + "({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -780,7 +661,7 @@ "label": "FindSLOResponse", "description": [], "signature": [ - "{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }" + "{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -795,7 +676,7 @@ "label": "GetPreviewDataParams", "description": [], "signature": [ - "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }" + "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -810,7 +691,7 @@ "label": "GetPreviewDataResponse", "description": [], "signature": [ - "{ date: string; sliValue: number; }[]" + "({ date: string; sliValue: number; } & { events?: { good: number; bad: number; total: number; } | undefined; })[]" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -870,7 +751,7 @@ "label": "GetSLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -982,36 +863,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.ResetSLOParams", - "type": "Type", - "tags": [], - "label": "ResetSLOParams", - "description": [], - "signature": [ - "{ id: string; }" - ], - "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.ResetSLOResponse", - "type": "Type", - "tags": [], - "label": "ResetSLOResponse", - "description": [], - "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; }" - ], - "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/slo-schema", "id": "def-common.SLOResponse", @@ -1020,7 +871,7 @@ "label": "SLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -1035,7 +886,7 @@ "label": "SLOWithSummaryResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -1195,7 +1046,7 @@ "label": "UpdateSLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -2094,21 +1945,19 @@ "parentPluginId": "@kbn/slo-schema", "id": "def-common.findSloDefinitionsParamsSchema", "type": "Object", - "tags": [], + "tags": [ + "private" + ], "label": "findSloDefinitionsParamsSchema", - "description": [], + "description": [ + "\nThe query params schema for /internal/observability/slo/_definitions\n" + ], "signature": [ - "PartialC", + "TypeC", "<{ query: ", - "PartialC", + "TypeC", "<{ search: ", "StringC", - "; includeOutdatedOnly: ", - "Type", - "; page: ", - "StringC", - "; perPage: ", - "StringC", "; }>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", @@ -2120,18 +1969,14 @@ "parentPluginId": "@kbn/slo-schema", "id": "def-common.findSloDefinitionsResponseSchema", "type": "Object", - "tags": [], + "tags": [ + "private" + ], "label": "findSloDefinitionsResponseSchema", - "description": [], + "description": [ + "\nThe response schema for /internal/observability/slo/_definitions\n" + ], "signature": [ - "TypeC", - "<{ page: ", - "NumberC", - "; perPage: ", - "NumberC", - "; total: ", - "NumberC", - "; results: ", "ArrayC", "<", "IntersectionC", @@ -2569,9 +2414,7 @@ "Type", "; updatedAt: ", "Type", - "; version: ", - "NumberC", - "; }>, ", + "; }>, ", "PartialC", "<{ instanceId: ", "UnionC", @@ -2579,7 +2422,7 @@ "LiteralC", "<\"*\">, ", "StringC", - "]>; }>]>>; }>" + "]>; }>]>>" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -3081,9 +2924,7 @@ "Type", "; updatedAt: ", "Type", - "; version: ", - "NumberC", - "; }>, ", + "; }>, ", "PartialC", "<{ instanceId: ", "UnionC", @@ -3465,7 +3306,13 @@ "PartialC", "<{ filter: ", "StringC", - "; }>]>; }>]>; }>; }>" + "; }>]>; }>]>; range: ", + "TypeC", + "<{ start: ", + "NumberC", + "; end: ", + "NumberC", + "; }>; }>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -3482,12 +3329,24 @@ "signature": [ "ArrayC", "<", + "IntersectionC", + "<[", "TypeC", "<{ date: ", "Type", "; sliValue: ", "NumberC", - "; }>>" + "; }>, ", + "PartialC", + "<{ events: ", + "TypeC", + "<{ good: ", + "NumberC", + "; bad: ", + "NumberC", + "; total: ", + "NumberC", + "; }>; }>]>>" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -4083,9 +3942,7 @@ "Type", "; updatedAt: ", "Type", - "; version: ", - "NumberC", - "; }>, ", + "; }>, ", "PartialC", "<{ instanceId: ", "UnionC", @@ -5022,12 +4879,24 @@ "label": "previewDataSchema", "description": [], "signature": [ + "IntersectionC", + "<[", "TypeC", "<{ date: ", "Type", "; sliValue: ", "NumberC", - "; }>" + "; }>, ", + "PartialC", + "<{ events: ", + "TypeC", + "<{ good: ", + "NumberC", + "; bad: ", + "NumberC", + "; total: ", + "NumberC", + "; }>; }>]>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/common.ts", "deprecated": false, @@ -5036,536 +4905,56 @@ }, { "parentPluginId": "@kbn/slo-schema", - "id": "def-common.resetSLOParamsSchema", + "id": "def-common.rollingTimeWindowSchema", "type": "Object", "tags": [], - "label": "resetSLOParamsSchema", + "label": "rollingTimeWindowSchema", "description": [], "signature": [ "TypeC", - "<{ path: ", - "TypeC", - "<{ id: ", - "StringC", - "; }>; }>" + "<{ duration: ", + "Type", + "<", + { + "pluginId": "@kbn/slo-schema", + "scope": "common", + "docId": "kibKbnSloSchemaPluginApi", + "section": "def-common.Duration", + "text": "Duration" + }, + ", string, unknown>; type: ", + "LiteralC", + "<\"rolling\">; }>" ], - "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", + "path": "x-pack/packages/kbn-slo-schema/src/schema/time_window.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/slo-schema", - "id": "def-common.resetSLOResponseSchema", + "id": "def-common.rollingTimeWindowTypeSchema", "type": "Object", "tags": [], - "label": "resetSLOResponseSchema", + "label": "rollingTimeWindowTypeSchema", "description": [], "signature": [ - "IntersectionC", - "<[", - "TypeC", - "<{ id: ", - "StringC", - "; name: ", - "StringC", - "; description: ", - "StringC", - "; indicator: ", - "UnionC", - "<[", - "TypeC", - "<{ type: ", "LiteralC", - "<\"sli.apm.transactionDuration\">; params: ", - "IntersectionC", - "<[", - "TypeC", - "<{ environment: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; service: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; transactionType: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; transactionName: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; threshold: ", - "NumberC", - "; index: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>; }>, ", - "TypeC", - "<{ type: ", - "LiteralC", - "<\"sli.apm.transactionErrorRate\">; params: ", - "IntersectionC", - "<[", - "TypeC", - "<{ environment: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; service: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; transactionType: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; transactionName: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; index: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>; }>, ", - "TypeC", - "<{ type: ", - "LiteralC", - "<\"sli.kql.custom\">; params: ", - "IntersectionC", - "<[", - "TypeC", - "<{ index: ", - "StringC", - "; good: ", - "StringC", - "; total: ", - "StringC", - "; timestampField: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>; }>, ", - "TypeC", - "<{ type: ", - "LiteralC", - "<\"sli.metric.custom\">; params: ", - "IntersectionC", - "<[", - "TypeC", - "<{ index: ", - "StringC", - "; good: ", - "TypeC", - "<{ metrics: ", - "ArrayC", - "<", - "UnionC", - "<[", - "IntersectionC", - "<[", - "TypeC", - "<{ name: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"sum\">; field: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>, ", - "IntersectionC", - "<[", - "TypeC", - "<{ name: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"doc_count\">; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>]>>; equation: ", - "StringC", - "; }>; total: ", - "TypeC", - "<{ metrics: ", - "ArrayC", - "<", - "UnionC", - "<[", - "IntersectionC", - "<[", - "TypeC", - "<{ name: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"sum\">; field: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>, ", - "IntersectionC", - "<[", - "TypeC", - "<{ name: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"doc_count\">; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>]>>; equation: ", - "StringC", - "; }>; timestampField: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>; }>, ", - "TypeC", - "<{ type: ", - "LiteralC", - "<\"sli.metric.timeslice\">; params: ", - "IntersectionC", - "<[", - "TypeC", - "<{ index: ", - "StringC", - "; metric: ", - "TypeC", - "<{ metrics: ", - "ArrayC", - "<", - "UnionC", - "<[", - "IntersectionC", - "<[", - "TypeC", - "<{ name: ", - "StringC", - "; aggregation: ", - "KeyofC", - "<{ avg: boolean; max: boolean; min: boolean; sum: boolean; cardinality: boolean; last_value: boolean; std_deviation: boolean; }>; field: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>, ", - "IntersectionC", - "<[", - "TypeC", - "<{ name: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"doc_count\">; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>, ", - "IntersectionC", - "<[", - "TypeC", - "<{ name: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"percentile\">; field: ", - "StringC", - "; percentile: ", - "NumberC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>]>>; equation: ", - "StringC", - "; threshold: ", - "NumberC", - "; comparator: ", - "KeyofC", - "<{ GT: string; GTE: string; LT: string; LTE: string; }>; }>; timestampField: ", - "StringC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>; }>, ", - "TypeC", - "<{ type: ", - "LiteralC", - "<\"sli.histogram.custom\">; params: ", - "IntersectionC", - "<[", - "TypeC", - "<{ index: ", - "StringC", - "; timestampField: ", - "StringC", - "; good: ", - "UnionC", - "<[", - "IntersectionC", - "<[", - "TypeC", - "<{ field: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"value_count\">; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>, ", - "IntersectionC", - "<[", - "TypeC", - "<{ field: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"range\">; from: ", - "NumberC", - "; to: ", - "NumberC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>]>; total: ", - "UnionC", - "<[", - "IntersectionC", - "<[", - "TypeC", - "<{ field: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"value_count\">; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>, ", - "IntersectionC", - "<[", - "TypeC", - "<{ field: ", - "StringC", - "; aggregation: ", - "LiteralC", - "<\"range\">; from: ", - "NumberC", - "; to: ", - "NumberC", - "; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>]>; }>, ", - "PartialC", - "<{ filter: ", - "StringC", - "; }>]>; }>]>; timeWindow: ", - "UnionC", - "<[", - "TypeC", - "<{ duration: ", - "Type", - "<", - { - "pluginId": "@kbn/slo-schema", - "scope": "common", - "docId": "kibKbnSloSchemaPluginApi", - "section": "def-common.Duration", - "text": "Duration" - }, - ", string, unknown>; type: ", - "LiteralC", - "<\"rolling\">; }>, ", - "TypeC", - "<{ duration: ", - "Type", - "<", - { - "pluginId": "@kbn/slo-schema", - "scope": "common", - "docId": "kibKbnSloSchemaPluginApi", - "section": "def-common.Duration", - "text": "Duration" - }, - ", string, unknown>; type: ", - "LiteralC", - "<\"calendarAligned\">; }>]>; budgetingMethod: ", - "UnionC", - "<[", - "LiteralC", - "<\"occurrences\">, ", - "LiteralC", - "<\"timeslices\">]>; objective: ", - "IntersectionC", - "<[", - "TypeC", - "<{ target: ", - "NumberC", - "; }>, ", - "PartialC", - "<{ timesliceTarget: ", - "NumberC", - "; timesliceWindow: ", - "Type", - "<", - { - "pluginId": "@kbn/slo-schema", - "scope": "common", - "docId": "kibKbnSloSchemaPluginApi", - "section": "def-common.Duration", - "text": "Duration" - }, - ", string, unknown>; }>]>; revision: ", - "NumberC", - "; settings: ", - "TypeC", - "<{ syncDelay: ", - "Type", - "<", - { - "pluginId": "@kbn/slo-schema", - "scope": "common", - "docId": "kibKbnSloSchemaPluginApi", - "section": "def-common.Duration", - "text": "Duration" - }, - ", string, unknown>; frequency: ", - "Type", - "<", - { - "pluginId": "@kbn/slo-schema", - "scope": "common", - "docId": "kibKbnSloSchemaPluginApi", - "section": "def-common.Duration", - "text": "Duration" - }, - ", string, unknown>; }>; enabled: ", - "BooleanC", - "; tags: ", - "ArrayC", - "<", - "StringC", - ">; groupBy: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; createdAt: ", - "Type", - "; updatedAt: ", - "Type", - "; version: ", - "NumberC", - "; }>, ", - "PartialC", - "<{ instanceId: ", - "UnionC", - "<[", - "LiteralC", - "<\"*\">, ", - "StringC", - "]>; }>]>" - ], - "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.rollingTimeWindowSchema", - "type": "Object", - "tags": [], - "label": "rollingTimeWindowSchema", - "description": [], - "signature": [ - "TypeC", - "<{ duration: ", - "Type", - "<", - { - "pluginId": "@kbn/slo-schema", - "scope": "common", - "docId": "kibKbnSloSchemaPluginApi", - "section": "def-common.Duration", - "text": "Duration" - }, - ", string, unknown>; type: ", - "LiteralC", - "<\"rolling\">; }>" - ], - "path": "x-pack/packages/kbn-slo-schema/src/schema/time_window.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.rollingTimeWindowTypeSchema", - "type": "Object", - "tags": [], - "label": "rollingTimeWindowTypeSchema", - "description": [], - "signature": [ - "LiteralC", - "<\"rolling\">" - ], - "path": "x-pack/packages/kbn-slo-schema/src/schema/time_window.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/slo-schema", - "id": "def-common.settingsSchema", - "type": "Object", - "tags": [], - "label": "settingsSchema", - "description": [], - "signature": [ + "<\"rolling\">" + ], + "path": "x-pack/packages/kbn-slo-schema/src/schema/time_window.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/slo-schema", + "id": "def-common.settingsSchema", + "type": "Object", + "tags": [], + "label": "settingsSchema", + "description": [], + "signature": [ "TypeC", "<{ syncDelay: ", "Type", @@ -6052,9 +5441,7 @@ "Type", "; updatedAt: ", "Type", - "; version: ", - "NumberC", - "; }>, ", + "; }>, ", "PartialC", "<{ instanceId: ", "UnionC", @@ -6510,9 +5897,7 @@ "LiteralC", "<\"*\">, ", "StringC", - "]>; version: ", - "NumberC", - "; }>" + "]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/slo.ts", "deprecated": false, @@ -6964,9 +6349,7 @@ "Type", "; updatedAt: ", "Type", - "; version: ", - "NumberC", - "; }>, ", + "; }>, ", "PartialC", "<{ instanceId: ", "UnionC", @@ -7450,9 +6833,7 @@ "LiteralC", "<\"*\">, ", "StringC", - "]>; version: ", - "NumberC", - "; }>, ", + "]>; }>, ", "TypeC", "<{ summary: ", "TypeC", @@ -8850,9 +8231,7 @@ "Type", "; updatedAt: ", "Type", - "; version: ", - "NumberC", - "; }>, ", + "; }>, ", "PartialC", "<{ instanceId: ", "UnionC", diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 7c42b258ebdeb..91bbb6bccfaaf 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 144 | 0 | 144 | 0 | +| 131 | 0 | 128 | 0 | ## Common @@ -34,9 +34,6 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ ### Classes -### Interfaces - - ### Enums diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 7fee4e17d1c91..d88c363df9a6c 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 23e06f334a209..16f5248597f3d 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-11-16 +date: 2023-11-27 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 cd6b795dc72c6..a5655f4688f06 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-11-16 +date: 2023-11-27 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 c6d366d7393e4..ce0af846f9b3c 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_subscription_tracking.devdocs.json b/api_docs/kbn_subscription_tracking.devdocs.json deleted file mode 100644 index ea9cdb7f07167..0000000000000 --- a/api_docs/kbn_subscription_tracking.devdocs.json +++ /dev/null @@ -1,519 +0,0 @@ -{ - "id": "@kbn/subscription-tracking", - "client": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { - "classes": [], - "functions": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.registerEvents", - "type": "Function", - "tags": [], - "label": "registerEvents", - "description": [ - "\nRegisters the subscription-specific event types" - ], - "signature": [ - "(analyticsClient: Pick<", - { - "pluginId": "@kbn/analytics-client", - "scope": "common", - "docId": "kibKbnAnalyticsClientPluginApi", - "section": "def-common.IAnalyticsClient", - "text": "IAnalyticsClient" - }, - ", \"registerEventType\">) => void" - ], - "path": "packages/kbn-subscription-tracking/src/services.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.registerEvents.$1", - "type": "Object", - "tags": [], - "label": "analyticsClient", - "description": [], - "signature": [ - "Pick<", - { - "pluginId": "@kbn/analytics-client", - "scope": "common", - "docId": "kibKbnAnalyticsClientPluginApi", - "section": "def-common.IAnalyticsClient", - "text": "IAnalyticsClient" - }, - ", \"registerEventType\">" - ], - "path": "packages/kbn-subscription-tracking/src/services.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionButton", - "type": "Function", - "tags": [], - "label": "SubscriptionButton", - "description": [ - "\nWrapper around `EuiButton` that provides subscription events" - ], - "signature": [ - "({\n subscriptionContext,\n children,\n ...restProps\n}: ", - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.SubscriptionButtonProps", - "text": "SubscriptionButtonProps" - }, - ") => JSX.Element" - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionButton.$1", - "type": "CompoundType", - "tags": [], - "label": "{\n subscriptionContext,\n children,\n ...restProps\n}", - "description": [], - "signature": [ - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.SubscriptionButtonProps", - "text": "SubscriptionButtonProps" - } - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionButtonEmpty", - "type": "Function", - "tags": [], - "label": "SubscriptionButtonEmpty", - "description": [ - "\nWrapper around `EuiButtonEmpty` that provides subscription events" - ], - "signature": [ - "({\n subscriptionContext,\n children,\n ...restProps\n}: ", - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.SubscriptionButtonEmptyProps", - "text": "SubscriptionButtonEmptyProps" - }, - ") => JSX.Element" - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionButtonEmpty.$1", - "type": "CompoundType", - "tags": [], - "label": "{\n subscriptionContext,\n children,\n ...restProps\n}", - "description": [], - "signature": [ - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.SubscriptionButtonEmptyProps", - "text": "SubscriptionButtonEmptyProps" - } - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionLink", - "type": "Function", - "tags": [], - "label": "SubscriptionLink", - "description": [ - "\nWrapper around `EuiLink` that provides subscription events" - ], - "signature": [ - "({\n subscriptionContext,\n children,\n ...restProps\n}: ", - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.SubscriptionLinkProps", - "text": "SubscriptionLinkProps" - }, - ") => JSX.Element" - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionLink.$1", - "type": "CompoundType", - "tags": [], - "label": "{\n subscriptionContext,\n children,\n ...restProps\n}", - "description": [], - "signature": [ - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.SubscriptionLinkProps", - "text": "SubscriptionLinkProps" - } - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionTrackingProvider", - "type": "Function", - "tags": [], - "label": "SubscriptionTrackingProvider", - "description": [ - "\nExternal services provider" - ], - "signature": [ - "({ children, ...services }: React.PropsWithChildren<", - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.Services", - "text": "Services" - }, - ">) => JSX.Element" - ], - "path": "packages/kbn-subscription-tracking/src/services.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionTrackingProvider.$1", - "type": "CompoundType", - "tags": [], - "label": "{ children, ...services }", - "description": [], - "signature": [ - "React.PropsWithChildren<", - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.Services", - "text": "Services" - }, - ">" - ], - "path": "packages/kbn-subscription-tracking/src/services.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - } - ], - "interfaces": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.Services", - "type": "Interface", - "tags": [], - "label": "Services", - "description": [], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.Services.navigateToApp", - "type": "Function", - "tags": [], - "label": "navigateToApp", - "description": [], - "signature": [ - "(app: string, options: { path: string; }) => void" - ], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.Services.navigateToApp.$1", - "type": "string", - "tags": [], - "label": "app", - "description": [], - "signature": [ - "string" - ], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.Services.navigateToApp.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.Services.navigateToApp.$2.path", - "type": "string", - "tags": [], - "label": "path", - "description": [], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [] - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.Services.analyticsClient", - "type": "Object", - "tags": [], - "label": "analyticsClient", - "description": [], - "signature": [ - "{ reportEvent: (eventType: string, eventData: EventTypeData) => void; }" - ], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionContextData", - "type": "Interface", - "tags": [], - "label": "SubscriptionContextData", - "description": [ - "\nA piece of metadata which consists of an identifier of the advertised feature and\nthe `source` (e.g. location) of the subscription element." - ], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionContextData.source", - "type": "CompoundType", - "tags": [], - "label": "source", - "description": [ - "\nA human-readable identifier describing the location of the beginning of the\nsubscription flow.\nLocation identifiers are prefixed with a solution identifier, e.g. `security__`\n" - ], - "signature": [ - "`observability__${string}` | `security__${string}`" - ], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionContextData.feature", - "type": "string", - "tags": [], - "label": "feature", - "description": [ - "\nA human-readable identifier describing the feature that is being promoted.\n" - ], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], - "enums": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.EVENT_NAMES", - "type": "Enum", - "tags": [], - "label": "EVENT_NAMES", - "description": [], - "path": "packages/kbn-subscription-tracking/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ], - "misc": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionButtonEmptyProps", - "type": "Type", - "tags": [], - "label": "SubscriptionButtonEmptyProps", - "description": [], - "signature": [ - "((", - "DisambiguateSet", - " & ", - "CommonEuiButtonEmptyProps", - " & { onClick?: React.MouseEventHandler | undefined; } & React.ButtonHTMLAttributes) | (", - "DisambiguateSet", - "<", - "EuiButtonEmptyPropsForButton", - ", EuiButtonEmptyPropsForAnchor> & ", - "CommonEuiButtonEmptyProps", - " & { href?: string | undefined; onClick?: React.MouseEventHandler | undefined; } & React.AnchorHTMLAttributes)) & CommonProps" - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionButtonProps", - "type": "Type", - "tags": [], - "label": "SubscriptionButtonProps", - "description": [], - "signature": [ - "EuiButtonProps", - " & CommonProps" - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionLinkProps", - "type": "Type", - "tags": [], - "label": "SubscriptionLinkProps", - "description": [], - "signature": [ - "((", - "DisambiguateSet", - "<", - "EuiLinkButtonProps", - ", ", - "EuiLinkAnchorProps", - "> & ", - "EuiLinkAnchorProps", - ") | (", - "DisambiguateSet", - "<", - "EuiLinkAnchorProps", - ", ", - "EuiLinkButtonProps", - "> & ", - "EuiLinkButtonProps", - ")) & CommonProps" - ], - "path": "packages/kbn-subscription-tracking/src/subscription_elements.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ], - "objects": [ - { - "parentPluginId": "@kbn/subscription-tracking", - "id": "def-common.SubscriptionTrackingContext", - "type": "Object", - "tags": [], - "label": "SubscriptionTrackingContext", - "description": [], - "signature": [ - "React.Context<", - { - "pluginId": "@kbn/subscription-tracking", - "scope": "common", - "docId": "kibKbnSubscriptionTrackingPluginApi", - "section": "def-common.Services", - "text": "Services" - }, - " | null>" - ], - "path": "packages/kbn-subscription-tracking/src/services.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ] - } -} \ No newline at end of file diff --git a/api_docs/kbn_subscription_tracking.mdx b/api_docs/kbn_subscription_tracking.mdx deleted file mode 100644 index ab44c4c5278cc..0000000000000 --- a/api_docs/kbn_subscription_tracking.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -#### -#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. -#### Reach out in #docs-engineering for more info. -#### -id: kibKbnSubscriptionTrackingPluginApi -slug: /kibana-dev-docs/api/kbn-subscription-tracking -title: "@kbn/subscription-tracking" -image: https://source.unsplash.com/400x175/?github -description: API docs for the @kbn/subscription-tracking plugin -date: 2023-11-16 -tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/subscription-tracking'] ---- -import kbnSubscriptionTrackingObj from './kbn_subscription_tracking.devdocs.json'; - - - -Contact [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) for questions regarding this plugin. - -**Code health stats** - -| Public API count | Any count | Items lacking comments | Missing exports | -|-------------------|-----------|------------------------|-----------------| -| 24 | 0 | 16 | 0 | - -## Common - -### Objects - - -### Functions - - -### Interfaces - - -### Enums - - -### Consts, variables and types - - diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 0945a0e2d111c..4b10daac6831c 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.devdocs.json b/api_docs/kbn_test.devdocs.json index 67c1c7a4a48c1..68147342a7a5e 100644 --- a/api_docs/kbn_test.devdocs.json +++ b/api_docs/kbn_test.devdocs.json @@ -3136,7 +3136,7 @@ "signature": [ "Pick<", "ServerlessOptions", - ", \"host\" | \"tag\" | \"image\" | \"resources\"> | undefined" + ", \"host\" | \"tag\" | \"image\" | \"resources\" | \"kibanaUrl\"> | undefined" ], "path": "packages/kbn-test/src/es/test_es_cluster.ts", "deprecated": false, diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 69bba2fc1f846..150b46adba5cc 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 2901e719fe490..fa4b11a399d57 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-11-16 +date: 2023-11-27 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 1764322c812e6..d46fcbd84fd9a 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.devdocs.json b/api_docs/kbn_text_based_editor.devdocs.json index 252a6537ae639..69205611cafdf 100644 --- a/api_docs/kbn_text_based_editor.devdocs.json +++ b/api_docs/kbn_text_based_editor.devdocs.json @@ -192,7 +192,9 @@ "type": "CompoundType", "tags": [], "label": "query", - "description": [], + "description": [ + "The aggregate type query" + ], "signature": [ "{ sql: string; } | { esql: string; }" ], @@ -206,7 +208,9 @@ "type": "Function", "tags": [], "label": "onTextLangQueryChange", - "description": [], + "description": [ + "Callback running everytime the query changes" + ], "signature": [ "(query: ", { @@ -252,14 +256,47 @@ "type": "Function", "tags": [], "label": "onTextLangQuerySubmit", - "description": [], + "description": [ + "Callback running when the user submits the query" + ], "signature": [ - "() => void" + "(query?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined) => void" ], "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit.$1", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], "returnComment": [] }, { @@ -268,7 +305,9 @@ "type": "Function", "tags": [], "label": "expandCodeEditor", - "description": [], + "description": [ + "Can be used to expand/minimize the editor" + ], "signature": [ "(status: boolean) => void" ], @@ -300,7 +339,9 @@ "type": "boolean", "tags": [], "label": "isCodeEditorExpanded", - "description": [], + "description": [ + "If it is true, the editor initializes with height EDITOR_INITIAL_HEIGHT_EXPANDED" + ], "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false @@ -311,7 +352,9 @@ "type": "CompoundType", "tags": [], "label": "detectTimestamp", - "description": [], + "description": [ + "If it is true, the editor displays the message @timestamp found\nThe text based queries are relying on adhoc dataviews which\ncan have an @timestamp timefield or nothing" + ], "signature": [ "boolean | undefined" ], @@ -325,7 +368,9 @@ "type": "Array", "tags": [], "label": "errors", - "description": [], + "description": [ + "Array of errors" + ], "signature": [ "Error[] | undefined" ], @@ -339,7 +384,9 @@ "type": "string", "tags": [], "label": "warning", - "description": [], + "description": [ + "Warning string as it comes from ES" + ], "signature": [ "string | undefined" ], @@ -353,7 +400,9 @@ "type": "CompoundType", "tags": [], "label": "isDisabled", - "description": [], + "description": [ + "Disables the editor" + ], "signature": [ "boolean | undefined" ], @@ -367,7 +416,9 @@ "type": "CompoundType", "tags": [], "label": "isDarkMode", - "description": [], + "description": [ + "Indicator if the editor is on dark mode" + ], "signature": [ "boolean | undefined" ], @@ -395,7 +446,9 @@ "type": "CompoundType", "tags": [], "label": "hideMinimizeButton", - "description": [], + "description": [ + "If true it hides the minimize button and the user can't return to the minimized version\nUseful when the application doesn't want to give this capability" + ], "signature": [ "boolean | undefined" ], @@ -409,7 +462,41 @@ "type": "CompoundType", "tags": [], "label": "hideRunQueryText", - "description": [], + "description": [ + "Hide the Run query information which appears on the footer" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.TextBasedLanguagesEditorProps.editorIsInline", + "type": "CompoundType", + "tags": [], + "label": "editorIsInline", + "description": [ + "This is used for applications (such as the inline editing flyout in dashboards)\nwhich want to add the editor without being part of the Unified search component\nIt renders a submit query button inside the editor" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.TextBasedLanguagesEditorProps.disableSubmitAction", + "type": "CompoundType", + "tags": [], + "label": "disableSubmitAction", + "description": [ + "Disables the submit query action" + ], "signature": [ "boolean | undefined" ], diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index e530782988665..5674730d4458b 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 22 | 0 | 21 | 0 | +| 25 | 0 | 10 | 0 | ## Client diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 8658e8c3dd4ac..724ec829f943e 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 9ced7a66855bc..39614d3fd634d 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-11-16 +date: 2023-11-27 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 77bdb5f91fd4c..026d331f9d74b 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-11-16 +date: 2023-11-27 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.devdocs.json b/api_docs/kbn_ui_actions_browser.devdocs.json index 7a589d952a59a..aabb32029e0d6 100644 --- a/api_docs/kbn_ui_actions_browser.devdocs.json +++ b/api_docs/kbn_ui_actions_browser.devdocs.json @@ -438,21 +438,6 @@ ], "enums": [], "misc": [ - { - "parentPluginId": "@kbn/ui-actions-browser", - "id": "def-common.CATEGORIZE_FIELD_TRIGGER", - "type": "string", - "tags": [], - "label": "CATEGORIZE_FIELD_TRIGGER", - "description": [], - "signature": [ - "\"CATEGORIZE_FIELD_TRIGGER\"" - ], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/ui-actions-browser", "id": "def-common.PresentableGrouping", @@ -522,53 +507,6 @@ } ], "objects": [ - { - "parentPluginId": "@kbn/ui-actions-browser", - "id": "def-common.categorizeFieldTrigger", - "type": "Object", - "tags": [], - "label": "categorizeFieldTrigger", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/ui-actions-browser", - "id": "def-common.categorizeFieldTrigger.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/ui-actions-browser", - "id": "def-common.categorizeFieldTrigger.title", - "type": "string", - "tags": [], - "label": "title", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/ui-actions-browser", - "id": "def-common.categorizeFieldTrigger.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/ui-actions-browser", "id": "def-common.defaultTrigger", diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 1274bf25fa9c1..373cdd85e6503 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 49 | 0 | 35 | 0 | +| 44 | 0 | 30 | 0 | ## Common diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index e9f159428e46a..e11d759582aad 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-11-16 +date: 2023-11-27 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 04a49d7347080..bd54964199e9d 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-11-16 +date: 2023-11-27 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 6becec7972d24..8cd81175eea99 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-11-16 +date: 2023-11-27 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 8cf7199ed233e..209fa6301fdce 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.devdocs.json b/api_docs/kbn_unified_field_list.devdocs.json index 20244ca1fb58d..35da28a598da8 100644 --- a/api_docs/kbn_unified_field_list.devdocs.json +++ b/api_docs/kbn_unified_field_list.devdocs.json @@ -4171,15 +4171,17 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly getTrigger: (triggerId: string) => ", + "TriggerContract", + "; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -4195,17 +4197,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; readonly getTrigger: (triggerId: string) => ", - "TriggerContract", - "; readonly hasAction: (actionId: string) => boolean; readonly getAction: (id: string) => ", + ") => void; readonly getAction: (id: string) => ", { "pluginId": "uiActions", "scope": "public", diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 81aa7a60b9cf7..e2cd4a8488d39 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-11-16 +date: 2023-11-27 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 6c364636d653b..b1d2e30412233 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2023-11-16 +date: 2023-11-27 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 840b0a4977193..6141bef6013c9 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-11-16 +date: 2023-11-27 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 d786478df658c..58061d0eb930c 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-11-16 +date: 2023-11-27 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 f7a5f71a4cc1a..c9b6438fc04b8 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-11-16 +date: 2023-11-27 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 e7e71b57227d2..4f7225cbd909d 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-11-16 +date: 2023-11-27 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 f9667564988d4..a30033a18d6e6 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-11-16 +date: 2023-11-27 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 bb87f0b1f130b..e9afd296ad9db 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-11-16 +date: 2023-11-27 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 542a0bbbca634..a97d09369ea46 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index e762b217c8364..7990eaa422909 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-11-16 +date: 2023-11-27 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 7b7f033b237ea..749d0a7b6a555 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-11-16 +date: 2023-11-27 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 a37c31eea3823..86d2072c51220 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2023-11-16 +date: 2023-11-27 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 5e4d81d7129a2..927238442c36e 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 2de9cf5fc0879..68a511a501fd6 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-11-16 +date: 2023-11-27 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 ca28b725ddd7e..3258c5542e57f 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-11-16 +date: 2023-11-27 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 c95eecaf212b3..1b2658a7a359a 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-11-16 +date: 2023-11-27 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 0808aafa7726d..cf20e0cb4737c 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -360,7 +360,7 @@ "\nGets the Lens embeddable's datasource and visualization states\nupdates the embeddable input" ], "signature": [ - "(datasourceState: unknown, visualizationState: unknown) => Promise" + "(datasourceState: unknown, visualizationState: unknown, visualizationType?: string | undefined) => Promise" ], "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", "deprecated": false, @@ -395,6 +395,67 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "lens", + "id": "def-public.Embeddable.updateVisualization.$3", + "type": "string", + "tags": [], + "label": "visualizationType", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "lens", + "id": "def-public.Embeddable.updateSuggestion", + "type": "Function", + "tags": [], + "label": "updateSuggestion", + "description": [], + "signature": [ + "(attrs: ", + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.LensSavedObjectAttributes", + "text": "LensSavedObjectAttributes" + }, + ") => Promise" + ], + "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Embeddable.updateSuggestion.$1", + "type": "Object", + "tags": [], + "label": "attrs", + "description": [], + "signature": [ + { + "pluginId": "lens", + "scope": "public", + "docId": "kibLensPluginApi", + "section": "def-public.LensSavedObjectAttributes", + "text": "LensSavedObjectAttributes" + } + ], + "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true } ], "returnComment": [] @@ -5131,6 +5192,20 @@ "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "lens", + "id": "def-public.SuggestionRequest.datasourceId", + "type": "string", + "tags": [], + "label": "datasourceId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -5222,6 +5297,20 @@ "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "lens", + "id": "def-public.TableSuggestion.notAssignedMetrics", + "type": "CompoundType", + "tags": [], + "label": "notAssignedMetrics", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -6375,7 +6464,7 @@ "label": "getRemoveOperation", "description": [], "signature": [ - "((state: T, layerId: string) => \"remove\" | \"clear\") | undefined" + "((state: T, layerId: string) => \"clear\" | \"remove\") | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 5f943d19e19c4..c2ae6633dd6b6 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 625 | 0 | 526 | 60 | +| 630 | 0 | 531 | 60 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 0b78839bfd9cd..069137a6c7731 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-11-16 +date: 2023-11-27 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 b15198d1460fa..e2a699802d04e 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-11-16 +date: 2023-11-27 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 404178eee6f7f..233e4fb114d47 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.devdocs.json b/api_docs/links.devdocs.json index d688e23b9f159..24744659d4731 100644 --- a/api_docs/links.devdocs.json +++ b/api_docs/links.devdocs.json @@ -80,98 +80,14 @@ }, { "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.select", - "type": "Function", - "tags": [], - "label": "select", - "description": [ - "\nTODO: Keep track of the necessary state without the redux embeddable tools; it's kind of overkill here.\n Related issue: https://github.com/elastic/kibana/issues/167577" - ], - "signature": [ - "(selector: (state: ", - "LinksReduxState", - ") => Selected, equalityFn?: ((previous: Selected, next: Selected) => boolean) | undefined) => Selected" - ], - "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.select.$1", - "type": "Function", - "tags": [], - "label": "selector", - "description": [], - "signature": [ - "(state: ReduxStateType) => Selected" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.select.$1.$1", - "type": "Uncategorized", - "tags": [], - "label": "state", - "description": [], - "signature": [ - "ReduxStateType" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.select.$2", - "type": "Function", - "tags": [], - "label": "equalityFn", - "description": [], - "signature": [ - "((previous: Selected, next: Selected) => boolean) | undefined" - ], - "path": "src/plugins/presentation_util/public/redux_tools/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.getState", - "type": "Function", - "tags": [], - "label": "getState", - "description": [], - "signature": [ - "() => ", - "LinksReduxState" - ], - "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [] - }, - { - "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.dispatch", + "id": "def-public.LinksEmbeddable.attributes", "type": "Object", "tags": [], - "label": "dispatch", + "label": "attributes", "description": [], "signature": [ - "{ setLoading: (payload: boolean) => void; setAttributes: (payload: ", "LinksAttributes", - ") => void; }" + " | undefined" ], "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", "deprecated": false, @@ -179,37 +95,20 @@ }, { "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.onStateChange", - "type": "Function", + "id": "def-public.LinksEmbeddable.attributes$", + "type": "Object", "tags": [], - "label": "onStateChange", + "label": "attributes$", "description": [], "signature": [ - "(listener: () => void) => ", - "Unsubscribe" + "Subject", + "<", + "LinksAttributes", + ">" ], "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.onStateChange.$1", - "type": "Function", - "tags": [], - "label": "listener", - "description": [], - "signature": [ - "() => void" - ], - "path": "node_modules/redux/index.d.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [] - } - ] + "trackAdoption": false }, { "parentPluginId": "links", @@ -230,27 +129,6 @@ "id": "def-public.LinksEmbeddable.Unnamed.$1", "type": "Object", "tags": [], - "label": "reduxToolsPackage", - "description": [], - "signature": [ - { - "pluginId": "presentationUtil", - "scope": "public", - "docId": "kibPresentationUtilPluginApi", - "section": "def-public.ReduxToolsPackage", - "text": "ReduxToolsPackage" - } - ], - "path": "src/plugins/links/public/embeddable/links_embeddable.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.Unnamed.$2", - "type": "Object", - "tags": [], "label": "config", "description": [], "signature": [ @@ -263,7 +141,7 @@ }, { "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.Unnamed.$3", + "id": "def-public.LinksEmbeddable.Unnamed.$2", "type": "CompoundType", "tags": [], "label": "initialInput", @@ -278,7 +156,7 @@ }, { "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.Unnamed.$4", + "id": "def-public.LinksEmbeddable.Unnamed.$3", "type": "Object", "tags": [], "label": "attributeService", @@ -320,7 +198,7 @@ }, { "parentPluginId": "links", - "id": "def-public.LinksEmbeddable.Unnamed.$5", + "id": "def-public.LinksEmbeddable.Unnamed.$4", "type": "Object", "tags": [], "label": "parent", diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 6fef3a10d5d64..2eabc3b73e8d1 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 64 | 0 | 62 | 7 | +| 57 | 0 | 57 | 6 | ## Client diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 44decb607a980..59c66016f9b7b 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index 105ccbfe1bf51..19ab86816dc1d 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.devdocs.json b/api_docs/logs_shared.devdocs.json index 5e35354e01878..61da0f6f1007c 100644 --- a/api_docs/logs_shared.devdocs.json +++ b/api_docs/logs_shared.devdocs.json @@ -2878,15 +2878,17 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly getTrigger: (triggerId: string) => ", + "TriggerContract", + "; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -2902,17 +2904,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; readonly getTrigger: (triggerId: string) => ", - "TriggerContract", - "; readonly hasAction: (actionId: string) => boolean; readonly getAction: (id: string) => ", + ") => void; readonly getAction: (id: string) => ", { "pluginId": "uiActions", "scope": "public", diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index f84708561f3dd..4b99c262a2993 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 4715b32b3c07c..f1d960313faa2 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.devdocs.json b/api_docs/maps.devdocs.json index 56ef9cf8b744f..96444b697240f 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -1684,12 +1684,12 @@ { "parentPluginId": "maps", "id": "def-public.GeoJsonWithMeta.meta", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "meta", "description": [], "signature": [ - "ESSearchSourceResponseMeta", + "DataRequestMeta", " | undefined" ], "path": "x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx", diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 62a9a54b192cc..424e384ffcc87 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 260 | 0 | 259 | 29 | +| 260 | 0 | 259 | 28 | ## Client diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 6abe3da16aadb..a70a9d3f6b164 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-11-16 +date: 2023-11-27 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 95b7422071971..14b86a2e2fe7e 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index f3254ea9f4552..2c947c4c6a905 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -1045,7 +1045,7 @@ "label": "ML_PAGES", "description": [], "signature": [ - "{ readonly ANOMALY_DETECTION_JOBS_MANAGE: \"jobs\"; readonly ANOMALY_EXPLORER: \"explorer\"; readonly SINGLE_METRIC_VIEWER: \"timeseriesexplorer\"; readonly DATA_FRAME_ANALYTICS_JOBS_MANAGE: \"data_frame_analytics\"; readonly DATA_FRAME_ANALYTICS_SOURCE_SELECTION: \"data_frame_analytics/source_selection\"; readonly DATA_FRAME_ANALYTICS_CREATE_JOB: \"data_frame_analytics/new_job\"; readonly TRAINED_MODELS_MANAGE: \"trained_models\"; readonly DATA_DRIFT_INDEX_SELECT: \"data_drift_index_select\"; readonly DATA_DRIFT_CUSTOM: \"data_drift_custom\"; readonly DATA_DRIFT: \"data_drift\"; readonly NODES: \"nodes\"; readonly MEMORY_USAGE: \"memory_usage\"; readonly DATA_FRAME_ANALYTICS_EXPLORATION: \"data_frame_analytics/exploration\"; readonly DATA_FRAME_ANALYTICS_MAP: \"data_frame_analytics/map\"; readonly DATA_VISUALIZER: \"datavisualizer\"; readonly DATA_VISUALIZER_INDEX_SELECT: \"datavisualizer_index_select\"; readonly DATA_VISUALIZER_FILE: \"filedatavisualizer\"; readonly DATA_VISUALIZER_INDEX_VIEWER: \"jobs/new_job/datavisualizer\"; readonly ANOMALY_DETECTION_CREATE_JOB: \"jobs/new_job\"; readonly ANOMALY_DETECTION_CREATE_JOB_RECOGNIZER: \"jobs/new_job/recognize\"; readonly ANOMALY_DETECTION_CREATE_JOB_SINGLE_METRIC: \"jobs/new_job/single_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_MULTI_METRIC: \"jobs/new_job/multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_MULTI_METRIC: \"jobs/new_job/convert_to_multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_ADVANCED: \"jobs/new_job/advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_POPULATION: \"jobs/new_job/population\"; readonly ANOMALY_DETECTION_CREATE_JOB_CATEGORIZATION: \"jobs/new_job/categorization\"; readonly ANOMALY_DETECTION_CREATE_JOB_RARE: \"jobs/new_job/rare\"; readonly ANOMALY_DETECTION_CREATE_JOB_GEO: \"jobs/new_job/geo\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_ADVANCED: \"jobs/new_job/convert_to_advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE: \"jobs/new_job/step/job_type\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX: \"jobs/new_job/step/index_or_search\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_LENS: \"jobs/new_job/from_lens\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_MAP: \"jobs/new_job/from_map\"; readonly ANOMALY_DETECTION_MODULES_VIEW_OR_CREATE: \"modules/check_view_or_create\"; readonly SETTINGS: \"settings\"; readonly CALENDARS_MANAGE: \"settings/calendars_list\"; readonly CALENDARS_NEW: \"settings/calendars_list/new_calendar\"; readonly CALENDARS_EDIT: \"settings/calendars_list/edit_calendar\"; readonly FILTER_LISTS_MANAGE: \"settings/filter_lists\"; readonly FILTER_LISTS_NEW: \"settings/filter_lists/new_filter_list\"; readonly FILTER_LISTS_EDIT: \"settings/filter_lists/edit_filter_list\"; readonly OVERVIEW: \"overview\"; readonly NOTIFICATIONS: \"notifications\"; readonly AIOPS: \"aiops\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES: \"aiops/explain_log_rate_spikes\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT: \"aiops/explain_log_rate_spikes_index_select\"; readonly AIOPS_LOG_RATE_ANALYSIS: \"aiops/log_rate_analysis\"; readonly AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT: \"aiops/log_rate_analysis_index_select\"; readonly AIOPS_LOG_CATEGORIZATION: \"aiops/log_categorization\"; readonly AIOPS_LOG_CATEGORIZATION_INDEX_SELECT: \"aiops/log_categorization_index_select\"; readonly AIOPS_CHANGE_POINT_DETECTION: \"aiops/change_point_detection\"; readonly AIOPS_CHANGE_POINT_DETECTION_INDEX_SELECT: \"aiops/change_point_detection_index_select\"; }" + "{ readonly ANOMALY_DETECTION_JOBS_MANAGE: \"jobs\"; readonly ANOMALY_EXPLORER: \"explorer\"; readonly SINGLE_METRIC_VIEWER: \"timeseriesexplorer\"; readonly DATA_FRAME_ANALYTICS_JOBS_MANAGE: \"data_frame_analytics\"; readonly DATA_FRAME_ANALYTICS_SOURCE_SELECTION: \"data_frame_analytics/source_selection\"; readonly DATA_FRAME_ANALYTICS_CREATE_JOB: \"data_frame_analytics/new_job\"; readonly TRAINED_MODELS_MANAGE: \"trained_models\"; readonly DATA_DRIFT_INDEX_SELECT: \"data_drift_index_select\"; readonly DATA_DRIFT_CUSTOM: \"data_drift_custom\"; readonly DATA_DRIFT: \"data_drift\"; readonly NODES: \"nodes\"; readonly MEMORY_USAGE: \"memory_usage\"; readonly DATA_FRAME_ANALYTICS_EXPLORATION: \"data_frame_analytics/exploration\"; readonly DATA_FRAME_ANALYTICS_MAP: \"data_frame_analytics/map\"; readonly DATA_VISUALIZER: \"datavisualizer\"; readonly DATA_VISUALIZER_INDEX_SELECT: \"datavisualizer_index_select\"; readonly DATA_VISUALIZER_FILE: \"filedatavisualizer\"; readonly DATA_VISUALIZER_INDEX_VIEWER: \"jobs/new_job/datavisualizer\"; readonly ANOMALY_DETECTION_CREATE_JOB: \"jobs/new_job\"; readonly ANOMALY_DETECTION_CREATE_JOB_RECOGNIZER: \"jobs/new_job/recognize\"; readonly ANOMALY_DETECTION_CREATE_JOB_SINGLE_METRIC: \"jobs/new_job/single_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_MULTI_METRIC: \"jobs/new_job/multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_MULTI_METRIC: \"jobs/new_job/convert_to_multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_ADVANCED: \"jobs/new_job/advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_POPULATION: \"jobs/new_job/population\"; readonly ANOMALY_DETECTION_CREATE_JOB_CATEGORIZATION: \"jobs/new_job/categorization\"; readonly ANOMALY_DETECTION_CREATE_JOB_RARE: \"jobs/new_job/rare\"; readonly ANOMALY_DETECTION_CREATE_JOB_GEO: \"jobs/new_job/geo\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_ADVANCED: \"jobs/new_job/convert_to_advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE: \"jobs/new_job/step/job_type\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX: \"jobs/new_job/step/index_or_search\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_LENS: \"jobs/new_job/from_lens\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_PATTERN_ANALYSIS: \"jobs/new_job/from_pattern_analysis\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_MAP: \"jobs/new_job/from_map\"; readonly ANOMALY_DETECTION_MODULES_VIEW_OR_CREATE: \"modules/check_view_or_create\"; readonly SETTINGS: \"settings\"; readonly CALENDARS_MANAGE: \"settings/calendars_list\"; readonly CALENDARS_NEW: \"settings/calendars_list/new_calendar\"; readonly CALENDARS_EDIT: \"settings/calendars_list/edit_calendar\"; readonly FILTER_LISTS_MANAGE: \"settings/filter_lists\"; readonly FILTER_LISTS_NEW: \"settings/filter_lists/new_filter_list\"; readonly FILTER_LISTS_EDIT: \"settings/filter_lists/edit_filter_list\"; readonly OVERVIEW: \"overview\"; readonly NOTIFICATIONS: \"notifications\"; readonly AIOPS: \"aiops\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES: \"aiops/explain_log_rate_spikes\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT: \"aiops/explain_log_rate_spikes_index_select\"; readonly AIOPS_LOG_RATE_ANALYSIS: \"aiops/log_rate_analysis\"; readonly AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT: \"aiops/log_rate_analysis_index_select\"; readonly AIOPS_LOG_CATEGORIZATION: \"aiops/log_categorization\"; readonly AIOPS_LOG_CATEGORIZATION_INDEX_SELECT: \"aiops/log_categorization_index_select\"; readonly AIOPS_CHANGE_POINT_DETECTION: \"aiops/change_point_detection\"; readonly AIOPS_CHANGE_POINT_DETECTION_INDEX_SELECT: \"aiops/change_point_detection_index_select\"; }" ], "path": "x-pack/plugins/ml/common/constants/locator.ts", "deprecated": false, diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index c1ad326590a83..3db9f81af55a2 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.devdocs.json b/api_docs/mock_idp_plugin.devdocs.json new file mode 100644 index 0000000000000..9c7b5bd1558d8 --- /dev/null +++ b/api_docs/mock_idp_plugin.devdocs.json @@ -0,0 +1,410 @@ +{ + "id": "mockIdpPlugin", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createMockIdpMetadata", + "type": "Function", + "tags": [], + "label": "createMockIdpMetadata", + "description": [ + "\nCreates XML metadata for our mock identity provider.\n\nThis can be saved to file and used to configure Elasticsearch SAML realm.\n" + ], + "signature": [ + "(kibanaUrl: string) => Promise" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createMockIdpMetadata.$1", + "type": "string", + "tags": [], + "label": "kibanaUrl", + "description": [ + "Fully qualified URL where Kibana is hosted (including base path)" + ], + "signature": [ + "string" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse", + "type": "Function", + "tags": [], + "label": "createSAMLResponse", + "description": [ + "\nCreates a SAML response that can be passed directly to the Kibana ACS endpoint to authenticate a user.\n" + ], + "signature": [ + "(options: { kibanaUrl: string; authnRequestId?: string | undefined; username: string; fullname?: string | undefined; email?: string | undefined; roles: string[]; }) => Promise" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse.$1.kibanaUrl", + "type": "string", + "tags": [], + "label": "kibanaUrl", + "description": [ + "Fully qualified URL where Kibana is hosted (including base path)" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse.$1.authnRequestId", + "type": "string", + "tags": [], + "label": "authnRequestId", + "description": [ + "ID from SAML authentication request" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse.$1.username", + "type": "string", + "tags": [], + "label": "username", + "description": [], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse.$1.fullname", + "type": "string", + "tags": [], + "label": "fullname", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse.$1.email", + "type": "string", + "tags": [], + "label": "email", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.createSAMLResponse.$1.roles", + "type": "Array", + "tags": [], + "label": "roles", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.ensureSAMLRoleMapping", + "type": "Function", + "tags": [], + "label": "ensureSAMLRoleMapping", + "description": [ + "\nCreates the role mapping required for developers to authenticate using SAML." + ], + "signature": [ + "(client: ", + "default", + ") => Promise" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.ensureSAMLRoleMapping.$1", + "type": "Object", + "tags": [], + "label": "client", + "description": [], + "signature": [ + "default" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.parseSAMLAuthnRequest", + "type": "Function", + "tags": [], + "label": "parseSAMLAuthnRequest", + "description": [], + "signature": [ + "(samlRequest: string) => Promise<{ AssertionConsumerServiceURL: string; Destination: string; ID: string; IssueInstant: string; }>" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.parseSAMLAuthnRequest.$1", + "type": "string", + "tags": [], + "label": "samlRequest", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-mock-idp-plugin/common/utils.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_ATTRIBUTE_EMAIL", + "type": "string", + "tags": [], + "label": "MOCK_IDP_ATTRIBUTE_EMAIL", + "description": [], + "signature": [ + "\"http://saml.elastic-cloud.com/attributes/email\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_ATTRIBUTE_NAME", + "type": "string", + "tags": [], + "label": "MOCK_IDP_ATTRIBUTE_NAME", + "description": [], + "signature": [ + "\"http://saml.elastic-cloud.com/attributes/name\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_ATTRIBUTE_PRINCIPAL", + "type": "string", + "tags": [], + "label": "MOCK_IDP_ATTRIBUTE_PRINCIPAL", + "description": [], + "signature": [ + "\"http://saml.elastic-cloud.com/attributes/principal\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_ATTRIBUTE_ROLES", + "type": "string", + "tags": [], + "label": "MOCK_IDP_ATTRIBUTE_ROLES", + "description": [], + "signature": [ + "\"http://saml.elastic-cloud.com/attributes/roles\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_ENTITY_ID", + "type": "string", + "tags": [], + "label": "MOCK_IDP_ENTITY_ID", + "description": [], + "signature": [ + "\"urn:mock-idp\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_LOGIN_PATH", + "type": "string", + "tags": [], + "label": "MOCK_IDP_LOGIN_PATH", + "description": [], + "signature": [ + "\"/mock_idp/login\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_LOGOUT_PATH", + "type": "string", + "tags": [], + "label": "MOCK_IDP_LOGOUT_PATH", + "description": [], + "signature": [ + "\"/mock_idp/logout\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_METADATA_PATH", + "type": "string", + "tags": [], + "label": "MOCK_IDP_METADATA_PATH", + "description": [], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_PLUGIN_PATH", + "type": "string", + "tags": [], + "label": "MOCK_IDP_PLUGIN_PATH", + "description": [], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_REALM_NAME", + "type": "string", + "tags": [], + "label": "MOCK_IDP_REALM_NAME", + "description": [], + "signature": [ + "\"mock-idp\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "mockIdpPlugin", + "id": "def-common.MOCK_IDP_ROLE_MAPPING_NAME", + "type": "string", + "tags": [], + "label": "MOCK_IDP_ROLE_MAPPING_NAME", + "description": [], + "signature": [ + "\"mock-idp-mapping\"" + ], + "path": "packages/kbn-mock-idp-plugin/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx new file mode 100644 index 0000000000000..bf3eb9327f9e4 --- /dev/null +++ b/api_docs/mock_idp_plugin.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibMockIdpPluginPluginApi +slug: /kibana-dev-docs/api/mockIdpPlugin +title: "mockIdpPlugin" +image: https://source.unsplash.com/400x175/?github +description: API docs for the mockIdpPlugin plugin +date: 2023-11-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] +--- +import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; + + + +Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 25 | 0 | 19 | 0 | + +## Common + +### Functions + + +### Consts, variables and types + + diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 4b2a335daee9c..3de6b07448f99 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-11-16 +date: 2023-11-27 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 14d4b44e3f520..a53cfe9d987b3 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-11-16 +date: 2023-11-27 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 8e5fe7c5e044d..2b8489d665d38 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-11-16 +date: 2023-11-27 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 3af33a3c7facd..a803bbafe410b 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-11-16 +date: 2023-11-27 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 81ef92527b9f4..484b053110b43 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-11-16 +date: 2023-11-27 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 d46bcbbda45c6..242532a1aab4b 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index f0d4f0c019ba5..c05a0a49927fd 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -8156,29 +8156,7 @@ "label": "ObservabilityAPIReturnType", "description": [], "signature": [ - "{ \"POST /api/observability/slos/{id}/_reset 2023-10-31\": { endpoint: \"POST /api/observability/slos/{id}/_reset 2023-10-31\"; params?: ", - "TypeC", - "<{ path: ", - "TypeC", - "<{ id: ", - "StringC", - "; }>; }> | undefined; handler: ({}: ", - { - "pluginId": "observability", - "scope": "server", - "docId": "kibObservabilityPluginApi", - "section": "def-server.ObservabilityRouteHandlerResources", - "text": "ObservabilityRouteHandlerResources" - }, - " & { params: { path: { id: string; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; }>; } & ", - { - "pluginId": "observability", - "scope": "server", - "docId": "kibObservabilityPluginApi", - "section": "def-server.ObservabilityRouteCreateOptions", - "text": "ObservabilityRouteCreateOptions" - }, - "; \"GET /internal/observability/slos/{id}/_instances\": { endpoint: \"GET /internal/observability/slos/{id}/_instances\"; params?: ", + "{ \"GET /internal/observability/slos/{id}/_instances\": { endpoint: \"GET /internal/observability/slos/{id}/_instances\"; params?: ", "TypeC", "<{ path: ", "TypeC", @@ -8534,7 +8512,13 @@ "PartialC", "<{ filter: ", "StringC", - "; }>]>; }>]>; }>; }> | undefined; handler: ({}: ", + "; }>]>; }>]>; range: ", + "TypeC", + "<{ start: ", + "NumberC", + "; end: ", + "NumberC", + "; }>; }>; }> | undefined; handler: ({}: ", { "pluginId": "observability", "scope": "server", @@ -8542,7 +8526,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }; }; }) => Promise<{ date: string; sliValue: number; }[]>; } & ", + " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; }; }; }) => Promise<({ date: string; sliValue: number; } & { events?: { good: number; bad: number; total: number; } | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -9104,7 +9088,7 @@ "section": "def-common.Duration", "text": "Duration" }, - " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; }>; } & ", + " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -9138,7 +9122,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", + " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -9180,7 +9164,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", + " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -9188,18 +9172,12 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, - "; \"GET /api/observability/slos/_definitions 2023-10-31\": { endpoint: \"GET /api/observability/slos/_definitions 2023-10-31\"; params?: ", - "PartialC", + "; \"GET /internal/observability/slos/_definitions\": { endpoint: \"GET /internal/observability/slos/_definitions\"; params?: ", + "TypeC", "<{ query: ", - "PartialC", + "TypeC", "<{ search: ", "StringC", - "; includeOutdatedOnly: ", - "Type", - "; page: ", - "StringC", - "; perPage: ", - "StringC", "; }>; }> | undefined; handler: ({}: ", { "pluginId": "observability", @@ -9208,7 +9186,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params?: { query?: { search?: string | undefined; includeOutdatedOnly?: boolean | undefined; page?: string | undefined; perPage?: string | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; })[]; }>; } & ", + " & { params: { query: { search: string; }; }; }) => Promise<({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -9888,29 +9866,7 @@ "label": "ObservabilityServerRouteRepository", "description": [], "signature": [ - "{ \"POST /api/observability/slos/{id}/_reset 2023-10-31\": { endpoint: \"POST /api/observability/slos/{id}/_reset 2023-10-31\"; params?: ", - "TypeC", - "<{ path: ", - "TypeC", - "<{ id: ", - "StringC", - "; }>; }> | undefined; handler: ({}: ", - { - "pluginId": "observability", - "scope": "server", - "docId": "kibObservabilityPluginApi", - "section": "def-server.ObservabilityRouteHandlerResources", - "text": "ObservabilityRouteHandlerResources" - }, - " & { params: { path: { id: string; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; }>; } & ", - { - "pluginId": "observability", - "scope": "server", - "docId": "kibObservabilityPluginApi", - "section": "def-server.ObservabilityRouteCreateOptions", - "text": "ObservabilityRouteCreateOptions" - }, - "; \"GET /internal/observability/slos/{id}/_instances\": { endpoint: \"GET /internal/observability/slos/{id}/_instances\"; params?: ", + "{ \"GET /internal/observability/slos/{id}/_instances\": { endpoint: \"GET /internal/observability/slos/{id}/_instances\"; params?: ", "TypeC", "<{ path: ", "TypeC", @@ -10266,7 +10222,13 @@ "PartialC", "<{ filter: ", "StringC", - "; }>]>; }>]>; }>; }> | undefined; handler: ({}: ", + "; }>]>; }>]>; range: ", + "TypeC", + "<{ start: ", + "NumberC", + "; end: ", + "NumberC", + "; }>; }>; }> | undefined; handler: ({}: ", { "pluginId": "observability", "scope": "server", @@ -10274,7 +10236,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; }; }; }) => Promise<{ date: string; sliValue: number; }[]>; } & ", + " & { params: { body: { indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; range: { start: number; end: number; }; }; }; }) => Promise<({ date: string; sliValue: number; } & { events?: { good: number; bad: number; total: number; } | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", @@ -10836,7 +10798,7 @@ "section": "def-common.Duration", "text": "Duration" }, - " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; }>; } & ", + " | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | undefined; }; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -10870,7 +10832,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", + " & { params: { path: { id: string; }; } & { query?: { instanceId?: string | undefined; } | undefined; }; }) => Promise<{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -10912,7 +10874,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", + " & { params?: { query?: { kqlQuery?: string | undefined; page?: string | undefined; perPage?: string | undefined; sortBy?: \"status\" | \"error_budget_consumed\" | \"error_budget_remaining\" | \"sli_value\" | undefined; sortDirection?: \"asc\" | \"desc\" | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; }; })[]; }>; } & ", { "pluginId": "observability", "scope": "server", @@ -10920,18 +10882,12 @@ "section": "def-server.ObservabilityRouteCreateOptions", "text": "ObservabilityRouteCreateOptions" }, - "; \"GET /api/observability/slos/_definitions 2023-10-31\": { endpoint: \"GET /api/observability/slos/_definitions 2023-10-31\"; params?: ", - "PartialC", + "; \"GET /internal/observability/slos/_definitions\": { endpoint: \"GET /internal/observability/slos/_definitions\"; params?: ", + "TypeC", "<{ query: ", - "PartialC", + "TypeC", "<{ search: ", "StringC", - "; includeOutdatedOnly: ", - "Type", - "; page: ", - "StringC", - "; perPage: ", - "StringC", "; }>; }> | undefined; handler: ({}: ", { "pluginId": "observability", @@ -10940,7 +10896,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - " & { params?: { query?: { search?: string | undefined; includeOutdatedOnly?: boolean | undefined; page?: string | undefined; perPage?: string | undefined; } | undefined; } | undefined; }) => Promise<{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; version: number; } & { instanceId?: string | undefined; })[]; }>; } & ", + " & { params: { query: { search: string; }; }; }) => Promise<({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string; total: string; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"cardinality\" | \"last_value\" | \"std_deviation\"; field: string; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | undefined; }); } & { filter?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; revision: number; settings: { syncDelay: string; frequency: string; }; enabled: boolean; tags: string[]; groupBy: string; createdAt: string; updatedAt: string; } & { instanceId?: string | undefined; })[]>; } & ", { "pluginId": "observability", "scope": "server", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 0c57a24e4c449..8728f898e2e4e 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.devdocs.json b/api_docs/observability_a_i_assistant.devdocs.json index 29b5cec0de507..6435132808953 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -19,7 +19,7 @@ "section": "def-common.Message", "text": "Message" }, - "[]; title: string; } & ", + "[]; title: string; dataTestSubj?: string | undefined; } & ", { "pluginId": "@kbn/shared-ux-utility", "scope": "common", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index dca8e221f5e7a..b7da8c5727429 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index a49295da03a0f..2d810617fe9b2 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 7d96d1aca7a94..f7783776af679 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index e8ab113a22cf2..3032e49529bf7 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -414,6 +414,53 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBar", + "type": "Function", + "tags": [], + "label": "EmbeddableProfilingSearchBar", + "description": [], + "signature": [ + "(props: ", + { + "pluginId": "observabilityShared", + "scope": "public", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-public.EmbeddableProfilingSearchBarProps", + "text": "EmbeddableProfilingSearchBarProps" + }, + ") => JSX.Element" + ], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBar.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + { + "pluginId": "observabilityShared", + "scope": "public", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-public.EmbeddableProfilingSearchBarProps", + "text": "EmbeddableProfilingSearchBarProps" + } + ], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-public.getContextMenuItemsFromActions", @@ -471,15 +518,17 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly getTrigger: (triggerId: string) => ", + "TriggerContract", + "; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -495,17 +544,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; readonly getTrigger: (triggerId: string) => ", - "TriggerContract", - "; readonly hasAction: (actionId: string) => boolean; readonly getAction: (id: string) => ", + ") => void; readonly getAction: (id: string) => ", { "pluginId": "uiActions", "scope": "public", @@ -1912,6 +1959,138 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps", + "type": "Interface", + "tags": [], + "label": "EmbeddableProfilingSearchBarProps", + "description": [], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.kuery", + "type": "string", + "tags": [], + "label": "kuery", + "description": [], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.showDatePicker", + "type": "CompoundType", + "tags": [], + "label": "showDatePicker", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.onQuerySubmit", + "type": "Function", + "tags": [], + "label": "onQuerySubmit", + "description": [], + "signature": [ + "(params: { dateRange: { from: string; to: string; mode?: \"absolute\" | \"relative\" | undefined; }; query: string; }) => void" + ], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.onQuerySubmit.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.onQuerySubmit.$1.dateRange", + "type": "Object", + "tags": [], + "label": "dateRange", + "description": [], + "signature": [ + "{ from: string; to: string; mode?: \"absolute\" | \"relative\" | undefined; }" + ], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.onQuerySubmit.$1.query", + "type": "string", + "tags": [], + "label": "query", + "description": [], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.onRefresh", + "type": "Function", + "tags": [], + "label": "onRefresh", + "description": [], + "signature": [ + "() => void" + ], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.rangeFrom", + "type": "string", + "tags": [], + "label": "rangeFrom", + "description": [], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EmbeddableProfilingSearchBarProps.rangeTo", + "type": "string", + "tags": [], + "label": "rangeTo", + "description": [], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-public.FetcherResult", @@ -2620,6 +2799,23 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-public.EMBEDDABLE_PROFILING_SEARCH_BAR", + "type": "string", + "tags": [], + "label": "EMBEDDABLE_PROFILING_SEARCH_BAR", + "description": [ + "Profiling search bar embeddable key" + ], + "signature": [ + "\"EMBEDDABLE_PROFILING_SEARCH_BAR\"" + ], + "path": "x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-public.LazyObservabilityPageTemplateProps", diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 5b32bb8b68359..7205b558309c1 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 292 | 1 | 289 | 15 | +| 305 | 1 | 301 | 15 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 34c0045ada190..c4a722dd15b3b 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-11-16 +date: 2023-11-27 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 fbebc63aaa1f8..6757217c17427 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-11-16 +date: 2023-11-27 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 bb621aec7465a..0a59a76a55af4 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
    public API | Number of teams | |--------------|----------|------------------------| -| 711 | 603 | 40 | +| 715 | 607 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 76352 | 233 | 65301 | 1602 | +| 76458 | 235 | 65365 | 1609 | ## Plugin Directory @@ -29,8 +29,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] |--------------|----------------|-----------|--------------|----------|---------------|--------| | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 269 | 0 | 263 | 31 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 17 | 1 | 15 | 2 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 69 | 1 | 4 | 1 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 810 | 1 | 779 | 50 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 70 | 1 | 4 | 1 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 811 | 1 | 780 | 51 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 120 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Asset manager plugin for entity assets (inventory, topology, etc) | 9 | 0 | 9 | 2 | @@ -62,7 +62,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 922 | 0 | 257 | 4 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 1 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have. | 3 | 0 | 3 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have. | 8 | 0 | 8 | 3 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 12 | 0 | 10 | 3 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 133 | 0 | 90 | 20 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 37 | 0 | 35 | 2 | @@ -90,7 +90,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'shape' function and renderer to expressions | 148 | 0 | 146 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Tagcloud plugin adds a `tagcloud` renderer and function to the expression plugin. The renderer will display the `Wordcloud` chart. | 6 | 0 | 6 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression XY plugin adds a `xy` renderer and function to the expression plugin. The renderer will display the `xy` chart. | 176 | 0 | 166 | 13 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2224 | 17 | 1765 | 5 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2208 | 17 | 1749 | 5 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 235 | 0 | 99 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 292 | 5 | 253 | 3 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 59 | 0 | 59 | 2 | @@ -104,7 +104,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | graph | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 0 | 0 | 0 | 0 | | grokdebugger | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/platform-onboarding](https://github.com/orgs/elastic/teams/platform-onboarding) | Guided onboarding framework | 58 | 0 | 57 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 149 | 0 | 109 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 151 | 0 | 111 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 3 | 0 | 3 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 215 | 0 | 210 | 4 | @@ -118,20 +118,21 @@ 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) | - | 610 | 3 | 417 | 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. | 625 | 0 | 526 | 60 | +| | [@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. | 630 | 0 | 531 | 60 | | | [@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. | 64 | 0 | 62 | 7 | +| | [@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. | 26 | 0 | 26 | 8 | | | [@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. | 289 | 11 | 274 | 27 | | 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) | - | 260 | 0 | 259 | 29 | +| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 260 | 0 | 259 | 28 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 60 | 0 | 60 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Exposes utilities for accessing metrics data | 104 | 8 | 104 | 4 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 150 | 3 | 64 | 33 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 25 | 0 | 19 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 15 | 3 | 13 | 1 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 35 | 0 | 35 | 2 | @@ -142,7 +143,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 42 | 0 | 39 | 7 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 15 | 0 | 15 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 14 | 0 | 14 | 0 | -| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 292 | 1 | 289 | 15 | +| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 305 | 1 | 301 | 15 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 24 | 0 | 24 | 7 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 219 | 2 | 164 | 11 | @@ -151,7 +152,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 23 | 0 | 23 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Reporting Services enables applications to feature reports that the user can automate with Watcher and download later. | 22 | 0 | 6 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 21 | 0 | 21 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 267 | 0 | 238 | 14 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 268 | 0 | 239 | 14 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 24 | 0 | 19 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 129 | 2 | 118 | 4 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 25 | 0 | 25 | 0 | @@ -163,7 +164,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 32 | 0 | 8 | 4 | | searchprofiler | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 270 | 0 | 87 | 3 | -| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 175 | 0 | 106 | 35 | +| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 175 | 0 | 106 | 34 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 19 | 0 | 18 | 0 | @@ -181,13 +182,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 26 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 20 | 0 | 20 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 23 | 0 | 9 | 0 | | | [@elastic/protections-experience](https://github.com/orgs/elastic/teams/protections-experience) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 5 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 240 | 1 | 196 | 17 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 583 | 1 | 557 | 55 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 145 | 0 | 103 | 9 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 135 | 0 | 93 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 212 | 0 | 145 | 10 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 13 | 0 | 10 | 3 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | The `unifiedHistogram` plugin provides UI components to create a layout including a resizable histogram and a main display. | 55 | 0 | 23 | 2 | @@ -211,7 +212,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. | 837 | 12 | 807 | 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. | 835 | 12 | 804 | 19 | | watcher | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | ## Package Directory @@ -231,15 +232,16 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 19 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 23 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 19 | 0 | 0 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 21 | 0 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 22 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 18 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 31 | 0 | 31 | 7 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 181 | 0 | 181 | 27 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 34 | 0 | 34 | 8 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 184 | 0 | 184 | 27 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-qa](https://github.com/orgs/elastic/teams/kibana-qa) | - | 12 | 0 | 12 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 10 | 0 | 10 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 19 | 0 | 16 | 0 | -| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 62 | 1 | 44 | 3 | +| | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 60 | 1 | 42 | 3 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 14 | 0 | 10 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 78 | 0 | 78 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 7 | 0 | 2 | 0 | @@ -314,8 +316,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 5 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 111 | 4 | 36 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 10 | 0 | 10 | 1 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 116 | 4 | 37 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 16 | 0 | 16 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 10 | 1 | 10 | 0 | @@ -325,8 +327,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 6 | 26 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 1 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 449 | 1 | 178 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 59 | 0 | 53 | 7 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 454 | 1 | 179 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 58 | 0 | 52 | 9 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 44 | 0 | 43 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | @@ -402,11 +404,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 30 | 1 | 18 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 33 | 2 | 20 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 1 | 11 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 27 | 0 | 4 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 34 | 1 | 17 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 37 | 1 | 19 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 18 | 1 | 17 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 155 | 0 | 144 | 0 | @@ -417,6 +419,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 10 | 0 | 10 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 16 | 0 | 16 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 19 | 0 | 17 | 6 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 14 | 0 | 9 | 0 | @@ -442,6 +445,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 19 | 0 | 11 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 35125 | 0 | 34718 | 0 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 13 | 0 | 5 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 35 | 0 | 34 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 96 | 0 | 76 | 6 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 48 | 0 | 33 | 7 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 27 | 0 | 14 | 1 | @@ -476,14 +480,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 35 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 108 | 0 | 107 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 7 | 0 | 5 | 0 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 158 | 0 | 155 | 0 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 160 | 0 | 157 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 27 | 0 | 1 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 6 | 0 | 1 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 11 | 0 | 10 | 2 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 9 | 0 | 6 | 2 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 24 | 0 | 4 | 0 | -| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 20 | 0 | 5 | 0 | +| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 24 | 1 | 9 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 23 | 0 | 7 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 2 | 3 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 45 | 0 | 0 | 0 | @@ -516,6 +520,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 8 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 2 | 0 | 1 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 29 | 0 | 29 | 0 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 18 | 0 | 18 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 31 | 1 | 24 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 78 | 0 | 76 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 55 | 1 | 50 | 0 | @@ -528,7 +533,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-performance-testing](https://github.com/orgs/elastic/teams/kibana-performance-testing) | - | 3 | 0 | 3 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 171 | 0 | 28 | 0 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 173 | 0 | 30 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 2 | 0 | @@ -556,9 +561,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 16 | 0 | 16 | 1 | | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 116 | 0 | 113 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 69 | 0 | 69 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 66 | 0 | 66 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 2211 | 0 | 2211 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 14 | 0 | 12 | 1 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 52 | 0 | 48 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 29 | 0 | 23 | 0 | @@ -581,7 +586,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 28 | 0 | 25 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 120 | 0 | 116 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 37 | 0 | 32 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 0 | 51 | 1 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 61 | 0 | 57 | 1 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 31 | 0 | 30 | 1 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management @elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 1 | 0 | 1 | 0 | @@ -628,21 +633,20 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 144 | 0 | 144 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 131 | 0 | 128 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 20 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 102 | 2 | 65 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 4 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 21 | 0 | -| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 24 | 0 | 16 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 5 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 291 | 4 | 244 | 12 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 137 | 5 | 105 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 22 | 0 | 21 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 25 | 0 | 10 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 72 | 0 | 55 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 86 | 0 | 86 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 35 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 44 | 0 | 30 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 53 | 0 | 44 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 7 | 0 | 6 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 109 | 0 | 49 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index ca1e4ee40d00d..0e9d35b25cd06 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-11-16 +date: 2023-11-27 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 1bda61f7d6011..eeab761c023ce 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-11-16 +date: 2023-11-27 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 81cc34b894c62..278666ff3b003 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-11-16 +date: 2023-11-27 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 c150917716ebb..634c377105588 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-11-16 +date: 2023-11-27 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 1a61297dc8ca1..9679e26df3a2e 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-11-16 +date: 2023-11-27 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 72ff879307790..fd1805c621db0 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index 6a8f4d39d6857..713a8f7b36800 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -626,7 +626,7 @@ "label": "getBrowserFields", "description": [], "signature": [ - "({ indices, metaFields, allowNoIndex, }: { indices: string[]; metaFields: string[]; allowNoIndex: boolean; }) => Promise<{ browserFields: ", + "({ featureIds, indices, metaFields, allowNoIndex, }: { featureIds: string[]; indices: string[]; metaFields: string[]; allowNoIndex: boolean; }) => Promise<{ browserFields: ", { "pluginId": "ruleRegistry", "scope": "common", @@ -653,12 +653,26 @@ "id": "def-server.AlertsClient.getBrowserFields.$1", "type": "Object", "tags": [], - "label": "{\n indices,\n metaFields,\n allowNoIndex,\n }", + "label": "{\n featureIds,\n indices,\n metaFields,\n allowNoIndex,\n }", "description": [], "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "ruleRegistry", + "id": "def-server.AlertsClient.getBrowserFields.$1.featureIds", + "type": "Array", + "tags": [], + "label": "featureIds", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "ruleRegistry", "id": "def-server.AlertsClient.getBrowserFields.$1.indices", diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 418f7ce050c39..136e7b4d66235 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 267 | 0 | 238 | 14 | +| 268 | 0 | 239 | 14 | ## Server diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index cc8bb29feeff2..c232c1f59ff9e 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-11-16 +date: 2023-11-27 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 cca924baeeb7d..25b7fc0ffe06e 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-11-16 +date: 2023-11-27 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 2f098e900ea65..2b40bbcff10b0 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-11-16 +date: 2023-11-27 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 565f6dfe7ef38..436da4a012c22 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-11-16 +date: 2023-11-27 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 0ff75ff009637..8da791af3f6d1 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-11-16 +date: 2023-11-27 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 9639090cb1656..ef2f81249526e 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-11-16 +date: 2023-11-27 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 4981df336cae1..aaf4c2c0abf4e 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-11-16 +date: 2023-11-27 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 8b9513867ef46..3a8540526a6e8 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-11-16 +date: 2023-11-27 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 a70c69c91deec..3f505720983a7 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-11-16 +date: 2023-11-27 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 febe88375ef3a..1c3cb004db993 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 391640559497c..add8a6b861163 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -114,7 +114,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/plugin.tsx", "deprecated": false, @@ -507,7 +507,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | undefined" + "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -587,7 +587,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | undefined" + "\"tGridEnabled\" | \"tGridEventRenderedViewEnabled\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"chartEmbeddablesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"alertsPreviewChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"insightsRelatedAlertsByProcessAncestry\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"alertsPageFiltersEnabled\" | \"assistantModelEvaluation\" | \"newUserDetailsFlyout\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1820,7 +1820,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -1972,9 +1972,7 @@ "label": "setComponents", "description": [], "signature": [ - "(components: Partial>>) => void" + "(components: Partial<{ GetStarted: React.ComponentType<{}>; DashboardsLandingCallout: React.ComponentType<{}>; }>) => void" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -1989,7 +1987,7 @@ "label": "components", "description": [], "signature": [ - "{ getStarted?: React.ComponentType<{}> | undefined; dashboardsLandingCallout?: React.ComponentType<{}> | undefined; }" + "{ GetStarted?: React.ComponentType<{}> | undefined; DashboardsLandingCallout?: React.ComponentType<{}> | undefined; }" ], "path": "x-pack/plugins/security_solution/public/contract_components.ts", "deprecated": false, @@ -2818,7 +2816,7 @@ "label": "ConfigType", "description": [], "signature": [ - "Omit; }>, \"offeringSettings\"> & { experimentalFeatures: ", + "Omit; }>, \"offeringSettings\"> & { experimentalFeatures: ", { "pluginId": "securitySolution", "scope": "common", @@ -2828,7 +2826,7 @@ }, "; settings: ", "ConfigSettings", - "; }" + "; enableUiSettingsValidations: boolean; }" ], "path": "x-pack/plugins/security_solution/server/config.ts", "deprecated": false, @@ -2893,7 +2891,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3039,7 +3037,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3088,7 +3086,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly chartEmbeddablesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly alertsPreviewChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly alertsPageFiltersEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly newUserDetailsFlyout: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index bc3ffdf380911..1bbe481102369 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-solution](https://github.com/orgs/elastic/teams/secur | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 175 | 0 | 106 | 35 | +| 175 | 0 | 106 | 34 | ## Client diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index b58dafce91a15..515e742f1e65a 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-11-16 +date: 2023-11-27 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 cf9ec5b91aaba..396e8ab6cead4 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-11-16 +date: 2023-11-27 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 fe1cd09d3cf8d..31d679f16802c 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-11-16 +date: 2023-11-27 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 0ae7995397c18..1f0ee0b167964 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-11-16 +date: 2023-11-27 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 fe91d628cb1a0..58bdb2f07864a 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-11-16 +date: 2023-11-27 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 ac01cb7764571..53ba1af905ce9 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-11-16 +date: 2023-11-27 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 49683b402acb9..41f032242b6bf 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-11-16 +date: 2023-11-27 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 324c3f8ade86e..5d20099335644 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-11-16 +date: 2023-11-27 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 948e23e6a61bc..b05333b460a2a 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-11-16 +date: 2023-11-27 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 7207b47ea96d5..a49b1539efb12 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-11-16 +date: 2023-11-27 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 80b732da8644a..78ff4dbc464f4 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-11-16 +date: 2023-11-27 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 602903ef9f6c3..63c2807ea2cf2 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-11-16 +date: 2023-11-27 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 55899b0789d28..f1ebb599883c3 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-11-16 +date: 2023-11-27 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 48423b3cd5113..004e4a8f03ba1 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-11-16 +date: 2023-11-27 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 91c2294ff1662..a6c298a01a201 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-11-16 +date: 2023-11-27 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 e4514a6fffd5e..5f1190a1948bb 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.devdocs.json b/api_docs/text_based_languages.devdocs.json index c44e1664a3fe1..bfbd1ef629c7f 100644 --- a/api_docs/text_based_languages.devdocs.json +++ b/api_docs/text_based_languages.devdocs.json @@ -69,7 +69,9 @@ "type": "CompoundType", "tags": [], "label": "query", - "description": [], + "description": [ + "The aggregate type query" + ], "signature": [ "{ sql: string; } | { esql: string; }" ], @@ -83,7 +85,9 @@ "type": "Function", "tags": [], "label": "onTextLangQueryChange", - "description": [], + "description": [ + "Callback running everytime the query changes" + ], "signature": [ "(query: ", { @@ -129,14 +133,47 @@ "type": "Function", "tags": [], "label": "onTextLangQuerySubmit", - "description": [], + "description": [ + "Callback running when the user submits the query" + ], "signature": [ - "() => void" + "(query?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined) => void" ], "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "textBasedLanguages", + "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit.$1", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], "returnComment": [] }, { @@ -145,7 +182,9 @@ "type": "Function", "tags": [], "label": "expandCodeEditor", - "description": [], + "description": [ + "Can be used to expand/minimize the editor" + ], "signature": [ "(status: boolean) => void" ], @@ -177,7 +216,9 @@ "type": "boolean", "tags": [], "label": "isCodeEditorExpanded", - "description": [], + "description": [ + "If it is true, the editor initializes with height EDITOR_INITIAL_HEIGHT_EXPANDED" + ], "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false @@ -188,7 +229,9 @@ "type": "CompoundType", "tags": [], "label": "detectTimestamp", - "description": [], + "description": [ + "If it is true, the editor displays the message @timestamp found\nThe text based queries are relying on adhoc dataviews which\ncan have an @timestamp timefield or nothing" + ], "signature": [ "boolean | undefined" ], @@ -202,7 +245,9 @@ "type": "Array", "tags": [], "label": "errors", - "description": [], + "description": [ + "Array of errors" + ], "signature": [ "Error[] | undefined" ], @@ -216,7 +261,9 @@ "type": "string", "tags": [], "label": "warning", - "description": [], + "description": [ + "Warning string as it comes from ES" + ], "signature": [ "string | undefined" ], @@ -230,7 +277,9 @@ "type": "CompoundType", "tags": [], "label": "isDisabled", - "description": [], + "description": [ + "Disables the editor" + ], "signature": [ "boolean | undefined" ], @@ -244,7 +293,9 @@ "type": "CompoundType", "tags": [], "label": "isDarkMode", - "description": [], + "description": [ + "Indicator if the editor is on dark mode" + ], "signature": [ "boolean | undefined" ], @@ -272,7 +323,9 @@ "type": "CompoundType", "tags": [], "label": "hideMinimizeButton", - "description": [], + "description": [ + "If true it hides the minimize button and the user can't return to the minimized version\nUseful when the application doesn't want to give this capability" + ], "signature": [ "boolean | undefined" ], @@ -286,7 +339,41 @@ "type": "CompoundType", "tags": [], "label": "hideRunQueryText", - "description": [], + "description": [ + "Hide the Run query information which appears on the footer" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "textBasedLanguages", + "id": "def-public.TextBasedLanguagesEditorProps.editorIsInline", + "type": "CompoundType", + "tags": [], + "label": "editorIsInline", + "description": [ + "This is used for applications (such as the inline editing flyout in dashboards)\nwhich want to add the editor without being part of the Unified search component\nIt renders a submit query button inside the editor" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "textBasedLanguages", + "id": "def-public.TextBasedLanguagesEditorProps.disableSubmitAction", + "type": "CompoundType", + "tags": [], + "label": "disableSubmitAction", + "description": [ + "Disables the submit query action" + ], "signature": [ "boolean | undefined" ], diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 80ea2fd4442fd..93b6a02fd3231 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.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 | |-------------------|-----------|------------------------|-----------------| -| 20 | 0 | 20 | 0 | +| 23 | 0 | 9 | 0 | ## Client diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 4d11d75097c83..28ef52f2b3edd 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-11-16 +date: 2023-11-27 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 7708843c1ad3d..f8412716abd19 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-11-16 +date: 2023-11-27 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 1f9ef01d6f136..c9fc1166bbfbf 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-11-16 +date: 2023-11-27 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 8076002044f80..c3a92c31fdea6 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.devdocs.json b/api_docs/ui_actions.devdocs.json index fc3e6efa4a21a..bf583998fc74e 100644 --- a/api_docs/ui_actions.devdocs.json +++ b/api_docs/ui_actions.devdocs.json @@ -1634,71 +1634,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "uiActions", - "id": "def-public.CategorizeFieldContext", - "type": "Interface", - "tags": [], - "label": "CategorizeFieldContext", - "description": [], - "path": "src/plugins/ui_actions/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "uiActions", - "id": "def-public.CategorizeFieldContext.field", - "type": "Object", - "tags": [], - "label": "field", - "description": [], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataViewField", - "text": "DataViewField" - } - ], - "path": "src/plugins/ui_actions/public/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "uiActions", - "id": "def-public.CategorizeFieldContext.dataView", - "type": "Object", - "tags": [], - "label": "dataView", - "description": [], - "signature": [ - { - "pluginId": "dataViews", - "scope": "common", - "docId": "kibDataViewsPluginApi", - "section": "def-common.DataView", - "text": "DataView" - } - ], - "path": "src/plugins/ui_actions/public/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "uiActions", - "id": "def-public.CategorizeFieldContext.originatingApp", - "type": "string", - "tags": [], - "label": "originatingApp", - "description": [], - "path": "src/plugins/ui_actions/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "uiActions", "id": "def-public.Presentable", @@ -2300,21 +2235,6 @@ ], "enums": [], "misc": [ - { - "parentPluginId": "uiActions", - "id": "def-public.ACTION_CATEGORIZE_FIELD", - "type": "string", - "tags": [], - "label": "ACTION_CATEGORIZE_FIELD", - "description": [], - "signature": [ - "\"ACTION_CATEGORIZE_FIELD\"" - ], - "path": "src/plugins/ui_actions/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "uiActions", "id": "def-public.ACTION_VISUALIZE_FIELD", @@ -2384,21 +2304,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "uiActions", - "id": "def-public.CATEGORIZE_FIELD_TRIGGER", - "type": "string", - "tags": [], - "label": "CATEGORIZE_FIELD_TRIGGER", - "description": [], - "signature": [ - "\"CATEGORIZE_FIELD_TRIGGER\"" - ], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "uiActions", "id": "def-public.PresentableGrouping", @@ -2468,53 +2373,6 @@ } ], "objects": [ - { - "parentPluginId": "uiActions", - "id": "def-public.categorizeFieldTrigger", - "type": "Object", - "tags": [], - "label": "categorizeFieldTrigger", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "uiActions", - "id": "def-public.categorizeFieldTrigger.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "uiActions", - "id": "def-public.categorizeFieldTrigger.title", - "type": "string", - "tags": [], - "label": "title", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "uiActions", - "id": "def-public.categorizeFieldTrigger.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "uiActions", "id": "def-public.rowClickTrigger", @@ -2665,15 +2523,15 @@ "label": "UiActionsSetup", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -2689,15 +2547,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; }" + ") => void; }" ], "path": "src/plugins/ui_actions/public/plugin.ts", "deprecated": false, @@ -2713,15 +2571,17 @@ "label": "UiActionsStart", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly getTrigger: (triggerId: string) => ", + "TriggerContract", + "; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -2737,17 +2597,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; readonly getTrigger: (triggerId: string) => ", - "TriggerContract", - "; readonly hasAction: (actionId: string) => boolean; readonly getAction: (id: string) => ", + ") => void; readonly getAction: (id: string) => ", { "pluginId": "uiActions", "scope": "public", diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 1c8f3f5e83445..d6c31366d7c16 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.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 | |-------------------|-----------|------------------------|-----------------| -| 145 | 0 | 103 | 9 | +| 135 | 0 | 93 | 9 | ## Client diff --git a/api_docs/ui_actions_enhanced.devdocs.json b/api_docs/ui_actions_enhanced.devdocs.json index 774898421d86f..83c71b1e3e655 100644 --- a/api_docs/ui_actions_enhanced.devdocs.json +++ b/api_docs/ui_actions_enhanced.devdocs.json @@ -3311,7 +3311,7 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + "{ readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -3327,7 +3327,7 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly getActionFactory: (actionFactoryId: string) => ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly getActionFactory: (actionFactoryId: string) => ", { "pluginId": "uiActionsEnhanced", "scope": "public", diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index bc7c3d55f0c60..76b13b7989384 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-11-16 +date: 2023-11-27 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 dff22e1edd0b6..1246b5e56abcf 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.devdocs.json b/api_docs/unified_histogram.devdocs.json index 8cf2ef256b1af..23dd7f92c4067 100644 --- a/api_docs/unified_histogram.devdocs.json +++ b/api_docs/unified_histogram.devdocs.json @@ -632,15 +632,17 @@ "label": "uiActions", "description": [], "signature": [ - "{ readonly addTriggerAction: (triggerId: string, action: ", + "{ readonly registerTrigger: (trigger: ", { - "pluginId": "uiActions", - "scope": "public", - "docId": "kibUiActionsPluginApi", - "section": "def-public.ActionDefinition", - "text": "ActionDefinition" + "pluginId": "@kbn/ui-actions-browser", + "scope": "common", + "docId": "kibKbnUiActionsBrowserPluginApi", + "section": "def-common.Trigger", + "text": "Trigger" }, - ") => void; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly registerAction: (definition: ", + ") => void; readonly getTrigger: (triggerId: string) => ", + "TriggerContract", + "; readonly registerAction: (definition: ", { "pluginId": "uiActions", "scope": "public", @@ -656,17 +658,15 @@ "section": "def-public.Action", "text": "Action" }, - "; readonly registerTrigger: (trigger: ", + "; readonly unregisterAction: (actionId: string) => void; readonly hasAction: (actionId: string) => boolean; readonly attachAction: (triggerId: string, actionId: string) => void; readonly detachAction: (triggerId: string, actionId: string) => void; readonly addTriggerAction: (triggerId: string, action: ", { - "pluginId": "@kbn/ui-actions-browser", - "scope": "common", - "docId": "kibKbnUiActionsBrowserPluginApi", - "section": "def-common.Trigger", - "text": "Trigger" + "pluginId": "uiActions", + "scope": "public", + "docId": "kibUiActionsPluginApi", + "section": "def-public.ActionDefinition", + "text": "ActionDefinition" }, - ") => void; readonly unregisterAction: (actionId: string) => void; readonly getTrigger: (triggerId: string) => ", - "TriggerContract", - "; readonly hasAction: (actionId: string) => boolean; readonly getAction: (id: string) => ", + ") => void; readonly getAction: (id: string) => ", { "pluginId": "uiActions", "scope": "public", diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 1b8cde0683132..7c645a70667fe 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-11-16 +date: 2023-11-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.devdocs.json b/api_docs/unified_search.devdocs.json index 09a1feea1ceee..0d5e841aaada5 100644 --- a/api_docs/unified_search.devdocs.json +++ b/api_docs/unified_search.devdocs.json @@ -635,7 +635,7 @@ }, "[] | undefined; refreshInterval?: number | undefined; iconType?: ", "IconType", - " | undefined; showQueryInput?: boolean | undefined; dataTestSubj?: string | undefined; showSaveQuery?: boolean | undefined; customSubmitButton?: React.ReactNode; dataViewPickerOverride?: React.ReactNode; screenTitle?: string | undefined; showQueryMenu?: boolean | undefined; showFilterBar?: boolean | undefined; showDatePicker?: boolean | undefined; showAutoRefreshOnly?: boolean | undefined; filtersForSuggestions?: ", + " | undefined; dataTestSubj?: string | undefined; showSaveQuery?: boolean | undefined; customSubmitButton?: React.ReactNode; dataViewPickerOverride?: React.ReactNode; screenTitle?: string | undefined; showQueryMenu?: boolean | undefined; showQueryInput?: boolean | undefined; showFilterBar?: boolean | undefined; showDatePicker?: boolean | undefined; showAutoRefreshOnly?: boolean | undefined; filtersForSuggestions?: ", { "pluginId": "@kbn/es-query", "scope": "common", diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index dd540663bb609..2869a6b8e168d 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-11-16 +date: 2023-11-27 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 996c7f5528dcc..0b520a3fe5c59 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-11-16 +date: 2023-11-27 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 814bcd995e63a..d99b9e86d1732 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-11-16 +date: 2023-11-27 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 9f93b59207c10..ba3ddcdd53084 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-11-16 +date: 2023-11-27 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 fb864ad037986..1977c74caf100 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-11-16 +date: 2023-11-27 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 8098cf149e57e..d49961b39c671 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-11-16 +date: 2023-11-27 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 40877abcb6348..3748ba1e8e0a7 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-11-16 +date: 2023-11-27 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 0d4725984ca1e..b24468ee76b3f 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-11-16 +date: 2023-11-27 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 7857b49c7ecdc..b207c7e4e454e 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-11-16 +date: 2023-11-27 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 c1307ba118b0b..83df4f3c27850 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-11-16 +date: 2023-11-27 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 37333abc730d5..45b970eddf044 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-11-16 +date: 2023-11-27 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 cb39b15983e16..8b17df03d5d55 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-11-16 +date: 2023-11-27 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 882aaf0a79f71..9ebfe3bce0023 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-11-16 +date: 2023-11-27 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 d1fa982b691c8..50871bd26054b 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-11-16 +date: 2023-11-27 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 7084cbc94b13e..6b93e6b7fd3ab 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-11-16 +date: 2023-11-27 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 44036f2755796..092dc3f0f4c0d 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-11-16 +date: 2023-11-27 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 b9e6229c9486b..a10f69575cdb9 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -4423,22 +4423,16 @@ "children": [ { "parentPluginId": "visualizations", - "id": "def-public.VisTypeAlias.aliasPath", - "type": "string", - "tags": [], - "label": "aliasPath", - "description": [], - "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "visualizations", - "id": "def-public.VisTypeAlias.aliasApp", - "type": "string", + "id": "def-public.VisTypeAlias.alias", + "type": "Object", "tags": [], - "label": "aliasApp", - "description": [], + "label": "alias", + "description": [ + "\nProvide `alias` when your visualization has a dedicated app for creation.\nTODO: Provide a generic callback to create visualizations inline." + ], + "signature": [ + "{ app: string; path: string; } | undefined" + ], "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", "deprecated": false, "trackAdoption": false @@ -5874,31 +5868,6 @@ "deprecated": false, "trackAdoption": false, "children": [ - { - "parentPluginId": "visualizations", - "id": "def-public.VisualizationListItem.editUrl", - "type": "string", - "tags": [], - "label": "editUrl", - "description": [], - "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "visualizations", - "id": "def-public.VisualizationListItem.editApp", - "type": "string", - "tags": [], - "label": "editApp", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "visualizations", "id": "def-public.VisualizationListItem.error", @@ -6055,6 +6024,20 @@ "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "visualizations", + "id": "def-public.VisualizationListItem.editor", + "type": "CompoundType", + "tags": [], + "label": "editor", + "description": [], + "signature": [ + "{ editUrl: string; editApp?: string | undefined; } | { onEdit: (savedObjectId: string) => Promise; }" + ], + "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index ce10e1dd34ed8..dbea80fe3bee9 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-11-16 +date: 2023-11-27 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 | |-------------------|-----------|------------------------|-----------------| -| 837 | 12 | 807 | 19 | +| 835 | 12 | 804 | 19 | ## Client diff --git a/catalog-info.yaml b/catalog-info.yaml index e7aa120004486..dbdc1dc24aa03 100644 --- a/catalog-info.yaml +++ b/catalog-info.yaml @@ -56,15 +56,7 @@ spec: teams: kibana-operations: access_level: MANAGE_BUILD_AND_READ - appex-qa: - access_level: BUILD_AND_READ - security-engineering-productivity: - access_level: BUILD_AND_READ - fleet: - access_level: BUILD_AND_READ - kibana-tech-leads: - access_level: BUILD_AND_READ - kibana-core: + kibana-release-operators: access_level: BUILD_AND_READ cloud-tooling: access_level: BUILD_AND_READ diff --git a/docs/api/alerting/enable_rule.asciidoc b/docs/api/alerting/enable_rule.asciidoc index f51f6c9295332..ba04d0147944a 100644 --- a/docs/api/alerting/enable_rule.asciidoc +++ b/docs/api/alerting/enable_rule.asciidoc @@ -6,8 +6,6 @@ Enable a rule. -WARNING: This API supports <> only. - [NOTE] ==== For the most up-to-date API details, refer to the diff --git a/docs/setup/connect-to-elasticsearch.asciidoc b/docs/setup/connect-to-elasticsearch.asciidoc index fef9ae71a085b..da4784f7ea36e 100644 --- a/docs/setup/connect-to-elasticsearch.asciidoc +++ b/docs/setup/connect-to-elasticsearch.asciidoc @@ -54,9 +54,9 @@ Details for each programming language library that Elastic provides are in the https://www.elastic.co/guide/en/elasticsearch/client/index.html[{es} Client documentation]. If you are running {kib} on our hosted {es} Service, -click *Endpoints* on the *Integrations* view +click *Connection details* on the *Integrations* view to verify your {es} endpoint and Cloud ID, and create API keys for integration. -Alternatively, the *Endpoints* are also accessible through the top bar help menu. +Alternatively, the *Connection details* are also accessible through the top bar help menu. [float] === Add sample data diff --git a/docs/user/dashboard/images/dashboard_links_panel.png b/docs/user/dashboard/images/dashboard_links_panel.png index f6334f4df29f4..23b37879378ef 100644 Binary files a/docs/user/dashboard/images/dashboard_links_panel.png and b/docs/user/dashboard/images/dashboard_links_panel.png differ diff --git a/docs/user/plugins.asciidoc b/docs/user/plugins.asciidoc index 0bf407ac1ff90..8dc3d8b6e9e0d 100644 --- a/docs/user/plugins.asciidoc +++ b/docs/user/plugins.asciidoc @@ -81,7 +81,6 @@ Use it to create, edit and embed visualizations, and also to search inside an em * https://github.com/sw-jung/kibana_markdown_doc_view[Markdown Doc View] (sw-jung) - A plugin for custom doc view using markdown+handlebars template. * https://github.com/datasweet-fr/kibana-datasweet-formula[Datasweet Formula] (datasweet) - enables calculated metric on any standard Kibana visualization. -* https://github.com/pjhampton/kibana-prometheus-exporter[Prometheus Exporter] - exports the Kibana metrics in the prometheus format NOTE: To add your plugin to this page, open a {kib-repo}tree/{branch}/docs/plugins/known-plugins.asciidoc[pull request]. @@ -183,4 +182,4 @@ you must specify the path to that configuration file each time you use the `bin/ 0:: Success 64:: Unknown command or incorrect option parameter 74:: I/O error -70:: Other error +70:: Other error \ No newline at end of file diff --git a/package.json b/package.json index 35c4197f57181..fd8def208fd03 100644 --- a/package.json +++ b/package.json @@ -166,6 +166,7 @@ "@kbn/banners-plugin": "link:x-pack/plugins/banners", "@kbn/bfetch-explorer-plugin": "link:examples/bfetch_explorer", "@kbn/bfetch-plugin": "link:src/plugins/bfetch", + "@kbn/calculate-auto": "link:packages/kbn-calculate-auto", "@kbn/canvas-plugin": "link:x-pack/plugins/canvas", "@kbn/cases-api-integration-test-plugin": "link:x-pack/test/cases_api_integration/common/plugins/cases", "@kbn/cases-components": "link:packages/kbn-cases-components", @@ -352,6 +353,7 @@ "@kbn/crypto": "link:packages/kbn-crypto", "@kbn/crypto-browser": "link:packages/kbn-crypto-browser", "@kbn/custom-branding-plugin": "link:x-pack/plugins/custom_branding", + "@kbn/custom-icons": "link:packages/kbn-custom-icons", "@kbn/custom-integrations": "link:packages/kbn-custom-integrations", "@kbn/custom-integrations-plugin": "link:src/plugins/custom_integrations", "@kbn/dashboard-enhanced-plugin": "link:x-pack/plugins/dashboard_enhanced", @@ -389,6 +391,7 @@ "@kbn/ecs": "link:packages/kbn-ecs", "@kbn/ecs-data-quality-dashboard": "link:x-pack/packages/security-solution/ecs_data_quality_dashboard", "@kbn/ecs-data-quality-dashboard-plugin": "link:x-pack/plugins/ecs_data_quality_dashboard", + "@kbn/elastic-agent-utils": "link:packages/kbn-elastic-agent-utils", "@kbn/elastic-assistant": "link:x-pack/packages/kbn-elastic-assistant", "@kbn/elastic-assistant-plugin": "link:x-pack/plugins/elastic_assistant", "@kbn/elasticsearch-client-plugin": "link:test/plugin_functional/plugins/elasticsearch_client_plugin", @@ -552,6 +555,7 @@ "@kbn/ml-runtime-field-utils": "link:x-pack/packages/ml/runtime_field_utils", "@kbn/ml-string-hash": "link:x-pack/packages/ml/string_hash", "@kbn/ml-trained-models-utils": "link:x-pack/packages/ml/trained_models_utils", + "@kbn/ml-ui-actions": "link:x-pack/packages/ml/ui_actions", "@kbn/ml-url-state": "link:x-pack/packages/ml/url_state", "@kbn/monaco": "link:packages/kbn-monaco", "@kbn/monitoring-collection-plugin": "link:x-pack/plugins/monitoring_collection", @@ -746,7 +750,6 @@ "@kbn/status-plugin-a-plugin": "link:test/server_integration/plugins/status_plugin_a", "@kbn/status-plugin-b-plugin": "link:test/server_integration/plugins/status_plugin_b", "@kbn/std": "link:packages/kbn-std", - "@kbn/subscription-tracking": "link:packages/kbn-subscription-tracking", "@kbn/synthetics-plugin": "link:x-pack/plugins/synthetics", "@kbn/task-manager-fixture-plugin": "link:x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture", "@kbn/task-manager-performance-plugin": "link:x-pack/test/plugin_api_perf/plugins/task_manager_performance", @@ -921,7 +924,7 @@ "getos": "^3.1.0", "globby": "^11.1.0", "gpt-tokenizer": "^2.1.2", - "handlebars": "4.7.7", + "handlebars": "4.7.8", "he": "^1.2.0", "history": "^4.9.0", "hjson": "3.2.1", @@ -952,7 +955,7 @@ "jsonwebtoken": "^9.0.0", "jsts": "^1.6.2", "kea": "^2.6.0", - "langchain": "^0.0.151", + "langchain": "^0.0.192", "launchdarkly-js-client-sdk": "^3.1.4", "launchdarkly-node-server-sdk": "^7.0.3", "load-json-file": "^6.2.0", @@ -1234,6 +1237,7 @@ "@kbn/managed-vscode-config": "link:packages/kbn-managed-vscode-config", "@kbn/managed-vscode-config-cli": "link:packages/kbn-managed-vscode-config-cli", "@kbn/management-storybook-config": "link:packages/kbn-management/storybook/config", + "@kbn/mock-idp-plugin": "link:packages/kbn-mock-idp-plugin", "@kbn/openapi-generator": "link:packages/kbn-openapi-generator", "@kbn/optimizer": "link:packages/kbn-optimizer", "@kbn/optimizer-webpack-helpers": "link:packages/kbn-optimizer-webpack-helpers", @@ -1466,7 +1470,7 @@ "blob-polyfill": "^7.0.20220408", "callsites": "^3.1.0", "chance": "1.0.18", - "chromedriver": "^119.0.0", + "chromedriver": "^119.0.1", "clean-webpack-plugin": "^3.0.0", "cli-table3": "^0.6.1", "copy-webpack-plugin": "^6.0.2", diff --git a/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.mocks.ts b/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.mocks.ts index fadd1ffee2ae0..7608606c39395 100644 --- a/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.mocks.ts +++ b/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.mocks.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import * as RxJS from 'rxjs'; import type { FullStoryApi } from './types'; export const fullStoryApiMock: jest.Mocked = { @@ -22,3 +23,10 @@ jest.doMock('./load_snippet', () => { loadSnippet: () => fullStoryApiMock, }; }); + +jest.doMock('rxjs', () => { + return { + ...RxJS, + debounceTime: () => RxJS.identity, + }; +}); diff --git a/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts b/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts index 4e874b405add1..88f53fd7f837d 100644 --- a/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts +++ b/packages/analytics/shippers/fullstory/src/fullstory_shipper.test.ts @@ -28,6 +28,10 @@ describe('FullStoryShipper', () => { ); }); + afterEach(() => { + fullstoryShipper.shutdown(); + }); + describe('extendContext', () => { describe('FS.identify', () => { test('calls `identify` when the userId is provided', () => { @@ -119,6 +123,21 @@ describe('FullStoryShipper', () => { labels: { serverless_str: 'test' }, }); }); + + test('emits once only if nothing changes', () => { + const context = { + userId: 'test-user-id', + version: '1.2.3', + cloudId: 'test-es-org-id', + labels: { serverless: 'test' }, + foo: 'bar', + }; + fullstoryShipper.extendContext(context); + fullstoryShipper.extendContext(context); + expect(fullStoryApiMock.setVars).toHaveBeenCalledTimes(1); + fullstoryShipper.extendContext(context); + expect(fullStoryApiMock.setVars).toHaveBeenCalledTimes(1); + }); }); }); diff --git a/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts b/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts index bcb95ae38f1fb..a4ad730f87b2e 100644 --- a/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts +++ b/packages/analytics/shippers/fullstory/src/fullstory_shipper.ts @@ -12,6 +12,7 @@ import type { Event, IShipper, } from '@kbn/analytics-client'; +import { Subject, distinct, debounceTime, map, filter, Subscription } from 'rxjs'; import { get, has } from 'lodash'; import { set } from '@kbn/safer-lodash-set'; import type { FullStoryApi } from './types'; @@ -55,8 +56,18 @@ export interface FullStoryShipperConfig extends FullStorySnippetConfig { * If this setting is provided, it'll only send the event types specified in this list. */ eventTypesAllowlist?: string[]; + pageVarsDebounceTimeMs?: number; } +interface FullStoryUserVars { + userId?: string; + isElasticCloudUser?: boolean; + cloudIsElasticStaffOwned?: boolean; + cloudTrialEndDate?: string; +} + +type FullStoryPageContext = Pick; + /** * FullStory shipper. */ @@ -67,6 +78,9 @@ export class FullStoryShipper implements IShipper { private readonly fullStoryApi: FullStoryApi; private lastUserId: string | undefined; private readonly eventTypesAllowlist?: string[]; + private readonly pageContext$ = new Subject(); + private readonly userContext$ = new Subject(); + private readonly subscriptions = new Subscription(); /** * Creates a new instance of the FullStoryShipper. @@ -77,9 +91,54 @@ export class FullStoryShipper implements IShipper { config: FullStoryShipperConfig, private readonly initContext: AnalyticsClientInitContext ) { - const { eventTypesAllowlist, ...snippetConfig } = config; + const { eventTypesAllowlist, pageVarsDebounceTimeMs = 500, ...snippetConfig } = config; this.fullStoryApi = loadSnippet(snippetConfig); this.eventTypesAllowlist = eventTypesAllowlist; + + this.subscriptions.add( + this.userContext$ + .pipe( + distinct(({ userId, isElasticCloudUser, cloudIsElasticStaffOwned, cloudTrialEndDate }) => + [userId, isElasticCloudUser, cloudIsElasticStaffOwned, cloudTrialEndDate].join('-') + ) + ) + .subscribe((userVars) => this.updateUserVars(userVars)) + ); + + this.subscriptions.add( + this.pageContext$ + .pipe( + map((newContext) => { + // Cherry-picking fields because FS limits the number of fields that can be sent. + // > Note: You can capture up to 20 unique page properties (exclusive of pageName) for any given page + // > and up to 500 unique page properties across all pages. + // https://help.fullstory.com/hc/en-us/articles/1500004101581-FS-setVars-API-Sending-custom-page-data-to-FullStory + return PAGE_VARS_KEYS.reduce((acc, key) => { + if (has(newContext, key)) { + set(acc, key, get(newContext, key)); + } + return acc; + }, {} as Partial & Record); + }), + filter((pageVars) => Object.keys(pageVars).length > 0), + // Wait for anything to actually change. + distinct((pageVars) => { + const sortedKeys = Object.keys(pageVars).sort(); + return sortedKeys.map((key) => pageVars[key]).join('-'); + }), + // We need some debounce time to ensure everything is updated before calling FS because some properties cannot be changed twice for the same URL. + debounceTime(pageVarsDebounceTimeMs) + ) + .subscribe((pageVars) => { + this.initContext.logger.debug( + `Calling FS.setVars with context ${JSON.stringify(pageVars)}` + ); + this.fullStoryApi.setVars('page', { + ...formatPayload(pageVars), + ...(pageVars.version ? getParsedVersion(pageVars.version) : {}), + }); + }) + ); } /** @@ -89,57 +148,11 @@ export class FullStoryShipper implements IShipper { public extendContext(newContext: EventContext): void { this.initContext.logger.debug(`Received context ${JSON.stringify(newContext)}`); - // FullStory requires different APIs for different type of contexts. - const { - userId, - isElasticCloudUser, - cloudIsElasticStaffOwned, - cloudTrialEndDate, - ...nonUserContext - } = newContext; - - // Call it only when the userId changes - if (userId && userId !== this.lastUserId) { - this.initContext.logger.debug(`Calling FS.identify with userId ${userId}`); - // We need to call the API for every new userId (restarting the session). - this.fullStoryApi.identify(userId); - this.lastUserId = userId; - } - - // User-level context - if ( - typeof isElasticCloudUser === 'boolean' || - typeof cloudIsElasticStaffOwned === 'boolean' || - cloudTrialEndDate - ) { - const userVars = { - isElasticCloudUser, - cloudIsElasticStaffOwned, - cloudTrialEndDate, - }; - this.initContext.logger.debug(`Calling FS.setUserVars with ${JSON.stringify(userVars)}`); - this.fullStoryApi.setUserVars(formatPayload(userVars)); - } - - // Cherry-picking fields because FS limits the number of fields that can be sent. - // > Note: You can capture up to 20 unique page properties (exclusive of pageName) for any given page - // > and up to 500 unique page properties across all pages. - // https://help.fullstory.com/hc/en-us/articles/1500004101581-FS-setVars-API-Sending-custom-page-data-to-FullStory - const pageVars = PAGE_VARS_KEYS.reduce((acc, key) => { - if (has(nonUserContext, key)) { - set(acc, key, get(nonUserContext, key)); - } - return acc; - }, {} as Partial> & Record); - + // FullStory requires different APIs for different type of contexts: + // User-level context. + this.userContext$.next(newContext); // Event-level context. At the moment, only the scope `page` is supported by FullStory for webapps. - if (Object.keys(pageVars).length) { - this.initContext.logger.debug(`Calling FS.setVars with context ${JSON.stringify(pageVars)}`); - this.fullStoryApi.setVars('page', { - ...formatPayload(pageVars), - ...(pageVars.version ? getParsedVersion(pageVars.version) : {}), - }); - } + this.pageContext$.next(newContext); } /** @@ -184,9 +197,38 @@ export class FullStoryShipper implements IShipper { /** * Shuts down the shipper. - * It doesn't really do anything inside because this shipper doesn't hold any internal queues. */ public shutdown() { - // No need to do anything here for now. + this.subscriptions.unsubscribe(); + } + + private updateUserVars({ + userId, + isElasticCloudUser, + cloudIsElasticStaffOwned, + cloudTrialEndDate, + }: FullStoryUserVars) { + // Call it only when the userId changes + if (userId && userId !== this.lastUserId) { + this.initContext.logger.debug(`Calling FS.identify with userId ${userId}`); + // We need to call the API for every new userId (restarting the session). + this.fullStoryApi.identify(userId); + this.lastUserId = userId; + } + + // User-level context + if ( + typeof isElasticCloudUser === 'boolean' || + typeof cloudIsElasticStaffOwned === 'boolean' || + cloudTrialEndDate + ) { + const userVars = { + isElasticCloudUser, + cloudIsElasticStaffOwned, + cloudTrialEndDate, + }; + this.initContext.logger.debug(`Calling FS.setUserVars with ${JSON.stringify(userVars)}`); + this.fullStoryApi.setUserVars(formatPayload(userVars)); + } } } diff --git a/packages/cloud/deployment_details/deployment_details_modal.tsx b/packages/cloud/deployment_details/deployment_details_modal.tsx index c715b2d830c85..4064d289bf680 100644 --- a/packages/cloud/deployment_details/deployment_details_modal.tsx +++ b/packages/cloud/deployment_details/deployment_details_modal.tsx @@ -38,8 +38,8 @@ export const DeploymentDetailsModal: FC = ({ closeModal }) => { > - {i18n.translate('cloud.deploymentDetails.helpMenuLinks.endpoints', { - defaultMessage: 'Endpoints', + {i18n.translate('cloud.deploymentDetails.helpMenuLinks.connectionDetails', { + defaultMessage: 'Connection details', })} diff --git a/packages/content-management/table_list_view_table/src/components/item_details.tsx b/packages/content-management/table_list_view_table/src/components/item_details.tsx index 0b2f52b216905..6c14c9c52021d 100644 --- a/packages/content-management/table_list_view_table/src/components/item_details.tsx +++ b/packages/content-management/table_list_view_table/src/components/item_details.tsx @@ -57,7 +57,7 @@ export function ItemDetails({ ); const onClickTitleHandler = useMemo(() => { - if (!onClickTitle) { + if (!onClickTitle || getDetailViewLink?.(item)) { return undefined; } @@ -65,7 +65,7 @@ export function ItemDetails({ e.preventDefault(); onClickTitle(item); }) as React.MouseEventHandler; - }, [item, onClickTitle]); + }, [item, onClickTitle, getDetailViewLink]); const renderTitle = useCallback(() => { const href = getDetailViewLink ? getDetailViewLink(item) : undefined; @@ -79,7 +79,7 @@ export function ItemDetails({ {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} diff --git a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx index ccf6ef791d8d4..f7de8935ea949 100644 --- a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx +++ b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx @@ -289,12 +289,6 @@ function TableListViewTableComp({ ); } - if (getDetailViewLink && onClickTitle) { - throw new Error( - `[TableListView] Either "getDetailViewLink" or "onClickTitle" can be provided. Not both.` - ); - } - if (contentEditor.isReadonly === false && contentEditor.onSave === undefined) { throw new Error( `[TableListView] A value for [contentEditor.onSave()] must be provided when [contentEditor.isReadonly] is false.` diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx index 8bd690fba8a7e..089613939c833 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/breadcrumbs.tsx @@ -100,6 +100,8 @@ function buildRootCrumb({ i18n.translate('core.ui.primaryNav.cloud.projectLabel', { defaultMessage: 'Project', }), + // increase the max-width of the root breadcrumb to not truncate too soon + style: { maxWidth: '320px' }, popoverContent: ( { { id: 'root', title: 'Root', - path: ['root'], + path: 'root', breadcrumbStatus: 'hidden' as 'hidden', children: [ { id: 'subNav', - path: ['root', 'subNav'], + path: 'root.subNav', title: '', // intentionally empty to skip rendering children: [ { id: 'navItem1', title: 'Nav Item 1', - path: ['root', 'subNav', 'navItem1'], + path: 'root.subNav.navItem1', deepLink: { id: 'navItem1', title: 'Nav Item 1', @@ -114,6 +114,9 @@ describe('breadcrumbs', () => { "popoverProps": Object { "panelPaddingSize": "none", }, + "style": Object { + "maxWidth": "320px", + }, "text": "Project", }, Object { @@ -176,6 +179,9 @@ describe('breadcrumbs', () => { "popoverProps": Object { "panelPaddingSize": "none", }, + "style": Object { + "maxWidth": "320px", + }, "text": "Project", }, Object { @@ -232,6 +238,9 @@ describe('breadcrumbs', () => { "popoverProps": Object { "panelPaddingSize": "none", }, + "style": Object { + "maxWidth": "320px", + }, "text": "Project", }, Object { @@ -309,12 +318,12 @@ describe('getActiveNodes$()', () => { { id: 'root', title: 'Root', - path: ['root'], + path: 'root', children: [ { id: 'item1', title: 'Item 1', - path: ['root', 'item1'], + path: 'root.item1', deepLink: { id: 'item1', title: 'Item 1', @@ -335,14 +344,12 @@ describe('getActiveNodes$()', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'item1', title: 'Item 1', - isActive: true, - path: ['root', 'item1'], + path: 'root.item1', deepLink: { id: 'item1', title: 'Item 1', @@ -366,12 +373,12 @@ describe('getActiveNodes$()', () => { { id: 'root', title: 'Root', - path: ['root'], + path: 'root', children: [ { id: 'item1', title: 'Item 1', - path: ['root', 'item1'], + path: 'root.item1', getIsActive: () => true, }, ], @@ -386,14 +393,12 @@ describe('getActiveNodes$()', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'item1', title: 'Item 1', - isActive: true, - path: ['root', 'item1'], + path: 'root.item1', getIsActive: expect.any(Function), }, ], diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.test.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.test.ts index 93abfd5d5a1f7..a207162e060cb 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.test.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.test.ts @@ -23,27 +23,27 @@ describe('flattenNav', () => { { id: 'root', title: 'Root', - path: ['root'], + path: 'root', children: [ { id: 'item1', title: 'Item 1', - path: ['root', 'item1'], + path: 'root.item1', }, { id: 'item2', title: 'Item 2', - path: ['root', 'item2'], + path: 'root.item2', }, { id: 'group1', title: 'Group 1', - path: ['root', 'group1'], + path: 'root.group1', children: [ { id: 'item3', title: 'Item 3', - path: ['root', 'group1', 'item3'], + path: 'root.group1.item3', }, ], }, @@ -55,27 +55,27 @@ describe('flattenNav', () => { '[0]': { id: 'root', title: 'Root', - path: ['root'], + path: 'root', }, '[0][0]': { id: 'item1', title: 'Item 1', - path: ['root', 'item1'], + path: 'root.item1', }, '[0][1]': { id: 'item2', title: 'Item 2', - path: ['root', 'item2'], + path: 'root.item2', }, '[0][2]': { id: 'group1', title: 'Group 1', - path: ['root', 'group1'], + path: 'root.group1', }, '[0][2][0]': { id: 'item3', title: 'Item 3', - path: ['root', 'group1', 'item3'], + path: 'root.group1.item3', }, }; @@ -89,18 +89,18 @@ describe('findActiveNodes', () => { '[0]': { id: 'root', title: 'Root', - path: ['root'], + path: 'root', }, '[0][0]': { id: 'group1', title: 'Group 1', - path: ['root', 'group1'], + path: 'root.group1', }, '[0][0][0]': { id: 'item1', title: 'Item 1', deepLink: getDeepLink('item1', 'item1'), - path: ['root', 'group1', 'item1'], + path: 'root.group1.item1', }, }; @@ -109,21 +109,18 @@ describe('findActiveNodes', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'group1', title: 'Group 1', - isActive: true, - path: ['root', 'group1'], + path: 'root.group1', }, { id: 'item1', title: 'Item 1', - isActive: true, deepLink: getDeepLink('item1', 'item1'), - path: ['root', 'group1', 'item1'], + path: 'root.group1.item1', }, ], ]); @@ -134,35 +131,35 @@ describe('findActiveNodes', () => { '[0]': { id: 'root', title: 'Root', - path: ['root'], + path: 'root', }, '[0][0]': { id: 'group1', title: 'Group 1', deepLink: getDeepLink('group1', 'group1'), - path: ['root', 'group1'], + path: 'root.group1', }, '[0][0][0]': { id: 'group1A', title: 'Group 1A', - path: ['root', 'group1', 'group1A'], + path: 'root.group1.group1A', }, '[0][0][0][0]': { id: 'item1', title: 'Item 1', deepLink: getDeepLink('item1', 'item1'), - path: ['root', 'group1', 'group1A', 'item1'], + path: 'root.group1.group1A.item1', }, '[0][1]': { id: 'group2', title: 'Group 2', - path: ['root', 'group2'], + path: 'root.group2', }, '[0][1][0]': { id: 'item2', title: 'Item 2', deepLink: getDeepLink('item1', 'item1'), // Same link as above, should match both - path: ['root', 'group2', 'item2'], + path: 'root.group2.item2', }, }; @@ -172,49 +169,42 @@ describe('findActiveNodes', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'group1', title: 'Group 1', - isActive: true, deepLink: getDeepLink('group1', 'group1'), - path: ['root', 'group1'], + path: 'root.group1', }, { id: 'group1A', title: 'Group 1A', - isActive: true, - path: ['root', 'group1', 'group1A'], + path: 'root.group1.group1A', }, { id: 'item1', title: 'Item 1', - isActive: true, deepLink: getDeepLink('item1', 'item1'), - path: ['root', 'group1', 'group1A', 'item1'], + path: 'root.group1.group1A.item1', }, ], [ { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'group2', title: 'Group 2', - isActive: true, - path: ['root', 'group2'], + path: 'root.group2', }, { id: 'item2', title: 'Item 2', - isActive: true, deepLink: getDeepLink('item1', 'item1'), - path: ['root', 'group2', 'item2'], + path: 'root.group2.item2', }, ], ]); @@ -225,13 +215,13 @@ describe('findActiveNodes', () => { '[0]': { id: 'root', title: 'Root', - path: ['root'], + path: 'root', }, '[0][1]': { id: 'item1', title: 'Item 1', deepLink: getDeepLink('item1', `item1#/foo/bar`), - path: ['root', 'item1'], + path: 'root.item1', }, }; @@ -240,15 +230,13 @@ describe('findActiveNodes', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'item1', title: 'Item 1', - isActive: true, deepLink: getDeepLink('item1', `item1#/foo/bar`), - path: ['root', 'item1'], + path: 'root.item1', }, ], ]); @@ -260,7 +248,7 @@ describe('findActiveNodes', () => { id: 'root', title: 'Root', deepLink: getDeepLink('root', `root`), - path: ['root'], + path: 'root', }, }; @@ -269,9 +257,8 @@ describe('findActiveNodes', () => { { id: 'root', title: 'Root', - isActive: true, deepLink: getDeepLink('root', `root`), - path: ['root'], + path: 'root', }, ], ]); @@ -282,19 +269,19 @@ describe('findActiveNodes', () => { '[0]': { id: 'root', title: 'Root', - path: ['root'], + path: 'root', }, '[0][1]': { id: 'item1', title: 'Item 1', deepLink: getDeepLink('item1', `item1#/foo`), - path: ['root', 'item1'], + path: 'root.item1', }, '[0][2]': { id: 'item2', title: 'Item 2', deepLink: getDeepLink('item2', `item1#/foo/bar`), // Should match this one - path: ['root', 'item2'], + path: 'root.item2', }, }; @@ -303,15 +290,13 @@ describe('findActiveNodes', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'item2', title: 'Item 2', - isActive: true, deepLink: getDeepLink('item2', `item1#/foo/bar`), - path: ['root', 'item2'], + path: 'root.item2', }, ], ]); @@ -322,13 +307,13 @@ describe('findActiveNodes', () => { '[0]': { id: 'root', title: 'Root', - path: ['root'], + path: 'root', }, '[0][1]': { id: 'item1', title: 'Item 1', deepLink: getDeepLink('item1', `appRoot`), - path: ['root', 'item1'], + path: 'root.item1', }, }; @@ -337,15 +322,13 @@ describe('findActiveNodes', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'item1', title: 'Item 1', - isActive: true, deepLink: getDeepLink('item1', `appRoot`), - path: ['root', 'item1'], + path: 'root.item1', }, ], ]; @@ -362,19 +345,19 @@ describe('findActiveNodes', () => { '[0]': { id: 'root', title: 'Root', - path: ['root'], + path: 'root', }, '[0][1]': { id: 'item1', title: 'Item 1', - path: ['root', 'item1'], + path: 'root.item1', getIsActive: ({ location }) => location.pathname.startsWith('/foo'), // Should match }, '[0][2]': { id: 'item2', title: 'Item 2', deepLink: getDeepLink('item2', 'item2'), // Should match - path: ['root', 'item2'], + path: 'root.item2', }, }; @@ -393,30 +376,26 @@ describe('findActiveNodes', () => { { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'item1', title: 'Item 1', - isActive: true, getIsActive: expect.any(Function), - path: ['root', 'item1'], + path: 'root.item1', }, ], [ { id: 'root', title: 'Root', - isActive: true, - path: ['root'], + path: 'root', }, { id: 'item2', title: 'Item 2', - isActive: true, deepLink: getDeepLink('item2', 'item2'), - path: ['root', 'item2'], + path: 'root.item2', }, ], ]); diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts index 48158025414cb..63f7f8e612c2e 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/utils.ts @@ -114,7 +114,6 @@ export const findActiveNodes = ( const activeNodeFromKey = (key: string): ChromeProjectNavigationNode => ({ ...navTree[key], - isActive: true, }); Object.entries(navTree).forEach(([key, node]) => { diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/breadcrumbs.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/breadcrumbs.tsx index 4ce22ba727e11..0d453290ba3c4 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/breadcrumbs.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/breadcrumbs.tsx @@ -43,5 +43,18 @@ export function Breadcrumbs({ breadcrumbs$ }: Props) { }; }); - return ; + return ( + + ); } diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx index 30fe35be0b551..80f108c8be784 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx @@ -62,6 +62,17 @@ const getHeaderCss = ({ size }: EuiThemeComputed) => ({ top: 2px; `, }, + leftHeaderSection: css` + // needed to enable breadcrumbs truncation + min-width: 0; + flex-shrink: 1; + `, + breadcrumbsSectionItem: css` + min-width: 0; // needed to enable breadcrumbs truncation + `, + redirectAppLinksContainer: css` + min-width: 0; // needed to enable breadcrumbs truncation + `, }); type HeaderCss = ReturnType; @@ -181,7 +192,7 @@ export const ProjectHeader = ({
    - + {children} @@ -196,8 +207,11 @@ export const ProjectHeader = ({ /> - - + + diff --git a/packages/core/chrome/core-chrome-browser/src/project_navigation.ts b/packages/core/chrome/core-chrome-browser/src/project_navigation.ts index b879cf6f716d7..fe7c7bfc7c187 100644 --- a/packages/core/chrome/core-chrome-browser/src/project_navigation.ts +++ b/packages/core/chrome/core-chrome-browser/src/project_navigation.ts @@ -169,7 +169,7 @@ export interface ChromeProjectNavigationNode extends NodeDefinitionBase { /** Optional title. If not provided and a "link" is provided the title will be the Deep link title */ title: string; /** Path in the tree of the node */ - path: string[]; + path: string; /** App id or deeplink id */ deepLink?: ChromeNavLink; /** @@ -178,9 +178,10 @@ export interface ChromeProjectNavigationNode extends NodeDefinitionBase { */ children?: ChromeProjectNavigationNode[]; /** - * Flag to indicate if the node is currently active. + * Handler to render the node item with custom JSX. This handler is added to render the `children` of + * the Navigation.Item component when React components are used to declare the navigation tree. */ - isActive?: boolean; + renderItem?: () => React.ReactNode; } /** @public */ diff --git a/packages/kbn-subscription-tracking/src/helpers.ts b/packages/core/http/core-http-server-internal/src/http_server.test.mocks.ts similarity index 56% rename from packages/kbn-subscription-tracking/src/helpers.ts rename to packages/core/http/core-http-server-internal/src/http_server.test.mocks.ts index 251c0d1c04116..6b0eadee96f31 100644 --- a/packages/kbn-subscription-tracking/src/helpers.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.test.mocks.ts @@ -6,9 +6,13 @@ * Side Public License, v 1. */ -import type { SubscriptionContextData } from '../types'; +export const setTlsConfigMock = jest.fn(); -const sourceStringRegEx = /^(\w[\w\-_]*)__(\w[\w\-_]*)$/; -export function isValidContext(context: SubscriptionContextData): boolean { - return context.feature.length > 0 && sourceStringRegEx.test(context.source); -} +jest.doMock('@kbn/server-http-tools', () => { + const actual = jest.requireActual('@kbn/server-http-tools'); + return { + ...actual, + setTlsConfig: setTlsConfigMock, + createServer: jest.fn(actual.createServer), + }; +}); diff --git a/packages/core/http/core-http-server-internal/src/http_server.test.ts b/packages/core/http/core-http-server-internal/src/http_server.test.ts index f70b035c5f22f..d50156df94ede 100644 --- a/packages/core/http/core-http-server-internal/src/http_server.test.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.test.ts @@ -6,20 +6,12 @@ * Side Public License, v 1. */ -jest.mock('@kbn/server-http-tools', () => { - const module = jest.requireActual('@kbn/server-http-tools'); - return { - ...module, - createServer: jest.fn(module.createServer), - }; -}); - +import { setTlsConfigMock } from './http_server.test.mocks'; import { Server } from 'http'; import { rm, mkdtemp, readFile, writeFile } from 'fs/promises'; import supertest from 'supertest'; import { omit } from 'lodash'; import { join } from 'path'; - import { ByteSizeValue, schema } from '@kbn/config-schema'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import type { @@ -37,7 +29,7 @@ import { HttpServer } from './http_server'; import { Readable } from 'stream'; import { KBN_CERT_PATH, KBN_KEY_PATH } from '@kbn/dev-utils'; import moment from 'moment'; -import { of } from 'rxjs'; +import { of, Observable, BehaviorSubject } from 'rxjs'; const routerOptions: RouterOptions = { isDev: false, @@ -52,8 +44,12 @@ const cookieOptions = { }; let server: HttpServer; + let config: HttpConfig; +let config$: Observable; + let configWithSSL: HttpConfig; +let configWithSSL$: Observable; const loggingService = loggingSystemMock.create(); const logger = loggingService.get(); @@ -85,6 +81,7 @@ beforeEach(() => { cdn: {}, shutdownTimeout: moment.duration(500, 'ms'), } as any; + config$ = of(config); configWithSSL = { ...config, @@ -97,6 +94,7 @@ beforeEach(() => { redirectHttpFromPort: config.port + 1, }, } as HttpConfig; + configWithSSL$ = of(configWithSSL); server = new HttpServer(loggingService, 'tests', of(config.shutdownTimeout)); }); @@ -109,7 +107,7 @@ afterEach(async () => { test('log listening address after started', async () => { expect(server.isListening()).toBe(false); - await server.setup(config); + await server.setup({ config$ }); await server.start(); expect(server.isListening()).toBe(true); @@ -125,7 +123,7 @@ test('log listening address after started', async () => { test('log listening address after started when configured with BasePath and rewriteBasePath = false', async () => { expect(server.isListening()).toBe(false); - await server.setup({ ...config, basePath: '/bar', rewriteBasePath: false }); + await server.setup({ config$: of({ ...config, basePath: '/bar', rewriteBasePath: false }) }); await server.start(); expect(server.isListening()).toBe(true); @@ -141,7 +139,7 @@ test('log listening address after started when configured with BasePath and rewr test('log listening address after started when configured with BasePath and rewriteBasePath = true', async () => { expect(server.isListening()).toBe(false); - await server.setup({ ...config, basePath: '/bar', rewriteBasePath: true }); + await server.setup({ config$: of({ ...config, basePath: '/bar', rewriteBasePath: true }) }); await server.start(); expect(server.isListening()).toBe(true); @@ -157,7 +155,7 @@ test('log listening address after started when configured with BasePath and rewr test('does not allow router registration after server is listening', async () => { expect(server.isListening()).toBe(false); - const { registerRouter } = await server.setup(config); + const { registerRouter } = await server.setup({ config$ }); const router1 = new Router('/foo', logger, enhanceWithContext, routerOptions); expect(() => registerRouter(router1)).not.toThrowError(); @@ -175,7 +173,7 @@ test('does not allow router registration after server is listening', async () => test('allows router registration after server is listening via `registerRouterAfterListening`', async () => { expect(server.isListening()).toBe(false); - const { registerRouterAfterListening } = await server.setup(config); + const { registerRouterAfterListening } = await server.setup({ config$ }); const router1 = new Router('/foo', logger, enhanceWithContext, routerOptions); expect(() => registerRouterAfterListening(router1)).not.toThrowError(); @@ -205,7 +203,7 @@ test('valid params', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -235,7 +233,7 @@ test('invalid params', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -270,7 +268,7 @@ test('valid query', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -300,7 +298,7 @@ test('invalid query', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -335,7 +333,7 @@ test('valid body', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -373,7 +371,7 @@ test('valid body with validate function', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -416,7 +414,7 @@ test('not inline validation - specifying params', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -459,7 +457,7 @@ test('not inline validation - specifying validation handler', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -509,7 +507,7 @@ test('not inline handler - KibanaRequest', async () => { handler ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -558,7 +556,7 @@ test('not inline handler - RequestHandler', async () => { handler ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -592,7 +590,7 @@ test('invalid body', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -627,7 +625,7 @@ test('handles putting', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -658,7 +656,7 @@ test('handles deleting', async () => { } ); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); registerRouter(router); await server.start(); @@ -688,7 +686,9 @@ describe('with `basepath: /bar` and `rewriteBasePath: false`', () => { res.ok({ body: 'value:/foo' }) ); - const { registerRouter, server: innerServer } = await server.setup(configWithBasePath); + const { registerRouter, server: innerServer } = await server.setup({ + config$: of(configWithBasePath), + }); registerRouter(router); await server.start(); @@ -743,7 +743,9 @@ describe('with `basepath: /bar` and `rewriteBasePath: true`', () => { res.ok({ body: 'value:/foo' }) ); - const { registerRouter, server: innerServer } = await server.setup(configWithBasePath); + const { registerRouter, server: innerServer } = await server.setup({ + config$: of(configWithBasePath), + }); registerRouter(router); await server.start(); @@ -790,7 +792,7 @@ test('with defined `redirectHttpFromPort`', async () => { const router = new Router('/', logger, enhanceWithContext, routerOptions); router.get({ path: '/', validate: false }, (context, req, res) => res.ok({ body: 'value:/' })); - const { registerRouter } = await server.setup(configWithSSL); + const { registerRouter } = await server.setup({ config$: configWithSSL$ }); registerRouter(router); await server.start(); @@ -801,7 +803,7 @@ test('returns server and connection options on start', async () => { ...config, port: 12345, }; - const { server: innerServer } = await server.setup(configWithPort); + const { server: innerServer } = await server.setup({ config$: of(configWithPort) }); expect(innerServer).toBeDefined(); expect(innerServer).toBe((server as any).server); @@ -815,7 +817,7 @@ test('throws an error if starts without set up', async () => { test('allows attaching metadata to attach meta-data tag strings to a route', async () => { const tags = ['my:tag']; - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.get({ path: '/with-tags', validate: false, options: { tags } }, (context, req, res) => @@ -834,7 +836,7 @@ test('allows attaching metadata to attach meta-data tag strings to a route', asy test('allows declaring route access to flag a route as public or internal', async () => { const access = 'internal'; - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.get({ path: '/with-access', validate: false, options: { access } }, (context, req, res) => @@ -852,7 +854,7 @@ test('allows declaring route access to flag a route as public or internal', asyn }); test(`sets access flag to 'internal' if not defined`, async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.get({ path: '/internal/foo', validate: false }, (context, req, res) => @@ -883,7 +885,7 @@ test(`sets access flag to 'internal' if not defined`, async () => { }); test('exposes route details of incoming request to a route handler', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.get({ path: '/', validate: false }, (context, req, res) => res.ok({ body: req.route })); @@ -907,7 +909,9 @@ test('exposes route details of incoming request to a route handler', async () => describe('conditional compression', () => { async function setupServer(innerConfig: HttpConfig) { - const { registerRouter, server: innerServer } = await server.setup(innerConfig); + const { registerRouter, server: innerServer } = await server.setup({ + config$: of(innerConfig), + }); const router = new Router('', logger, enhanceWithContext, routerOptions); // we need the large body here so that compression would normally be used const largeRequest = { @@ -1012,8 +1016,10 @@ describe('conditional compression', () => { describe('response headers', () => { test('allows to configure "keep-alive" header', async () => { const { registerRouter, server: innerServer } = await server.setup({ - ...config, - keepaliveTimeout: 100_000, + config$: of({ + ...config, + keepaliveTimeout: 100_000, + }), }); const router = new Router('', logger, enhanceWithContext, routerOptions); @@ -1031,7 +1037,7 @@ describe('response headers', () => { }); test('default headers', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.get({ path: '/', validate: false }, (context, req, res) => res.ok({ body: req.route })); @@ -1053,7 +1059,7 @@ describe('response headers', () => { }); test('exposes route details of incoming request to a route handler (POST + payload options)', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.post( @@ -1093,7 +1099,7 @@ test('exposes route details of incoming request to a route handler (POST + paylo describe('body options', () => { test('should reject the request because the Content-Type in the request is not valid', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.post( @@ -1115,7 +1121,7 @@ describe('body options', () => { }); test('should reject the request because the payload is too large', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.post( @@ -1137,7 +1143,7 @@ describe('body options', () => { }); test('should not parse the content in the request', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.post( @@ -1166,7 +1172,7 @@ describe('body options', () => { describe('timeout options', () => { describe('payload timeout', () => { test('POST routes set the payload timeout', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.post( @@ -1200,7 +1206,7 @@ describe('timeout options', () => { }); test('DELETE routes set the payload timeout', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.delete( @@ -1233,7 +1239,7 @@ describe('timeout options', () => { }); test('PUT routes set the payload timeout and automatically adjusts the idle socket timeout', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.put( @@ -1266,7 +1272,7 @@ describe('timeout options', () => { }); test('PATCH routes set the payload timeout and automatically adjusts the idle socket timeout', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.patch( @@ -1302,8 +1308,10 @@ describe('timeout options', () => { describe('idleSocket timeout', () => { test('uses server socket timeout when not specified in the route', async () => { const { registerRouter, server: innerServer } = await server.setup({ - ...config, - socketTimeout: 11000, + config$: of({ + ...config, + socketTimeout: 11000, + }), }); const router = new Router('', logger, enhanceWithContext, routerOptions); @@ -1335,8 +1343,10 @@ describe('timeout options', () => { test('sets the socket timeout when specified in the route', async () => { const { registerRouter, server: innerServer } = await server.setup({ - ...config, - socketTimeout: 11000, + config$: of({ + ...config, + socketTimeout: 11000, + }), }); const router = new Router('', logger, enhanceWithContext, routerOptions); @@ -1368,7 +1378,7 @@ describe('timeout options', () => { }); test('idleSocket timeout can be smaller than the payload timeout', async () => { - const { registerRouter } = await server.setup(config); + const { registerRouter } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.post( @@ -1395,7 +1405,7 @@ describe('timeout options', () => { }); test('should return a stream in the body', async () => { - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$ }); const router = new Router('', logger, enhanceWithContext, routerOptions); router.put( @@ -1421,8 +1431,10 @@ test('should return a stream in the body', async () => { test('closes sockets on timeout', async () => { const { registerRouter, server: innerServer } = await server.setup({ - ...config, - socketTimeout: 1000, + config$: of({ + ...config, + socketTimeout: 1000, + }), }); const router = new Router('', logger, enhanceWithContext, routerOptions); @@ -1446,14 +1458,14 @@ test('closes sockets on timeout', async () => { describe('setup contract', () => { describe('#createSessionStorage', () => { test('creates session storage factory', async () => { - const { createCookieSessionStorageFactory } = await server.setup(config); + const { createCookieSessionStorageFactory } = await server.setup({ config$ }); const sessionStorageFactory = await createCookieSessionStorageFactory(cookieOptions); expect(sessionStorageFactory.asScoped).toBeDefined(); }); test('creates session storage factory only once', async () => { - const { createCookieSessionStorageFactory } = await server.setup(config); + const { createCookieSessionStorageFactory } = await server.setup({ config$ }); const create = async () => await createCookieSessionStorageFactory(cookieOptions); await create(); @@ -1461,7 +1473,7 @@ describe('setup contract', () => { }); test('does not throw if called after stop', async () => { - const { createCookieSessionStorageFactory } = await server.setup(config); + const { createCookieSessionStorageFactory } = await server.setup({ config$ }); await server.stop(); expect(() => { createCookieSessionStorageFactory(cookieOptions); @@ -1471,7 +1483,7 @@ describe('setup contract', () => { describe('#getServerInfo', () => { test('returns correct information', async () => { - let { getServerInfo } = await server.setup(config); + let { getServerInfo } = await server.setup({ config$ }); expect(getServerInfo()).toEqual({ hostname: '127.0.0.1', @@ -1481,10 +1493,12 @@ describe('setup contract', () => { }); ({ getServerInfo } = await server.setup({ - ...config, - port: 12345, - name: 'custom-name', - host: 'localhost', + config$: of({ + ...config, + port: 12345, + name: 'custom-name', + host: 'localhost', + }), })); expect(getServerInfo()).toEqual({ @@ -1496,7 +1510,7 @@ describe('setup contract', () => { }); test('returns correct protocol when ssl is enabled', async () => { - const { getServerInfo } = await server.setup(configWithSSL); + const { getServerInfo } = await server.setup({ config$: configWithSSL$ }); expect(getServerInfo().protocol).toEqual('https'); }); @@ -1517,7 +1531,7 @@ describe('setup contract', () => { }); test('registers routes with expected options', async () => { - const { registerStaticDir } = await server.setup(config); + const { registerStaticDir } = await server.setup({ config$ }); expect(createServer).toHaveBeenCalledTimes(1); const [{ value: myServer }] = (createServer as jest.Mock).mock.results; jest.spyOn(myServer, 'route'); @@ -1540,7 +1554,7 @@ describe('setup contract', () => { }); test('does not throw if called after stop', async () => { - const { registerStaticDir } = await server.setup(config); + const { registerStaticDir } = await server.setup({ config$ }); await server.stop(); expect(() => { registerStaticDir('/path1/{path*}', '/path/to/resource'); @@ -1548,7 +1562,7 @@ describe('setup contract', () => { }); test('returns correct headers for static assets', async () => { - const { registerStaticDir, server: innerServer } = await server.setup(config); + const { registerStaticDir, server: innerServer } = await server.setup({ config$ }); registerStaticDir('/static/{path*}', assetFolder); @@ -1562,7 +1576,7 @@ describe('setup contract', () => { }); test('returns compressed version if present', async () => { - const { registerStaticDir, server: innerServer } = await server.setup(config); + const { registerStaticDir, server: innerServer } = await server.setup({ config$ }); registerStaticDir('/static/{path*}', assetFolder); @@ -1578,7 +1592,7 @@ describe('setup contract', () => { }); test('returns uncompressed version if compressed asset is not available', async () => { - const { registerStaticDir, server: innerServer } = await server.setup(config); + const { registerStaticDir, server: innerServer } = await server.setup({ config$ }); registerStaticDir('/static/{path*}', assetFolder); @@ -1594,7 +1608,7 @@ describe('setup contract', () => { }); test('returns a 304 if etag value matches', async () => { - const { registerStaticDir, server: innerServer } = await server.setup(config); + const { registerStaticDir, server: innerServer } = await server.setup({ config$ }); registerStaticDir('/static/{path*}', assetFolder); @@ -1613,7 +1627,7 @@ describe('setup contract', () => { }); test('serves content if etag values does not match', async () => { - const { registerStaticDir, server: innerServer } = await server.setup(config); + const { registerStaticDir, server: innerServer } = await server.setup({ config$ }); registerStaticDir('/static/{path*}', assetFolder); @@ -1628,7 +1642,7 @@ describe('setup contract', () => { test('dynamically updates depending on the content of the file', async () => { const tempFile = join(tempDir, 'some_file.json'); - const { registerStaticDir, server: innerServer } = await server.setup(config); + const { registerStaticDir, server: innerServer } = await server.setup({ config$ }); registerStaticDir('/static/{path*}', tempDir); await server.start(); @@ -1655,7 +1669,7 @@ describe('setup contract', () => { describe('#registerOnPreRouting', () => { test('does not throw if called after stop', async () => { - const { registerOnPreRouting } = await server.setup(config); + const { registerOnPreRouting } = await server.setup({ config$ }); await server.stop(); expect(() => { registerOnPreRouting((req, res) => res.unauthorized()); @@ -1665,7 +1679,7 @@ describe('setup contract', () => { describe('#registerOnPreAuth', () => { test('does not throw if called after stop', async () => { - const { registerOnPreAuth } = await server.setup(config); + const { registerOnPreAuth } = await server.setup({ config$ }); await server.stop(); expect(() => { registerOnPreAuth((req, res) => res.unauthorized()); @@ -1675,7 +1689,7 @@ describe('setup contract', () => { describe('#registerOnPostAuth', () => { test('does not throw if called after stop', async () => { - const { registerOnPostAuth } = await server.setup(config); + const { registerOnPostAuth } = await server.setup({ config$ }); await server.stop(); expect(() => { registerOnPostAuth((req, res) => res.unauthorized()); @@ -1685,7 +1699,7 @@ describe('setup contract', () => { describe('#registerOnPreResponse', () => { test('does not throw if called after stop', async () => { - const { registerOnPreResponse } = await server.setup(config); + const { registerOnPreResponse } = await server.setup({ config$ }); await server.stop(); expect(() => { registerOnPreResponse((req, res, t) => t.next()); @@ -1695,7 +1709,7 @@ describe('setup contract', () => { describe('#registerAuth', () => { test('does not throw if called after stop', async () => { - const { registerAuth } = await server.setup(config); + const { registerAuth } = await server.setup({ config$ }); await server.stop(); expect(() => { registerAuth((req, res) => res.unauthorized()); @@ -1703,3 +1717,52 @@ describe('setup contract', () => { }); }); }); + +describe('configuration change', () => { + it('logs a warning in case of incompatible config change', async () => { + const configSubject = new BehaviorSubject(configWithSSL); + + await server.setup({ config$: configSubject }); + await server.start(); + + const nextConfig = { + ...configWithSSL, + ssl: { + ...configWithSSL.ssl, + getSecureOptions: () => 0, + enabled: false, + }, + } as HttpConfig; + + configSubject.next(nextConfig); + + expect(loggingService.get().warn).toHaveBeenCalledWith( + 'Incompatible TLS config change detected - TLS cannot be toggled without a full server reboot.' + ); + }); + + it('calls setTlsConfig and logs an info message when config changes', async () => { + const configSubject = new BehaviorSubject(configWithSSL); + + const { server: innerServer } = await server.setup({ config$: configSubject }); + await server.start(); + + const nextConfig = { + ...configWithSSL, + ssl: { + ...configWithSSL.ssl, + isEqualTo: () => false, + getSecureOptions: () => 0, + }, + } as HttpConfig; + + configSubject.next(nextConfig); + + expect(setTlsConfigMock).toHaveBeenCalledTimes(1); + expect(setTlsConfigMock).toHaveBeenCalledWith(innerServer, nextConfig.ssl); + + expect(loggingService.get().info).toHaveBeenCalledWith( + 'TLS configuration change detected - reloading TLS configuration.' + ); + }); +}); diff --git a/packages/core/http/core-http-server-internal/src/http_server.ts b/packages/core/http/core-http-server-internal/src/http_server.ts index fb776f5d29eb6..1361c64bb67ce 100644 --- a/packages/core/http/core-http-server-internal/src/http_server.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.ts @@ -14,12 +14,13 @@ import { createServer, getListenerOptions, getServerOptions, + setTlsConfig, getRequestId, } from '@kbn/server-http-tools'; import type { Duration } from 'moment'; -import { firstValueFrom, Observable } from 'rxjs'; -import { take } from 'rxjs/operators'; +import { firstValueFrom, Observable, Subscription } from 'rxjs'; +import { take, pairwise } from 'rxjs/operators'; import apm from 'elastic-apm-node'; // @ts-expect-error no type definition import Brok from 'brok'; @@ -160,9 +161,15 @@ export type LifecycleRegistrar = Pick< | 'registerOnPreResponse' >; +export interface HttpServerSetupOptions { + config$: Observable; + executionContext?: InternalExecutionContextSetup; +} + export class HttpServer { private server?: Server; private config?: HttpConfig; + private subscriptions: Subscription[] = []; private registeredRouters = new Set(); private authRegistered = false; private cookieSessionStorageCreated = false; @@ -209,13 +216,16 @@ export class HttpServer { } } - public async setup( - config: HttpConfig, - executionContext?: InternalExecutionContextSetup - ): Promise { + public async setup({ + config$, + executionContext, + }: HttpServerSetupOptions): Promise { + const config = await firstValueFrom(config$); + this.config = config; + const serverOptions = getServerOptions(config); const listenerOptions = getListenerOptions(config); - this.config = config; + this.server = createServer(serverOptions, listenerOptions); await this.server.register([HapiStaticFiles]); if (config.compression.brotli.enabled) { @@ -227,6 +237,29 @@ export class HttpServer { }); } + // only hot-reloading TLS config - don't need to subscribe if TLS is initially disabled, + // given we can't hot-switch from/to enabled/disabled. + if (config.ssl.enabled) { + const configSubscription = config$ + .pipe(pairwise()) + .subscribe(([{ ssl: prevSslConfig }, { ssl: newSslConfig }]) => { + if (prevSslConfig.enabled !== newSslConfig.enabled) { + this.log.warn( + 'Incompatible TLS config change detected - TLS cannot be toggled without a full server reboot.' + ); + return; + } + + const sameConfig = newSslConfig.isEqualTo(prevSslConfig); + + if (!sameConfig) { + this.log.info('TLS configuration change detected - reloading TLS configuration.'); + setTlsConfig(this.server!, newSslConfig); + } + }); + this.subscriptions.push(configSubscription); + } + // It's important to have setupRequestStateAssignment call the very first, otherwise context passing will be broken. // That's the only reason why context initialization exists in this method. this.setupRequestStateAssignment(config, executionContext); diff --git a/packages/core/http/core-http-server-internal/src/http_service.ts b/packages/core/http/core-http-server-internal/src/http_service.ts index 99d286b26f83f..b09e7e84fef21 100644 --- a/packages/core/http/core-http-server-internal/src/http_service.ts +++ b/packages/core/http/core-http-server-internal/src/http_service.ts @@ -71,7 +71,7 @@ export class HttpService this.env = env; this.log = logger.get('http'); this.config$ = combineLatest([ - configService.atPath(httpConfig.path), + configService.atPath(httpConfig.path, { ignoreUnchanged: false }), configService.atPath(cspConfig.path), configService.atPath(externalUrlConfig.path), ]).pipe(map(([http, csp, externalUrl]) => new HttpConfig(http, csp, externalUrl))); @@ -85,7 +85,9 @@ export class HttpService this.log.debug('setting up preboot server'); const config = await firstValueFrom(this.config$); - const prebootSetup = await this.prebootServer.setup(config); + const prebootSetup = await this.prebootServer.setup({ + config$: this.config$, + }); prebootSetup.server.route({ path: '/{p*}', method: '*', @@ -157,10 +159,10 @@ export class HttpService const config = await firstValueFrom(this.config$); - const { registerRouter, ...serverContract } = await this.httpServer.setup( - config, - deps.executionContext - ); + const { registerRouter, ...serverContract } = await this.httpServer.setup({ + config$: this.config$, + executionContext: deps.executionContext, + }); registerCoreHandlers(serverContract, config, this.env, this.log); diff --git a/packages/core/logging/core-logging-server-internal/src/__snapshots__/logging_system.test.ts.snap b/packages/core/logging/core-logging-server-internal/src/__snapshots__/logging_system.test.ts.snap index 01ffd79b0b87f..d283fc1400c78 100644 --- a/packages/core/logging/core-logging-server-internal/src/__snapshots__/logging_system.test.ts.snap +++ b/packages/core/logging/core-logging-server-internal/src/__snapshots__/logging_system.test.ts.snap @@ -25,6 +25,7 @@ Object { "message": "buffered trace message", "process": Object { "pid": Any, + "uptime": 10, }, } `; @@ -42,6 +43,7 @@ Object { "message": "buffered info message", "process": Object { "pid": Any, + "uptime": 10, }, "some": "value", } @@ -60,6 +62,7 @@ Object { "message": "buffered fatal message", "process": Object { "pid": Any, + "uptime": 10, }, } `; @@ -77,6 +80,7 @@ Object { "message": "buffered info message", "process": Object { "pid": Any, + "uptime": 10, }, "some": "value", } @@ -95,6 +99,7 @@ Object { "message": "some new info message", "process": Object { "pid": Any, + "uptime": 10, }, } `; diff --git a/packages/core/logging/core-logging-server-internal/src/layouts/__snapshots__/json_layout.test.ts.snap b/packages/core/logging/core-logging-server-internal/src/layouts/__snapshots__/json_layout.test.ts.snap index 0809dbffce670..da1c1b4c4f8b4 100644 --- a/packages/core/logging/core-logging-server-internal/src/layouts/__snapshots__/json_layout.test.ts.snap +++ b/packages/core/logging/core-logging-server-internal/src/layouts/__snapshots__/json_layout.test.ts.snap @@ -15,6 +15,7 @@ Object { "message": "message-1", "process": Object { "pid": 5355, + "uptime": 10, }, } `; @@ -29,6 +30,7 @@ Object { "message": "message-2", "process": Object { "pid": 5355, + "uptime": 10, }, } `; @@ -43,6 +45,7 @@ Object { "message": "message-3", "process": Object { "pid": 5355, + "uptime": 10, }, } `; @@ -57,6 +60,7 @@ Object { "message": "message-4", "process": Object { "pid": 5355, + "uptime": 10, }, } `; @@ -71,6 +75,7 @@ Object { "message": "message-5", "process": Object { "pid": 5355, + "uptime": 10, }, } `; @@ -85,6 +90,7 @@ Object { "message": "message-6", "process": Object { "pid": 5355, + "uptime": 10, }, } `; @@ -99,6 +105,7 @@ Object { "message": "message-6", "process": Object { "pid": 5355, + "uptime": 10, }, "span": Object { "id": "spanId-1", diff --git a/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.test.ts b/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.test.ts index 60b415b1b2a2b..8d16ce8a576f2 100644 --- a/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.test.ts +++ b/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.test.ts @@ -10,6 +10,8 @@ import { EcsVersion } from '@kbn/ecs'; import { LogLevel, LogRecord } from '@kbn/logging'; import { JsonLayout } from './json_layout'; +jest.spyOn(process, 'uptime').mockReturnValue(10); + const timestamp = new Date(Date.UTC(2012, 1, 1, 14, 30, 22, 11)); const records: LogRecord[] = [ { @@ -121,6 +123,7 @@ test('`format()` correctly formats record with meta-data', () => { }, process: { pid: 5355, + uptime: 10, }, }); }); @@ -169,6 +172,7 @@ test('`format()` correctly formats error record with meta-data', () => { }, process: { pid: 5355, + uptime: 10, }, }); }); @@ -202,6 +206,7 @@ test('format() meta can merge override logs', () => { }, process: { pid: 3, + uptime: 10, }, }); }); @@ -232,6 +237,7 @@ test('format() meta can not override message', () => { }, process: { pid: 3, + uptime: 10, }, }); }); @@ -262,6 +268,7 @@ test('format() meta can not override ecs version', () => { }, process: { pid: 3, + uptime: 10, }, }); }); @@ -295,6 +302,7 @@ test('format() meta can not override logger or level', () => { }, process: { pid: 3, + uptime: 10, }, }); }); @@ -325,6 +333,7 @@ test('format() meta can not override timestamp', () => { }, process: { pid: 3, + uptime: 10, }, }); }); @@ -359,6 +368,7 @@ test('format() meta can not override tracing properties', () => { }, process: { pid: 3, + uptime: 10, }, span: { id: 'span_override' }, trace: { id: 'trace_override' }, @@ -404,6 +414,7 @@ test('format() meta.toJSON() is used if own property', () => { }, process: { pid: 3, + uptime: 10, }, server: { address: 'localhost', @@ -448,6 +459,7 @@ test('format() meta.toJSON() is used if present on prototype', () => { }, process: { pid: 3, + uptime: 10, }, foo: 'bar', }); diff --git a/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.ts b/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.ts index 43b906fa8407c..59921b0f4b7f5 100644 --- a/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.ts +++ b/packages/core/logging/core-logging-server-internal/src/layouts/json_layout.ts @@ -53,6 +53,7 @@ export class JsonLayout implements Layout { }, process: { pid: record.pid, + uptime: process.uptime(), }, span: spanId ? { id: spanId } : undefined, trace: traceId ? { id: traceId } : undefined, diff --git a/packages/core/logging/core-logging-server-internal/src/logging_system.test.ts b/packages/core/logging/core-logging-server-internal/src/logging_system.test.ts index 81eb539a618fc..76fe93d1e614a 100644 --- a/packages/core/logging/core-logging-server-internal/src/logging_system.test.ts +++ b/packages/core/logging/core-logging-server-internal/src/logging_system.test.ts @@ -23,6 +23,7 @@ let system: LoggingSystem; beforeEach(() => { mockConsoleLog = jest.spyOn(global.console, 'log').mockReturnValue(undefined); jest.spyOn(global, 'Date').mockImplementation(() => timestamp); + jest.spyOn(process, 'uptime').mockReturnValue(10); system = new LoggingSystem(); }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.test.ts new file mode 100644 index 0000000000000..3faeee08048ef --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.test.ts @@ -0,0 +1,1048 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-shadow */ + +import { + pointInTimeFinderMock, + mockGetBulkOperationError, + mockGetCurrentTime, + mockPreflightCheckForCreate, + mockGetSearchDsl, +} from '../repository.test.mock'; + +import type { Payload } from '@hapi/boom'; + +import type { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; +import { + type SavedObjectsRawDoc, + type SavedObjectUnsanitizedDoc, + type SavedObjectReference, +} from '@kbn/core-saved-objects-server'; +import { ALL_NAMESPACES_STRING } from '@kbn/core-saved-objects-utils-server'; +import { SavedObjectsRepository } from '../repository'; +import { loggerMock } from '@kbn/logging-mocks'; +import { SavedObjectsSerializer } from '@kbn/core-saved-objects-base-server-internal'; +import { kibanaMigratorMock } from '../../mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; + +import { + CUSTOM_INDEX_TYPE, + NAMESPACE_AGNOSTIC_TYPE, + MULTI_NAMESPACE_TYPE, + MULTI_NAMESPACE_ISOLATED_TYPE, + HIDDEN_TYPE, + mockVersionProps, + mockTimestampFields, + mockTimestamp, + mappings, + mockVersion, + createRegistry, + createDocumentMigrator, + createSpySerializer, + bulkCreateSuccess, + getMockBulkCreateResponse, + expectErrorResult, + expectErrorInvalidType, + expectErrorConflict, + expectError, + createBadRequestErrorPayload, + expectCreateResult, + mockTimestampFieldsWithCreated, +} from '../../test_helpers/repository.test.common'; + +// BEWARE: The SavedObjectClient depends on the implementation details of the SavedObjectsRepository +// so any breaking changes to this repository are considered breaking changes to the SavedObjectsClient. + +interface ExpectedErrorResult { + type: string; + id: string; + error: Record; +} + +describe('SavedObjectsRepository', () => { + let client: ReturnType; + let repository: SavedObjectsRepository; + let migrator: ReturnType; + let logger: ReturnType; + let serializer: jest.Mocked; + + const registry = createRegistry(); + const documentMigrator = createDocumentMigrator(registry); + + const expectSuccess = ({ type, id }: { type: string; id: string }) => { + // @ts-expect-error TS is not aware of the extension + return expect.toBeDocumentWithoutError(type, id); + }; + + const expectMigrationArgs = (args: unknown, contains = true, n = 1) => { + const obj = contains ? expect.objectContaining(args) : expect.not.objectContaining(args); + expect(migrator.migrateDocument).toHaveBeenNthCalledWith( + n, + obj, + expect.objectContaining({ + allowDowngrade: expect.any(Boolean), + }) + ); + }; + + beforeEach(() => { + pointInTimeFinderMock.mockClear(); + client = elasticsearchClientMock.createElasticsearchClient(); + migrator = kibanaMigratorMock.create(); + documentMigrator.prepareMigrations(); + migrator.migrateDocument = jest.fn().mockImplementation(documentMigrator.migrate); + migrator.runMigrations = jest.fn().mockResolvedValue([{ status: 'skipped' }]); + logger = loggerMock.create(); + + // create a mock serializer "shim" so we can track function calls, but use the real serializer's implementation + serializer = createSpySerializer(registry); + + const allTypes = registry.getAllTypes().map((type) => type.name); + const allowedTypes = [...new Set(allTypes.filter((type) => !registry.isHidden(type)))]; + + // @ts-expect-error must use the private constructor to use the mocked serializer + repository = new SavedObjectsRepository({ + index: '.kibana-test', + mappings, + client, + migrator, + typeRegistry: registry, + serializer, + allowedTypes, + logger, + }); + + mockGetCurrentTime.mockReturnValue(mockTimestamp); + mockGetSearchDsl.mockClear(); + }); + + // Setup migration mock for creating an object + const mockMigrationVersion = { foo: '2.3.4' }; + const mockMigrateDocument = (doc: SavedObjectUnsanitizedDoc) => ({ + ...doc, + attributes: { + ...doc.attributes, + ...(doc.attributes?.title && { title: `${doc.attributes.title}!!` }), + }, + migrationVersion: mockMigrationVersion, + managed: doc.managed ?? false, + references: [{ name: 'search_0', type: 'search', id: '123' }], + }); + + describe('#bulkCreate', () => { + beforeEach(() => { + mockPreflightCheckForCreate.mockReset(); + mockPreflightCheckForCreate.mockImplementation(({ objects }) => { + return Promise.resolve(objects.map(({ type, id }) => ({ type, id }))); // respond with no errors by default + }); + }); + + const obj1 = { + type: 'config', + id: '6.0.0-alpha1', + attributes: { title: 'Test One' }, + references: [{ name: 'ref_0', type: 'test', id: '1' }], + managed: false, + }; + const obj2 = { + type: 'index-pattern', + id: 'logstash-*', + attributes: { title: 'Test Two' }, + references: [{ name: 'ref_0', type: 'test', id: '2' }], + managed: false, + }; + const namespace = 'foo-namespace'; + + // bulk create calls have two objects for each source -- the action, and the source + const expectClientCallArgsAction = ( + objects: Array<{ type: string; id?: string; if_primary_term?: string; if_seq_no?: string }>, + { + method, + _index = expect.any(String), + getId = () => expect.any(String), + }: { method: string; _index?: string; getId?: (type: string, id?: string) => string } + ) => { + const body = []; + for (const { type, id, if_primary_term: ifPrimaryTerm, if_seq_no: ifSeqNo } of objects) { + body.push({ + [method]: { + _index, + _id: getId(type, id), + ...(ifPrimaryTerm && ifSeqNo + ? { if_primary_term: expect.any(Number), if_seq_no: expect.any(Number) } + : {}), + }, + }); + body.push(expect.any(Object)); + } + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }; + + const expectObjArgs = ( + { + type, + attributes, + references, + }: { type: string; attributes: unknown; references?: SavedObjectReference[] }, + overrides: Record = {} + ) => [ + expect.any(Object), + expect.objectContaining({ + [type]: attributes, + references, + type, + ...overrides, + ...mockTimestampFields, + }), + ]; + describe('client calls', () => { + it(`should use the ES bulk action by default`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2]); + expect(client.bulk).toHaveBeenCalledTimes(1); + }); + + it(`should use the preflightCheckForCreate action before bulk action for any types that are multi-namespace, when id is defined`, async () => { + const objects = [obj1, { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }]; + await bulkCreateSuccess(client, repository, objects); + expect(client.bulk).toHaveBeenCalledTimes(1); + expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); + expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( + expect.objectContaining({ + objects: [ + { + type: MULTI_NAMESPACE_ISOLATED_TYPE, + id: obj2.id, + overwrite: false, + namespaces: ['default'], + }, + ], + }) + ); + }); + + it(`should use the ES create method if ID is undefined and overwrite=true`, async () => { + const objects = [obj1, obj2].map((obj) => ({ ...obj, id: undefined })); + await bulkCreateSuccess(client, repository, objects, { overwrite: true }); + expectClientCallArgsAction(objects, { method: 'create' }); + }); + + it(`should use the ES create method if ID is undefined and overwrite=false`, async () => { + const objects = [obj1, obj2].map((obj) => ({ ...obj, id: undefined })); + await bulkCreateSuccess(client, repository, objects); + expectClientCallArgsAction(objects, { method: 'create' }); + }); + + it(`should use the ES index method if ID is defined and overwrite=true`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { overwrite: true }); + expectClientCallArgsAction([obj1, obj2], { method: 'index' }); + }); + + it(`should use the ES index method with version if ID and version are defined and overwrite=true`, async () => { + await bulkCreateSuccess( + client, + repository, + [ + { + ...obj1, + version: mockVersion, + }, + obj2, + ], + { overwrite: true } + ); + + const obj1WithSeq = { + ...obj1, + managed: obj1.managed, + if_seq_no: mockVersionProps._seq_no, + if_primary_term: mockVersionProps._primary_term, + }; + + expectClientCallArgsAction([obj1WithSeq, obj2], { method: 'index' }); + }); + + it(`should use the ES create method if ID is defined and overwrite=false`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2]); + expectClientCallArgsAction([obj1, obj2], { method: 'create' }); + }); + + it(`should use the ES index method if ID is defined, overwrite=true and managed=true in a document`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { + overwrite: true, + managed: true, + }); + expectClientCallArgsAction([obj1, obj2], { method: 'index' }); + }); + + it(`should use the ES create method if ID is defined, overwrite=false and managed=true in a document`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { managed: true }); + expectClientCallArgsAction([obj1, obj2], { method: 'create' }); + }); + + it(`formats the ES request`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2]); + const body = [...expectObjArgs(obj1), ...expectObjArgs(obj2)]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + // this test only ensures that the client accepts the managed field in a document + it(`formats the ES request with managed=true in a document`, async () => { + const obj1WithManagedTrue = { ...obj1, managed: true }; + const obj2WithManagedTrue = { ...obj2, managed: true }; + await bulkCreateSuccess(client, repository, [obj1WithManagedTrue, obj2WithManagedTrue]); + const body = [...expectObjArgs(obj1WithManagedTrue), ...expectObjArgs(obj2WithManagedTrue)]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + describe('originId', () => { + it(`returns error if originId is set for non-multi-namespace type`, async () => { + const result = await repository.bulkCreate([ + { ...obj1, originId: 'some-originId' }, + { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE, originId: 'some-originId' }, + ]); + expect(result.saved_objects).toEqual([ + expect.objectContaining({ id: obj1.id, type: obj1.type, error: expect.anything() }), + expect.objectContaining({ + id: obj2.id, + type: NAMESPACE_AGNOSTIC_TYPE, + error: expect.anything(), + }), + ]); + expect(client.bulk).not.toHaveBeenCalled(); + }); + + it(`defaults to no originId`, async () => { + const objects = [ + { ...obj1, type: MULTI_NAMESPACE_TYPE }, + { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, + ]; + + await bulkCreateSuccess(client, repository, objects); + const expected = expect.not.objectContaining({ originId: expect.anything() }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + describe('with existing originId', () => { + beforeEach(() => { + mockPreflightCheckForCreate.mockImplementation(({ objects }) => { + const existingDocument = { + _source: { originId: 'existing-originId' }, + } as SavedObjectsRawDoc; + return Promise.resolve( + objects.map(({ type, id }) => ({ type, id, existingDocument })) + ); + }); + }); + + it(`accepts custom originId for multi-namespace type`, async () => { + // The preflight result has `existing-originId`, but that is discarded + const objects = [ + { ...obj1, type: MULTI_NAMESPACE_TYPE, originId: 'some-originId' }, + { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE, originId: 'some-originId' }, + ]; + await bulkCreateSuccess(client, repository, objects); + const expected = expect.objectContaining({ originId: 'some-originId' }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + it(`accepts undefined originId`, async () => { + // The preflight result has `existing-originId`, but that is discarded + const objects = [ + { ...obj1, type: MULTI_NAMESPACE_TYPE, originId: undefined }, + { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE, originId: undefined }, + ]; + await bulkCreateSuccess(client, repository, objects); + const expected = expect.not.objectContaining({ originId: expect.anything() }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + it(`preserves existing originId if originId option is not set`, async () => { + const objects = [ + { ...obj1, type: MULTI_NAMESPACE_TYPE }, + { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, + ]; + await bulkCreateSuccess(client, repository, objects); + const expected = expect.objectContaining({ originId: 'existing-originId' }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + }); + }); + + it(`adds namespace to request body for any types that are single-namespace`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); + const expected = expect.objectContaining({ namespace }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + // this only ensures we don't override any other options + it(`adds managed=false to request body if declared for any types that are single-namespace`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace, managed: false }); + const expected = expect.objectContaining({ namespace, managed: false }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + // this only ensures we don't override any other options + it(`adds managed=true to request body if declared for any types that are single-namespace`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace, managed: true }); + const expected = expect.objectContaining({ namespace, managed: true }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + it(`normalizes options.namespace from 'default' to undefined`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace: 'default' }); + const expected = expect.not.objectContaining({ namespace: 'default' }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + it(`doesn't add namespace to request body for any types that are not single-namespace`, async () => { + const objects = [ + { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }, + { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, + ]; + await bulkCreateSuccess(client, repository, objects, { namespace }); + const expected = expect.not.objectContaining({ namespace: expect.anything() }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + }); + + it(`adds namespaces to request body for any types that are multi-namespace`, async () => { + const test = async (namespace?: string) => { + const objects = [obj1, obj2].map((x) => ({ ...x, type: MULTI_NAMESPACE_ISOLATED_TYPE })); + const [o1, o2] = objects; + mockPreflightCheckForCreate.mockResolvedValueOnce([ + { type: o1.type, id: o1.id! }, // first object does not have an existing document to overwrite + { + type: o2.type, + id: o2.id!, + existingDocument: { _id: o2.id!, _source: { namespaces: ['*'], type: o2.type } }, // second object does have an existing document to overwrite + }, + ]); + await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); + const expected1 = expect.objectContaining({ namespaces: [namespace ?? 'default'] }); + const expected2 = expect.objectContaining({ namespaces: ['*'] }); + const body = [expect.any(Object), expected1, expect.any(Object), expected2]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + client.bulk.mockClear(); + mockPreflightCheckForCreate.mockReset(); + }; + await test(undefined); + await test(namespace); + }); + + it(`adds initialNamespaces instead of namespace`, async () => { + const test = async (namespace?: string) => { + const ns2 = 'bar-namespace'; + const ns3 = 'baz-namespace'; + const objects = [ + { ...obj1, type: 'dashboard', initialNamespaces: [ns2] }, + { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, initialNamespaces: [ns2] }, + { ...obj1, type: MULTI_NAMESPACE_TYPE, initialNamespaces: [ns2, ns3] }, + ]; + const [o1, o2, o3] = objects; + mockPreflightCheckForCreate.mockResolvedValueOnce([ + // first object does not get passed in to preflightCheckForCreate at all + { type: o2.type, id: o2.id! }, // second object does not have an existing document to overwrite + { + type: o3.type, + id: o3.id!, + existingDocument: { + _id: o3.id!, + _source: { type: o3.type, namespaces: [namespace ?? 'default', 'something-else'] }, // third object does have an existing document to overwrite + }, + }, + ]); + await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); + const body = [ + { index: expect.objectContaining({ _id: `${ns2}:dashboard:${o1.id}` }) }, + expect.objectContaining({ namespace: ns2 }), + { + index: expect.objectContaining({ + _id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${o2.id}`, + }), + }, + expect.objectContaining({ namespaces: [ns2] }), + { index: expect.objectContaining({ _id: `${MULTI_NAMESPACE_TYPE}:${o3.id}` }) }, + expect.objectContaining({ namespaces: [ns2, ns3] }), + ]; + expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( + expect.objectContaining({ + objects: [ + // assert that the initialNamespaces fields were passed into preflightCheckForCreate instead of the current namespace + { type: o2.type, id: o2.id, overwrite: true, namespaces: o2.initialNamespaces }, + { type: o3.type, id: o3.id, overwrite: true, namespaces: o3.initialNamespaces }, + ], + }) + ); + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + client.bulk.mockClear(); + mockPreflightCheckForCreate.mockReset(); + }; + await test(undefined); + await test(namespace); + }); + + it(`normalizes initialNamespaces from 'default' to undefined`, async () => { + const test = async (namespace?: string) => { + const objects = [{ ...obj1, type: 'dashboard', initialNamespaces: ['default'] }]; + await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); + const body = [ + { index: expect.objectContaining({ _id: `dashboard:${obj1.id}` }) }, + expect.not.objectContaining({ namespace: 'default' }), + ]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + client.bulk.mockClear(); + }; + await test(undefined); + await test(namespace); + }); + + it(`doesn't add namespaces to request body for any types that are not multi-namespace`, async () => { + const test = async (namespace?: string) => { + const objects = [obj1, { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE }]; + await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); + const expected = expect.not.objectContaining({ namespaces: expect.anything() }); + const body = [expect.any(Object), expected, expect.any(Object), expected]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + client.bulk.mockClear(); + }; + await test(undefined); + await test(namespace); + }); + + it(`defaults to a refresh setting of wait_for`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2]); + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ refresh: 'wait_for' }), + expect.anything() + ); + }); + + it(`should use default index`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2]); + expectClientCallArgsAction([obj1, obj2], { + method: 'create', + _index: '.kibana-test_8.0.0-testing', + }); + }); + + it(`should use custom index`, async () => { + await bulkCreateSuccess( + client, + repository, + [obj1, obj2].map((x) => ({ ...x, type: CUSTOM_INDEX_TYPE })) + ); + expectClientCallArgsAction([obj1, obj2], { + method: 'create', + _index: 'custom_8.0.0-testing', + }); + }); + + it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { + const getId = (type: string, id: string = '') => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) + await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); + expectClientCallArgsAction([obj1, obj2], { method: 'create', getId }); + }); + + it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { + const getId = (type: string, id: string = '') => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + await bulkCreateSuccess(client, repository, [obj1, obj2]); + expectClientCallArgsAction([obj1, obj2], { method: 'create', getId }); + }); + + it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { + const getId = (type: string, id: string = '') => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) + const objects = [ + { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }, + { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, + ]; + await bulkCreateSuccess(client, repository, objects, { namespace }); + expectClientCallArgsAction(objects, { method: 'create', getId }); + }); + }); + + describe('errors', () => { + afterEach(() => { + mockGetBulkOperationError.mockReset(); + }); + + const obj3 = { + type: 'dashboard', + id: 'three', + attributes: { title: 'Test Three' }, + references: [{ name: 'ref_0', type: 'test', id: '2' }], + }; + + const bulkCreateError = async ( + obj: SavedObjectsBulkCreateObject, + isBulkError: boolean | undefined, + expectedErrorResult: ExpectedErrorResult + ) => { + let response; + if (isBulkError) { + // mock the bulk error for only the second object + mockGetBulkOperationError.mockReturnValueOnce(undefined); + mockGetBulkOperationError.mockReturnValueOnce(expectedErrorResult.error as Payload); + response = getMockBulkCreateResponse([obj1, obj, obj2]); + } else { + response = getMockBulkCreateResponse([obj1, obj2]); + } + client.bulk.mockResponseOnce(response); + + const objects = [obj1, obj, obj2]; + const result = await repository.bulkCreate(objects); + expect(client.bulk).toHaveBeenCalled(); + const objCall = isBulkError ? expectObjArgs(obj) : []; + const body = [...expectObjArgs(obj1), ...objCall, ...expectObjArgs(obj2)]; + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body }), + expect.anything() + ); + expect(result).toEqual({ + saved_objects: [expectSuccess(obj1), expectedErrorResult, expectSuccess(obj2)], + }); + }; + + it(`throws when options.namespace is '*'`, async () => { + await expect( + repository.bulkCreate([obj3], { namespace: ALL_NAMESPACES_STRING }) + ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); + }); + + it(`returns error when initialNamespaces is used with a space-agnostic object`, async () => { + const obj = { ...obj3, type: NAMESPACE_AGNOSTIC_TYPE, initialNamespaces: [] }; + await bulkCreateError( + obj, + undefined, + expectErrorResult( + obj, + createBadRequestErrorPayload( + '"initialNamespaces" cannot be used on space-agnostic types' + ) + ) + ); + }); + + it(`returns error when initialNamespaces is empty`, async () => { + const obj = { ...obj3, type: MULTI_NAMESPACE_TYPE, initialNamespaces: [] }; + await bulkCreateError( + obj, + undefined, + expectErrorResult( + obj, + createBadRequestErrorPayload('"initialNamespaces" must be a non-empty array of strings') + ) + ); + }); + + it(`returns error when initialNamespaces is used with a space-isolated object and does not specify a single space`, async () => { + const doTest = async (objType: string, initialNamespaces: string[]) => { + const obj = { ...obj3, type: objType, initialNamespaces }; + await bulkCreateError( + obj, + undefined, + expectErrorResult( + obj, + createBadRequestErrorPayload( + '"initialNamespaces" can only specify a single space when used with space-isolated types' + ) + ) + ); + }; + await doTest('dashboard', ['spacex', 'spacey']); + await doTest('dashboard', ['*']); + await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['spacex', 'spacey']); + await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['*']); + }); + + it(`returns error when type is invalid`, async () => { + const obj = { ...obj3, type: 'unknownType' }; + await bulkCreateError(obj, undefined, expectErrorInvalidType(obj)); + }); + + it(`returns error when type is hidden`, async () => { + const obj = { ...obj3, type: HIDDEN_TYPE }; + await bulkCreateError(obj, undefined, expectErrorInvalidType(obj)); + }); + + it(`returns error when there is a conflict from preflightCheckForCreate`, async () => { + const objects = [ + // only the second, third, and fourth objects are passed to preflightCheckForCreate and result in errors + obj1, + { ...obj1, type: MULTI_NAMESPACE_TYPE }, + { ...obj2, type: MULTI_NAMESPACE_TYPE }, + { ...obj3, type: MULTI_NAMESPACE_TYPE }, + obj2, + ]; + const [o1, o2, o3, o4, o5] = objects; + mockPreflightCheckForCreate.mockResolvedValueOnce([ + // first and last objects do not get passed in to preflightCheckForCreate at all + { type: o2.type, id: o2.id!, error: { type: 'conflict' } }, + { + type: o3.type, + id: o3.id!, + error: { type: 'unresolvableConflict', metadata: { isNotOverwritable: true } }, + }, + { + type: o4.type, + id: o4.id!, + error: { type: 'aliasConflict', metadata: { spacesWithConflictingAliases: ['foo'] } }, + }, + ]); + const bulkResponse = getMockBulkCreateResponse([o1, o5]); + client.bulk.mockResponseOnce(bulkResponse); + + const options = { overwrite: true }; + const result = await repository.bulkCreate(objects, options); + expect(mockPreflightCheckForCreate).toHaveBeenCalled(); + expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( + expect.objectContaining({ + objects: [ + { type: o2.type, id: o2.id, overwrite: true, namespaces: ['default'] }, + { type: o3.type, id: o3.id, overwrite: true, namespaces: ['default'] }, + { type: o4.type, id: o4.id, overwrite: true, namespaces: ['default'] }, + ], + }) + ); + expect(client.bulk).toHaveBeenCalled(); + expect(client.bulk).toHaveBeenCalledWith( + expect.objectContaining({ body: [...expectObjArgs(o1), ...expectObjArgs(o5)] }), + expect.anything() + ); + expect(result).toEqual({ + saved_objects: [ + expectSuccess(o1), + expectErrorConflict(o2), + expectErrorConflict(o3, { metadata: { isNotOverwritable: true } }), + expectErrorConflict(o4, { metadata: { spacesWithConflictingAliases: ['foo'] } }), + expectSuccess(o5), + ], + }); + }); + + it(`returns bulk error`, async () => { + const expectedErrorResult = { + type: obj3.type, + id: obj3.id, + error: { error: 'Oh no, a bulk error!' }, + }; + await bulkCreateError(obj3, true, expectedErrorResult); + }); + + it(`returns errors for any bulk objects with invalid schemas`, async () => { + const response = getMockBulkCreateResponse([obj3]); + client.bulk.mockResponseOnce(response); + + const result = await repository.bulkCreate([ + obj3, + // @ts-expect-error - Title should be a string and is intentionally malformed for testing + { ...obj3, id: 'three-again', attributes: { title: 123 } }, + ]); + expect(client.bulk).toHaveBeenCalledTimes(1); // only called once for the valid object + expect(result.saved_objects).toEqual([ + expect.objectContaining(obj3), + expect.objectContaining({ + error: new Error( + '[attributes.title]: expected value of type [string] but got [number]: Bad Request' + ), + id: 'three-again', + type: 'dashboard', + }), + ]); + }); + }); + + describe('migration', () => { + it(`migrates the docs and serializes the migrated docs`, async () => { + migrator.migrateDocument.mockImplementation(mockMigrateDocument); + const modifiedObj1 = { ...obj1, coreMigrationVersion: '8.0.0' }; + await bulkCreateSuccess(client, repository, [modifiedObj1, obj2]); + const docs = [modifiedObj1, obj2].map((x) => ({ ...x, ...mockTimestampFieldsWithCreated })); + expectMigrationArgs(docs[0], true, 1); + expectMigrationArgs(docs[1], true, 2); + + const migratedDocs = docs.map((x) => migrator.migrateDocument(x)); + expect(serializer.savedObjectToRaw).toHaveBeenNthCalledWith(1, migratedDocs[0]); + expect(serializer.savedObjectToRaw).toHaveBeenNthCalledWith(2, migratedDocs[1]); + }); + + it(`adds namespace to body when providing namespace for single-namespace type`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); + expectMigrationArgs({ namespace }, true, 1); + expectMigrationArgs({ namespace }, true, 2); + }); + + it(`doesn't add namespace to body when providing no namespace for single-namespace type`, async () => { + await bulkCreateSuccess(client, repository, [obj1, obj2]); + expectMigrationArgs({ namespace: expect.anything() }, false, 1); + expectMigrationArgs({ namespace: expect.anything() }, false, 2); + }); + + it(`doesn't add namespace to body when not using single-namespace type`, async () => { + const objects = [ + { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }, + { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, + ]; + await bulkCreateSuccess(client, repository, objects, { namespace }); + expectMigrationArgs({ namespace: expect.anything() }, false, 1); + expectMigrationArgs({ namespace: expect.anything() }, false, 2); + }); + + it(`adds namespaces to body when providing namespace for multi-namespace type`, async () => { + const objects = [obj1, obj2].map((obj) => ({ + ...obj, + type: MULTI_NAMESPACE_ISOLATED_TYPE, + })); + await bulkCreateSuccess(client, repository, objects, { namespace }); + expectMigrationArgs({ namespaces: [namespace] }, true, 1); + expectMigrationArgs({ namespaces: [namespace] }, true, 2); + }); + + it(`adds default namespaces to body when providing no namespace for multi-namespace type`, async () => { + const objects = [obj1, obj2].map((obj) => ({ + ...obj, + type: MULTI_NAMESPACE_ISOLATED_TYPE, + })); + await bulkCreateSuccess(client, repository, objects); + expectMigrationArgs({ namespaces: ['default'] }, true, 1); + expectMigrationArgs({ namespaces: ['default'] }, true, 2); + }); + + it(`doesn't add namespaces to body when not using multi-namespace type`, async () => { + const objects = [obj1, { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE }]; + await bulkCreateSuccess(client, repository, objects); + expectMigrationArgs({ namespaces: expect.anything() }, false, 1); + expectMigrationArgs({ namespaces: expect.anything() }, false, 2); + }); + }); + + describe('returns', () => { + it(`formats the ES response`, async () => { + const result = await bulkCreateSuccess(client, repository, [obj1, obj2]); + expect(result).toEqual({ + saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), + }); + }); + + it.todo(`should return objects in the same order regardless of type`); + + it(`handles a mix of successful creates and errors`, async () => { + const obj = { + type: 'unknownType', + id: 'three', + attributes: {}, + }; + const objects = [obj1, obj, obj2]; + const response = getMockBulkCreateResponse([obj1, obj2]); + client.bulk.mockResponseOnce(response); + const result = await repository.bulkCreate(objects); + expect(client.bulk).toHaveBeenCalledTimes(1); + expect(result).toEqual({ + saved_objects: [expectCreateResult(obj1), expectError(obj), expectCreateResult(obj2)], + }); + }); + + it(`a deserialized saved object`, async () => { + // Test for fix to https://github.com/elastic/kibana/issues/65088 where + // we returned raw ID's when an object without an id was created. + const namespace = 'myspace'; + // FIXME: this test is based on a gigantic hack to have the bulk operation return the source + // of the document when it actually does not, forcing to cast to any as BulkResponse + // does not contains _source + const response = getMockBulkCreateResponse([obj1, obj2], namespace) as any; + client.bulk.mockResponseOnce(response); + + // Bulk create one object with id unspecified, and one with id specified + const result = await repository.bulkCreate([{ ...obj1, id: undefined }, obj2], { + namespace, + }); + + // Assert that both raw docs from the ES response are deserialized + expect(serializer.rawToSavedObject).toHaveBeenNthCalledWith( + 1, + { + ...response.items[0].create, + _source: { + ...response.items[0].create._source, + namespaces: response.items[0].create._source.namespaces, + coreMigrationVersion: expect.any(String), + typeMigrationVersion: '1.1.1', + }, + _id: expect.stringMatching( + /^myspace:config:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/ + ), + }, + expect.any(Object) + ); + expect(serializer.rawToSavedObject).toHaveBeenNthCalledWith( + 2, + { + ...response.items[1].create, + _source: { + ...response.items[1].create._source, + namespaces: response.items[1].create._source.namespaces, + coreMigrationVersion: expect.any(String), + typeMigrationVersion: '1.1.1', + }, + }, + expect.any(Object) + ); + + // Assert that ID's are deserialized to remove the type and namespace + expect(result.saved_objects[0].id).toEqual( + expect.stringMatching(/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/) + ); + expect(result.saved_objects[1].id).toEqual(obj2.id); + + // Assert that managed is not changed + expect(result.saved_objects[0].managed).toBeFalsy(); + expect(result.saved_objects[1].managed).toEqual(obj2.managed); + }); + + it(`sets managed=false if not already set`, async () => { + const obj1WithoutManaged = { + type: 'config', + id: '6.0.0-alpha1', + attributes: { title: 'Test One' }, + references: [{ name: 'ref_0', type: 'test', id: '1' }], + }; + const obj2WithoutManaged = { + type: 'index-pattern', + id: 'logstash-*', + attributes: { title: 'Test Two' }, + references: [{ name: 'ref_0', type: 'test', id: '2' }], + }; + const result = await bulkCreateSuccess(client, repository, [ + obj1WithoutManaged, + obj2WithoutManaged, + ]); + expect(result).toEqual({ + saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), + }); + }); + + it(`sets managed=false only on documents without managed already set`, async () => { + const objWithoutManaged = { + type: 'config', + id: '6.0.0-alpha1', + attributes: { title: 'Test One' }, + references: [{ name: 'ref_0', type: 'test', id: '1' }], + }; + const result = await bulkCreateSuccess(client, repository, [objWithoutManaged, obj2]); + expect(result).toEqual({ + saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), + }); + }); + + it(`sets managed=true if provided as an override`, async () => { + const obj1WithoutManaged = { + type: 'config', + id: '6.0.0-alpha1', + attributes: { title: 'Test One' }, + references: [{ name: 'ref_0', type: 'test', id: '1' }], + }; + const obj2WithoutManaged = { + type: 'index-pattern', + id: 'logstash-*', + attributes: { title: 'Test Two' }, + references: [{ name: 'ref_0', type: 'test', id: '2' }], + }; + const result = await bulkCreateSuccess( + client, + repository, + [obj1WithoutManaged, obj2WithoutManaged], + { managed: true } + ); + expect(result).toEqual({ + saved_objects: [ + { ...obj1WithoutManaged, managed: true }, + { ...obj2WithoutManaged, managed: true }, + ].map((x) => expectCreateResult(x)), + }); + }); + + it(`sets managed=false if provided as an override`, async () => { + const obj1WithoutManaged = { + type: 'config', + id: '6.0.0-alpha1', + attributes: { title: 'Test One' }, + references: [{ name: 'ref_0', type: 'test', id: '1' }], + }; + const obj2WithoutManaged = { + type: 'index-pattern', + id: 'logstash-*', + attributes: { title: 'Test Two' }, + references: [{ name: 'ref_0', type: 'test', id: '2' }], + }; + const result = await bulkCreateSuccess( + client, + repository, + [obj1WithoutManaged, obj2WithoutManaged], + { managed: false } + ); + expect(result).toEqual({ + saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), + }); + }); + }); + }); +}); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.test.ts index a2b4121cebad0..79e04bae320cd 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.test.ts @@ -235,6 +235,81 @@ describe('createPointInTimeFinder()', () => { ); }); + test('does not yield empty first page', async () => { + repository.openPointInTimeForType.mockResolvedValueOnce({ + id: 'abc123', + }); + repository.find.mockResolvedValueOnce({ + total: 2, + saved_objects: [], + pit_id: 'abc123', + per_page: 2, + page: 0, + }); + + const findOptions: SavedObjectsCreatePointInTimeFinderOptions = { + type: ['visualization'], + search: 'foo*', + }; + + const internalOptions = {}; + const finder = new PointInTimeFinder(findOptions, { + logger, + client: repository, + internalOptions, + }); + + const hits: SavedObjectsFindResult[] = []; + let pageCount = 0; + for await (const result of finder.find()) { + hits.push(...result.saved_objects); + pageCount++; + } + + expect(pageCount).toEqual(0); + expect(hits.length).toEqual(0); + }); + + test('yields empty first page if aggregations are used', async () => { + repository.openPointInTimeForType.mockResolvedValueOnce({ + id: 'abc123', + }); + repository.find.mockResolvedValueOnce({ + total: 2, + saved_objects: [], + pit_id: 'abc123', + per_page: 2, + page: 0, + }); + + const findOptions: SavedObjectsCreatePointInTimeFinderOptions = { + type: ['visualization'], + search: 'foo*', + aggs: { + some: { + avg: { field: 'fo' }, + }, + }, + }; + + const internalOptions = {}; + const finder = new PointInTimeFinder(findOptions, { + logger, + client: repository, + internalOptions, + }); + + const hits: SavedObjectsFindResult[] = []; + let pageCount = 0; + for await (const result of finder.find()) { + hits.push(...result.saved_objects); + pageCount++; + } + + expect(pageCount).toEqual(1); + expect(hits.length).toEqual(0); + }); + test('still applies the defaults in the mandatory fields even when `undefined` is explicitly provided', async () => { repository.openPointInTimeForType.mockResolvedValueOnce({ id: 'abc123', diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.ts index 524b571894007..7a2c124a0e86e 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/point_in_time_finder.ts @@ -93,7 +93,12 @@ export class PointInTimeFinder await this.close(); } - yield results; + // do not yield first page if empty, unless there are aggregations + // (in which case we always want to return at least one page) + if (lastResultsCount > 0 || this.#findOptions.aggs) { + yield results; + } + // We've reached the end when there are fewer hits than our perPage size, // or when `close()` has been called. } while (this.#open && lastResultsCount >= this.#findOptions.perPage!); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts index 1084ad3e58966..3547d653e3de4 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.test.ts @@ -32,7 +32,6 @@ import type { SavedObjectsIncrementCounterOptions, SavedObjectsCreatePointInTimeFinderDependencies, SavedObjectsCreatePointInTimeFinderOptions, - SavedObjectsBulkCreateObject, SavedObjectsBulkGetObject, SavedObjectsCreateOptions, SavedObjectsDeleteOptions, @@ -86,13 +85,10 @@ import { getMockMgetResponse, type TypeIdTuple, createSpySerializer, - bulkCreateSuccess, - getMockBulkCreateResponse, bulkGet, expectErrorResult, expectErrorInvalidType, expectErrorNotFound, - expectErrorConflict, expectError, generateIndexPatternSearchResults, findSuccess, @@ -105,7 +101,6 @@ import { createUnsupportedTypeErrorPayload, createConflictErrorPayload, createGenericNotFoundErrorPayload, - expectCreateResult, mockTimestampFieldsWithCreated, getMockEsBulkDeleteResponse, bulkDeleteSuccess, @@ -193,917 +188,6 @@ describe('SavedObjectsRepository', () => { references: [{ name: 'search_0', type: 'search', id: '123' }], }); - describe('#bulkCreate', () => { - beforeEach(() => { - mockPreflightCheckForCreate.mockReset(); - mockPreflightCheckForCreate.mockImplementation(({ objects }) => { - return Promise.resolve(objects.map(({ type, id }) => ({ type, id }))); // respond with no errors by default - }); - }); - - const obj1 = { - type: 'config', - id: '6.0.0-alpha1', - attributes: { title: 'Test One' }, - references: [{ name: 'ref_0', type: 'test', id: '1' }], - managed: false, - }; - const obj2 = { - type: 'index-pattern', - id: 'logstash-*', - attributes: { title: 'Test Two' }, - references: [{ name: 'ref_0', type: 'test', id: '2' }], - managed: false, - }; - const namespace = 'foo-namespace'; - - // bulk create calls have two objects for each source -- the action, and the source - const expectClientCallArgsAction = ( - objects: Array<{ type: string; id?: string; if_primary_term?: string; if_seq_no?: string }>, - { - method, - _index = expect.any(String), - getId = () => expect.any(String), - }: { method: string; _index?: string; getId?: (type: string, id?: string) => string } - ) => { - const body = []; - for (const { type, id, if_primary_term: ifPrimaryTerm, if_seq_no: ifSeqNo } of objects) { - body.push({ - [method]: { - _index, - _id: getId(type, id), - ...(ifPrimaryTerm && ifSeqNo - ? { if_primary_term: expect.any(Number), if_seq_no: expect.any(Number) } - : {}), - }, - }); - body.push(expect.any(Object)); - } - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }; - - const expectObjArgs = ( - { - type, - attributes, - references, - }: { type: string; attributes: unknown; references?: SavedObjectReference[] }, - overrides: Record = {} - ) => [ - expect.any(Object), - expect.objectContaining({ - [type]: attributes, - references, - type, - ...overrides, - ...mockTimestampFields, - }), - ]; - describe('client calls', () => { - it(`should use the ES bulk action by default`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2]); - expect(client.bulk).toHaveBeenCalledTimes(1); - }); - - it(`should use the preflightCheckForCreate action before bulk action for any types that are multi-namespace, when id is defined`, async () => { - const objects = [obj1, { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }]; - await bulkCreateSuccess(client, repository, objects); - expect(client.bulk).toHaveBeenCalledTimes(1); - expect(mockPreflightCheckForCreate).toHaveBeenCalledTimes(1); - expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( - expect.objectContaining({ - objects: [ - { - type: MULTI_NAMESPACE_ISOLATED_TYPE, - id: obj2.id, - overwrite: false, - namespaces: ['default'], - }, - ], - }) - ); - }); - - it(`should use the ES create method if ID is undefined and overwrite=true`, async () => { - const objects = [obj1, obj2].map((obj) => ({ ...obj, id: undefined })); - await bulkCreateSuccess(client, repository, objects, { overwrite: true }); - expectClientCallArgsAction(objects, { method: 'create' }); - }); - - it(`should use the ES create method if ID is undefined and overwrite=false`, async () => { - const objects = [obj1, obj2].map((obj) => ({ ...obj, id: undefined })); - await bulkCreateSuccess(client, repository, objects); - expectClientCallArgsAction(objects, { method: 'create' }); - }); - - it(`should use the ES index method if ID is defined and overwrite=true`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { overwrite: true }); - expectClientCallArgsAction([obj1, obj2], { method: 'index' }); - }); - - it(`should use the ES index method with version if ID and version are defined and overwrite=true`, async () => { - await bulkCreateSuccess( - client, - repository, - [ - { - ...obj1, - version: mockVersion, - }, - obj2, - ], - { overwrite: true } - ); - - const obj1WithSeq = { - ...obj1, - managed: obj1.managed, - if_seq_no: mockVersionProps._seq_no, - if_primary_term: mockVersionProps._primary_term, - }; - - expectClientCallArgsAction([obj1WithSeq, obj2], { method: 'index' }); - }); - - it(`should use the ES create method if ID is defined and overwrite=false`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2]); - expectClientCallArgsAction([obj1, obj2], { method: 'create' }); - }); - - it(`should use the ES index method if ID is defined, overwrite=true and managed=true in a document`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { - overwrite: true, - managed: true, - }); - expectClientCallArgsAction([obj1, obj2], { method: 'index' }); - }); - - it(`should use the ES create method if ID is defined, overwrite=false and managed=true in a document`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { managed: true }); - expectClientCallArgsAction([obj1, obj2], { method: 'create' }); - }); - - it(`formats the ES request`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2]); - const body = [...expectObjArgs(obj1), ...expectObjArgs(obj2)]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - // this test only ensures that the client accepts the managed field in a document - it(`formats the ES request with managed=true in a document`, async () => { - const obj1WithManagedTrue = { ...obj1, managed: true }; - const obj2WithManagedTrue = { ...obj2, managed: true }; - await bulkCreateSuccess(client, repository, [obj1WithManagedTrue, obj2WithManagedTrue]); - const body = [...expectObjArgs(obj1WithManagedTrue), ...expectObjArgs(obj2WithManagedTrue)]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - describe('originId', () => { - it(`returns error if originId is set for non-multi-namespace type`, async () => { - const result = await repository.bulkCreate([ - { ...obj1, originId: 'some-originId' }, - { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE, originId: 'some-originId' }, - ]); - expect(result.saved_objects).toEqual([ - expect.objectContaining({ id: obj1.id, type: obj1.type, error: expect.anything() }), - expect.objectContaining({ - id: obj2.id, - type: NAMESPACE_AGNOSTIC_TYPE, - error: expect.anything(), - }), - ]); - expect(client.bulk).not.toHaveBeenCalled(); - }); - - it(`defaults to no originId`, async () => { - const objects = [ - { ...obj1, type: MULTI_NAMESPACE_TYPE }, - { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, - ]; - - await bulkCreateSuccess(client, repository, objects); - const expected = expect.not.objectContaining({ originId: expect.anything() }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - describe('with existing originId', () => { - beforeEach(() => { - mockPreflightCheckForCreate.mockImplementation(({ objects }) => { - const existingDocument = { - _source: { originId: 'existing-originId' }, - } as SavedObjectsRawDoc; - return Promise.resolve( - objects.map(({ type, id }) => ({ type, id, existingDocument })) - ); - }); - }); - - it(`accepts custom originId for multi-namespace type`, async () => { - // The preflight result has `existing-originId`, but that is discarded - const objects = [ - { ...obj1, type: MULTI_NAMESPACE_TYPE, originId: 'some-originId' }, - { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE, originId: 'some-originId' }, - ]; - await bulkCreateSuccess(client, repository, objects); - const expected = expect.objectContaining({ originId: 'some-originId' }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - it(`accepts undefined originId`, async () => { - // The preflight result has `existing-originId`, but that is discarded - const objects = [ - { ...obj1, type: MULTI_NAMESPACE_TYPE, originId: undefined }, - { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE, originId: undefined }, - ]; - await bulkCreateSuccess(client, repository, objects); - const expected = expect.not.objectContaining({ originId: expect.anything() }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - it(`preserves existing originId if originId option is not set`, async () => { - const objects = [ - { ...obj1, type: MULTI_NAMESPACE_TYPE }, - { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, - ]; - await bulkCreateSuccess(client, repository, objects); - const expected = expect.objectContaining({ originId: 'existing-originId' }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - }); - }); - - it(`adds namespace to request body for any types that are single-namespace`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); - const expected = expect.objectContaining({ namespace }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - // this only ensures we don't override any other options - it(`adds managed=false to request body if declared for any types that are single-namespace`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace, managed: false }); - const expected = expect.objectContaining({ namespace, managed: false }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - // this only ensures we don't override any other options - it(`adds managed=true to request body if declared for any types that are single-namespace`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace, managed: true }); - const expected = expect.objectContaining({ namespace, managed: true }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - it(`normalizes options.namespace from 'default' to undefined`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace: 'default' }); - const expected = expect.not.objectContaining({ namespace: 'default' }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - it(`doesn't add namespace to request body for any types that are not single-namespace`, async () => { - const objects = [ - { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }, - { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, - ]; - await bulkCreateSuccess(client, repository, objects, { namespace }); - const expected = expect.not.objectContaining({ namespace: expect.anything() }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - }); - - it(`adds namespaces to request body for any types that are multi-namespace`, async () => { - const test = async (namespace?: string) => { - const objects = [obj1, obj2].map((x) => ({ ...x, type: MULTI_NAMESPACE_ISOLATED_TYPE })); - const [o1, o2] = objects; - mockPreflightCheckForCreate.mockResolvedValueOnce([ - { type: o1.type, id: o1.id! }, // first object does not have an existing document to overwrite - { - type: o2.type, - id: o2.id!, - existingDocument: { _id: o2.id!, _source: { namespaces: ['*'], type: o2.type } }, // second object does have an existing document to overwrite - }, - ]); - await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); - const expected1 = expect.objectContaining({ namespaces: [namespace ?? 'default'] }); - const expected2 = expect.objectContaining({ namespaces: ['*'] }); - const body = [expect.any(Object), expected1, expect.any(Object), expected2]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - client.bulk.mockClear(); - mockPreflightCheckForCreate.mockReset(); - }; - await test(undefined); - await test(namespace); - }); - - it(`adds initialNamespaces instead of namespace`, async () => { - const test = async (namespace?: string) => { - const ns2 = 'bar-namespace'; - const ns3 = 'baz-namespace'; - const objects = [ - { ...obj1, type: 'dashboard', initialNamespaces: [ns2] }, - { ...obj1, type: MULTI_NAMESPACE_ISOLATED_TYPE, initialNamespaces: [ns2] }, - { ...obj1, type: MULTI_NAMESPACE_TYPE, initialNamespaces: [ns2, ns3] }, - ]; - const [o1, o2, o3] = objects; - mockPreflightCheckForCreate.mockResolvedValueOnce([ - // first object does not get passed in to preflightCheckForCreate at all - { type: o2.type, id: o2.id! }, // second object does not have an existing document to overwrite - { - type: o3.type, - id: o3.id!, - existingDocument: { - _id: o3.id!, - _source: { type: o3.type, namespaces: [namespace ?? 'default', 'something-else'] }, // third object does have an existing document to overwrite - }, - }, - ]); - await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); - const body = [ - { index: expect.objectContaining({ _id: `${ns2}:dashboard:${o1.id}` }) }, - expect.objectContaining({ namespace: ns2 }), - { - index: expect.objectContaining({ - _id: `${MULTI_NAMESPACE_ISOLATED_TYPE}:${o2.id}`, - }), - }, - expect.objectContaining({ namespaces: [ns2] }), - { index: expect.objectContaining({ _id: `${MULTI_NAMESPACE_TYPE}:${o3.id}` }) }, - expect.objectContaining({ namespaces: [ns2, ns3] }), - ]; - expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( - expect.objectContaining({ - objects: [ - // assert that the initialNamespaces fields were passed into preflightCheckForCreate instead of the current namespace - { type: o2.type, id: o2.id, overwrite: true, namespaces: o2.initialNamespaces }, - { type: o3.type, id: o3.id, overwrite: true, namespaces: o3.initialNamespaces }, - ], - }) - ); - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - client.bulk.mockClear(); - mockPreflightCheckForCreate.mockReset(); - }; - await test(undefined); - await test(namespace); - }); - - it(`normalizes initialNamespaces from 'default' to undefined`, async () => { - const test = async (namespace?: string) => { - const objects = [{ ...obj1, type: 'dashboard', initialNamespaces: ['default'] }]; - await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); - const body = [ - { index: expect.objectContaining({ _id: `dashboard:${obj1.id}` }) }, - expect.not.objectContaining({ namespace: 'default' }), - ]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - client.bulk.mockClear(); - }; - await test(undefined); - await test(namespace); - }); - - it(`doesn't add namespaces to request body for any types that are not multi-namespace`, async () => { - const test = async (namespace?: string) => { - const objects = [obj1, { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE }]; - await bulkCreateSuccess(client, repository, objects, { namespace, overwrite: true }); - const expected = expect.not.objectContaining({ namespaces: expect.anything() }); - const body = [expect.any(Object), expected, expect.any(Object), expected]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - client.bulk.mockClear(); - }; - await test(undefined); - await test(namespace); - }); - - it(`defaults to a refresh setting of wait_for`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2]); - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ refresh: 'wait_for' }), - expect.anything() - ); - }); - - it(`should use default index`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2]); - expectClientCallArgsAction([obj1, obj2], { - method: 'create', - _index: '.kibana-test_8.0.0-testing', - }); - }); - - it(`should use custom index`, async () => { - await bulkCreateSuccess( - client, - repository, - [obj1, obj2].map((x) => ({ ...x, type: CUSTOM_INDEX_TYPE })) - ); - expectClientCallArgsAction([obj1, obj2], { - method: 'create', - _index: 'custom_8.0.0-testing', - }); - }); - - it(`prepends namespace to the id when providing namespace for single-namespace type`, async () => { - const getId = (type: string, id: string = '') => `${namespace}:${type}:${id}`; // test that the raw document ID equals this (e.g., has a namespace prefix) - await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); - expectClientCallArgsAction([obj1, obj2], { method: 'create', getId }); - }); - - it(`doesn't prepend namespace to the id when providing no namespace for single-namespace type`, async () => { - const getId = (type: string, id: string = '') => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - await bulkCreateSuccess(client, repository, [obj1, obj2]); - expectClientCallArgsAction([obj1, obj2], { method: 'create', getId }); - }); - - it(`doesn't prepend namespace to the id when not using single-namespace type`, async () => { - const getId = (type: string, id: string = '') => `${type}:${id}`; // test that the raw document ID equals this (e.g., does not have a namespace prefix) - const objects = [ - { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }, - { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, - ]; - await bulkCreateSuccess(client, repository, objects, { namespace }); - expectClientCallArgsAction(objects, { method: 'create', getId }); - }); - }); - - describe('errors', () => { - afterEach(() => { - mockGetBulkOperationError.mockReset(); - }); - - const obj3 = { - type: 'dashboard', - id: 'three', - attributes: { title: 'Test Three' }, - references: [{ name: 'ref_0', type: 'test', id: '2' }], - }; - - const bulkCreateError = async ( - obj: SavedObjectsBulkCreateObject, - isBulkError: boolean | undefined, - expectedErrorResult: ExpectedErrorResult - ) => { - let response; - if (isBulkError) { - // mock the bulk error for only the second object - mockGetBulkOperationError.mockReturnValueOnce(undefined); - mockGetBulkOperationError.mockReturnValueOnce(expectedErrorResult.error as Payload); - response = getMockBulkCreateResponse([obj1, obj, obj2]); - } else { - response = getMockBulkCreateResponse([obj1, obj2]); - } - client.bulk.mockResponseOnce(response); - - const objects = [obj1, obj, obj2]; - const result = await repository.bulkCreate(objects); - expect(client.bulk).toHaveBeenCalled(); - const objCall = isBulkError ? expectObjArgs(obj) : []; - const body = [...expectObjArgs(obj1), ...objCall, ...expectObjArgs(obj2)]; - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body }), - expect.anything() - ); - expect(result).toEqual({ - saved_objects: [expectSuccess(obj1), expectedErrorResult, expectSuccess(obj2)], - }); - }; - - it(`throws when options.namespace is '*'`, async () => { - await expect( - repository.bulkCreate([obj3], { namespace: ALL_NAMESPACES_STRING }) - ).rejects.toThrowError(createBadRequestErrorPayload('"options.namespace" cannot be "*"')); - }); - - it(`returns error when initialNamespaces is used with a space-agnostic object`, async () => { - const obj = { ...obj3, type: NAMESPACE_AGNOSTIC_TYPE, initialNamespaces: [] }; - await bulkCreateError( - obj, - undefined, - expectErrorResult( - obj, - createBadRequestErrorPayload( - '"initialNamespaces" cannot be used on space-agnostic types' - ) - ) - ); - }); - - it(`returns error when initialNamespaces is empty`, async () => { - const obj = { ...obj3, type: MULTI_NAMESPACE_TYPE, initialNamespaces: [] }; - await bulkCreateError( - obj, - undefined, - expectErrorResult( - obj, - createBadRequestErrorPayload('"initialNamespaces" must be a non-empty array of strings') - ) - ); - }); - - it(`returns error when initialNamespaces is used with a space-isolated object and does not specify a single space`, async () => { - const doTest = async (objType: string, initialNamespaces: string[]) => { - const obj = { ...obj3, type: objType, initialNamespaces }; - await bulkCreateError( - obj, - undefined, - expectErrorResult( - obj, - createBadRequestErrorPayload( - '"initialNamespaces" can only specify a single space when used with space-isolated types' - ) - ) - ); - }; - await doTest('dashboard', ['spacex', 'spacey']); - await doTest('dashboard', ['*']); - await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['spacex', 'spacey']); - await doTest(MULTI_NAMESPACE_ISOLATED_TYPE, ['*']); - }); - - it(`returns error when type is invalid`, async () => { - const obj = { ...obj3, type: 'unknownType' }; - await bulkCreateError(obj, undefined, expectErrorInvalidType(obj)); - }); - - it(`returns error when type is hidden`, async () => { - const obj = { ...obj3, type: HIDDEN_TYPE }; - await bulkCreateError(obj, undefined, expectErrorInvalidType(obj)); - }); - - it(`returns error when there is a conflict from preflightCheckForCreate`, async () => { - const objects = [ - // only the second, third, and fourth objects are passed to preflightCheckForCreate and result in errors - obj1, - { ...obj1, type: MULTI_NAMESPACE_TYPE }, - { ...obj2, type: MULTI_NAMESPACE_TYPE }, - { ...obj3, type: MULTI_NAMESPACE_TYPE }, - obj2, - ]; - const [o1, o2, o3, o4, o5] = objects; - mockPreflightCheckForCreate.mockResolvedValueOnce([ - // first and last objects do not get passed in to preflightCheckForCreate at all - { type: o2.type, id: o2.id!, error: { type: 'conflict' } }, - { - type: o3.type, - id: o3.id!, - error: { type: 'unresolvableConflict', metadata: { isNotOverwritable: true } }, - }, - { - type: o4.type, - id: o4.id!, - error: { type: 'aliasConflict', metadata: { spacesWithConflictingAliases: ['foo'] } }, - }, - ]); - const bulkResponse = getMockBulkCreateResponse([o1, o5]); - client.bulk.mockResponseOnce(bulkResponse); - - const options = { overwrite: true }; - const result = await repository.bulkCreate(objects, options); - expect(mockPreflightCheckForCreate).toHaveBeenCalled(); - expect(mockPreflightCheckForCreate).toHaveBeenCalledWith( - expect.objectContaining({ - objects: [ - { type: o2.type, id: o2.id, overwrite: true, namespaces: ['default'] }, - { type: o3.type, id: o3.id, overwrite: true, namespaces: ['default'] }, - { type: o4.type, id: o4.id, overwrite: true, namespaces: ['default'] }, - ], - }) - ); - expect(client.bulk).toHaveBeenCalled(); - expect(client.bulk).toHaveBeenCalledWith( - expect.objectContaining({ body: [...expectObjArgs(o1), ...expectObjArgs(o5)] }), - expect.anything() - ); - expect(result).toEqual({ - saved_objects: [ - expectSuccess(o1), - expectErrorConflict(o2), - expectErrorConflict(o3, { metadata: { isNotOverwritable: true } }), - expectErrorConflict(o4, { metadata: { spacesWithConflictingAliases: ['foo'] } }), - expectSuccess(o5), - ], - }); - }); - - it(`returns bulk error`, async () => { - const expectedErrorResult = { - type: obj3.type, - id: obj3.id, - error: { error: 'Oh no, a bulk error!' }, - }; - await bulkCreateError(obj3, true, expectedErrorResult); - }); - - it(`returns errors for any bulk objects with invalid schemas`, async () => { - const response = getMockBulkCreateResponse([obj3]); - client.bulk.mockResponseOnce(response); - - const result = await repository.bulkCreate([ - obj3, - // @ts-expect-error - Title should be a string and is intentionally malformed for testing - { ...obj3, id: 'three-again', attributes: { title: 123 } }, - ]); - expect(client.bulk).toHaveBeenCalledTimes(1); // only called once for the valid object - expect(result.saved_objects).toEqual([ - expect.objectContaining(obj3), - expect.objectContaining({ - error: new Error( - '[attributes.title]: expected value of type [string] but got [number]: Bad Request' - ), - id: 'three-again', - type: 'dashboard', - }), - ]); - }); - }); - - describe('migration', () => { - it(`migrates the docs and serializes the migrated docs`, async () => { - migrator.migrateDocument.mockImplementation(mockMigrateDocument); - const modifiedObj1 = { ...obj1, coreMigrationVersion: '8.0.0' }; - await bulkCreateSuccess(client, repository, [modifiedObj1, obj2]); - const docs = [modifiedObj1, obj2].map((x) => ({ ...x, ...mockTimestampFieldsWithCreated })); - expectMigrationArgs(docs[0], true, 1); - expectMigrationArgs(docs[1], true, 2); - - const migratedDocs = docs.map((x) => migrator.migrateDocument(x)); - expect(serializer.savedObjectToRaw).toHaveBeenNthCalledWith(1, migratedDocs[0]); - expect(serializer.savedObjectToRaw).toHaveBeenNthCalledWith(2, migratedDocs[1]); - }); - - it(`adds namespace to body when providing namespace for single-namespace type`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); - expectMigrationArgs({ namespace }, true, 1); - expectMigrationArgs({ namespace }, true, 2); - }); - - it(`doesn't add namespace to body when providing no namespace for single-namespace type`, async () => { - await bulkCreateSuccess(client, repository, [obj1, obj2]); - expectMigrationArgs({ namespace: expect.anything() }, false, 1); - expectMigrationArgs({ namespace: expect.anything() }, false, 2); - }); - - it(`doesn't add namespace to body when not using single-namespace type`, async () => { - const objects = [ - { ...obj1, type: NAMESPACE_AGNOSTIC_TYPE }, - { ...obj2, type: MULTI_NAMESPACE_ISOLATED_TYPE }, - ]; - await bulkCreateSuccess(client, repository, objects, { namespace }); - expectMigrationArgs({ namespace: expect.anything() }, false, 1); - expectMigrationArgs({ namespace: expect.anything() }, false, 2); - }); - - it(`adds namespaces to body when providing namespace for multi-namespace type`, async () => { - const objects = [obj1, obj2].map((obj) => ({ - ...obj, - type: MULTI_NAMESPACE_ISOLATED_TYPE, - })); - await bulkCreateSuccess(client, repository, objects, { namespace }); - expectMigrationArgs({ namespaces: [namespace] }, true, 1); - expectMigrationArgs({ namespaces: [namespace] }, true, 2); - }); - - it(`adds default namespaces to body when providing no namespace for multi-namespace type`, async () => { - const objects = [obj1, obj2].map((obj) => ({ - ...obj, - type: MULTI_NAMESPACE_ISOLATED_TYPE, - })); - await bulkCreateSuccess(client, repository, objects); - expectMigrationArgs({ namespaces: ['default'] }, true, 1); - expectMigrationArgs({ namespaces: ['default'] }, true, 2); - }); - - it(`doesn't add namespaces to body when not using multi-namespace type`, async () => { - const objects = [obj1, { ...obj2, type: NAMESPACE_AGNOSTIC_TYPE }]; - await bulkCreateSuccess(client, repository, objects); - expectMigrationArgs({ namespaces: expect.anything() }, false, 1); - expectMigrationArgs({ namespaces: expect.anything() }, false, 2); - }); - }); - - describe('returns', () => { - it(`formats the ES response`, async () => { - const result = await bulkCreateSuccess(client, repository, [obj1, obj2]); - expect(result).toEqual({ - saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), - }); - }); - - it.todo(`should return objects in the same order regardless of type`); - - it(`handles a mix of successful creates and errors`, async () => { - const obj = { - type: 'unknownType', - id: 'three', - attributes: {}, - }; - const objects = [obj1, obj, obj2]; - const response = getMockBulkCreateResponse([obj1, obj2]); - client.bulk.mockResponseOnce(response); - const result = await repository.bulkCreate(objects); - expect(client.bulk).toHaveBeenCalledTimes(1); - expect(result).toEqual({ - saved_objects: [expectCreateResult(obj1), expectError(obj), expectCreateResult(obj2)], - }); - }); - - it(`a deserialized saved object`, async () => { - // Test for fix to https://github.com/elastic/kibana/issues/65088 where - // we returned raw ID's when an object without an id was created. - const namespace = 'myspace'; - // FIXME: this test is based on a gigantic hack to have the bulk operation return the source - // of the document when it actually does not, forcing to cast to any as BulkResponse - // does not contains _source - const response = getMockBulkCreateResponse([obj1, obj2], namespace) as any; - client.bulk.mockResponseOnce(response); - - // Bulk create one object with id unspecified, and one with id specified - const result = await repository.bulkCreate([{ ...obj1, id: undefined }, obj2], { - namespace, - }); - - // Assert that both raw docs from the ES response are deserialized - expect(serializer.rawToSavedObject).toHaveBeenNthCalledWith( - 1, - { - ...response.items[0].create, - _source: { - ...response.items[0].create._source, - namespaces: response.items[0].create._source.namespaces, - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '1.1.1', - }, - _id: expect.stringMatching( - /^myspace:config:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/ - ), - }, - expect.any(Object) - ); - expect(serializer.rawToSavedObject).toHaveBeenNthCalledWith( - 2, - { - ...response.items[1].create, - _source: { - ...response.items[1].create._source, - namespaces: response.items[1].create._source.namespaces, - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '1.1.1', - }, - }, - expect.any(Object) - ); - - // Assert that ID's are deserialized to remove the type and namespace - expect(result.saved_objects[0].id).toEqual( - expect.stringMatching(/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/) - ); - expect(result.saved_objects[1].id).toEqual(obj2.id); - - // Assert that managed is not changed - expect(result.saved_objects[0].managed).toBeFalsy(); - expect(result.saved_objects[1].managed).toEqual(obj2.managed); - }); - - it(`sets managed=false if not already set`, async () => { - const obj1WithoutManaged = { - type: 'config', - id: '6.0.0-alpha1', - attributes: { title: 'Test One' }, - references: [{ name: 'ref_0', type: 'test', id: '1' }], - }; - const obj2WithoutManaged = { - type: 'index-pattern', - id: 'logstash-*', - attributes: { title: 'Test Two' }, - references: [{ name: 'ref_0', type: 'test', id: '2' }], - }; - const result = await bulkCreateSuccess(client, repository, [ - obj1WithoutManaged, - obj2WithoutManaged, - ]); - expect(result).toEqual({ - saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), - }); - }); - - it(`sets managed=false only on documents without managed already set`, async () => { - const objWithoutManaged = { - type: 'config', - id: '6.0.0-alpha1', - attributes: { title: 'Test One' }, - references: [{ name: 'ref_0', type: 'test', id: '1' }], - }; - const result = await bulkCreateSuccess(client, repository, [objWithoutManaged, obj2]); - expect(result).toEqual({ - saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), - }); - }); - - it(`sets managed=true if provided as an override`, async () => { - const obj1WithoutManaged = { - type: 'config', - id: '6.0.0-alpha1', - attributes: { title: 'Test One' }, - references: [{ name: 'ref_0', type: 'test', id: '1' }], - }; - const obj2WithoutManaged = { - type: 'index-pattern', - id: 'logstash-*', - attributes: { title: 'Test Two' }, - references: [{ name: 'ref_0', type: 'test', id: '2' }], - }; - const result = await bulkCreateSuccess( - client, - repository, - [obj1WithoutManaged, obj2WithoutManaged], - { managed: true } - ); - expect(result).toEqual({ - saved_objects: [ - { ...obj1WithoutManaged, managed: true }, - { ...obj2WithoutManaged, managed: true }, - ].map((x) => expectCreateResult(x)), - }); - }); - - it(`sets managed=false if provided as an override`, async () => { - const obj1WithoutManaged = { - type: 'config', - id: '6.0.0-alpha1', - attributes: { title: 'Test One' }, - references: [{ name: 'ref_0', type: 'test', id: '1' }], - }; - const obj2WithoutManaged = { - type: 'index-pattern', - id: 'logstash-*', - attributes: { title: 'Test Two' }, - references: [{ name: 'ref_0', type: 'test', id: '2' }], - }; - const result = await bulkCreateSuccess( - client, - repository, - [obj1WithoutManaged, obj2WithoutManaged], - { managed: false } - ); - expect(result).toEqual({ - saved_objects: [obj1, obj2].map((x) => expectCreateResult(x)), - }); - }); - }); - }); - describe('#bulkGet', () => { const obj1: SavedObject = { type: 'config', diff --git a/packages/core/saved-objects/docs/openapi/bundled.json b/packages/core/saved-objects/docs/openapi/bundled.json index dd6b95fa959b2..4382ee9b62d98 100644 --- a/packages/core/saved-objects/docs/openapi/bundled.json +++ b/packages/core/saved-objects/docs/openapi/bundled.json @@ -757,7 +757,7 @@ "post": { "summary": "Resolve errors from the Import objects API.", "operationId": "resolveImportErrors", - "description": "To resolve errors, you can: \n\n* Retry certain saved objects\n* Overwrite specific saved objects\n* Change references to different saved objects\n\nThis functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.\n", + "description": "To resolve errors, you can:\n\n* Retry certain saved objects\n* Overwrite specific saved objects\n* Change references to different saved objects\n\nThis functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.\n", "tags": [ "saved objects" ], @@ -1210,7 +1210,8 @@ "apiKeyAuth": { "type": "apiKey", "in": "header", - "name": "ApiKey" + "name": "Authorization", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" } }, "examples": { diff --git a/packages/core/saved-objects/docs/openapi/bundled.yaml b/packages/core/saved-objects/docs/openapi/bundled.yaml index 3e07633a5107b..a12e326ccdbe4 100644 --- a/packages/core/saved-objects/docs/openapi/bundled.yaml +++ b/packages/core/saved-objects/docs/openapi/bundled.yaml @@ -208,7 +208,7 @@ paths: responses: '200': description: | - Indicates a successful call. NOTE: This HTTP response code indicates that the bulk operation succeeded. Errors pertaining to individual objects will be returned in the response body. + Indicates a successful call. NOTE: This HTTP response code indicates that the bulk operation succeeded. Errors pertaining to individual objects will be returned in the response body. content: application/json: schema: @@ -239,7 +239,7 @@ paths: responses: '200': description: | - Indicates a successful call. NOTE: This HTTP response code indicates that the bulk operation succeeded. Errors pertaining to individual objects will be returned in the response body. + Indicates a successful call. NOTE: This HTTP response code indicates that the bulk operation succeeded. Errors pertaining to individual objects will be returned in the response body. content: application/json: schema: @@ -798,7 +798,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' examples: key_rotation_response: summary: Encryption key rotation using default parameters. diff --git a/packages/core/saved-objects/docs/openapi/entrypoint.yaml b/packages/core/saved-objects/docs/openapi/entrypoint.yaml index cfb8a93210a50..b4e58a6ef2171 100644 --- a/packages/core/saved-objects/docs/openapi/entrypoint.yaml +++ b/packages/core/saved-objects/docs/openapi/entrypoint.yaml @@ -49,7 +49,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' security: - basicAuth: [] - - apiKeyAuth: [] \ No newline at end of file + - apiKeyAuth: [] diff --git a/packages/kbn-alerts-as-data-utils/src/field_maps/ecs_field_map.ts b/packages/kbn-alerts-as-data-utils/src/field_maps/ecs_field_map.ts index 3704edee72701..8aea9ca56e029 100644 --- a/packages/kbn-alerts-as-data-utils/src/field_maps/ecs_field_map.ts +++ b/packages/kbn-alerts-as-data-utils/src/field_maps/ecs_field_map.ts @@ -11,9 +11,64 @@ import { EcsMetadata, FieldMap } from './types'; const EXCLUDED_TYPES = ['constant_keyword']; +// ECS fields that have reached Stage 2 in the RFC process +// are included in the generated Yaml but are still considered +// experimental. Some are correctly marked as beta but most are +// not. + +// More about the RFC stages here: https://elastic.github.io/ecs/stages.html + +// The following RFCS are currently in stage 2: +// https://github.com/elastic/ecs/blob/main/rfcs/text/0027-faas-fields.md +// https://github.com/elastic/ecs/blob/main/rfcs/text/0035-tty-output.md +// https://github.com/elastic/ecs/blob/main/rfcs/text/0037-host-metrics.md +// https://github.com/elastic/ecs/blob/main/rfcs/text/0040-volume-device.md + +// Fields from these RFCs that are not already in the ECS component template +// as of 8.11 are manually identified as experimental below. +// The next time this list is updated, we should check the above list of RFCs to +// see if any have moved to Stage 3 and remove them from the list and check if +// there are any new stage 2 RFCs with fields we should exclude as experimental. + +const EXPERIMENTAL_FIELDS = [ + 'faas.trigger', // this was previously mapped as nested but changed to object + 'faas.trigger.request_id', + 'faas.trigger.type', + 'host.cpu.system.norm.pct', + 'host.cpu.user.norm.pct', + 'host.fsstats.total_size.total', + 'host.fsstats.total_size.used', + 'host.fsstats.total_size.used.pct', + 'host.load.norm.1', + 'host.load.norm.5', + 'host.load.norm.15', + 'host.memory.actual.used.bytes', + 'host.memory.actual.used.pct', + 'host.memory.total', + 'process.io.bytes', + 'volume.bus_type', + 'volume.default_access', + 'volume.device_name', + 'volume.device_type', + 'volume.dos_name', + 'volume.file_system_type', + 'volume.mount_name', + 'volume.nt_name', + 'volume.product_id', + 'volume.product_name', + 'volume.removable', + 'volume.serial_number', + 'volume.size', + 'volume.vendor_id', + 'volume.vendor_name', + 'volume.writable', +]; + export const ecsFieldMap: FieldMap = Object.fromEntries( Object.entries(EcsFlat) - .filter(([_, value]) => !EXCLUDED_TYPES.includes(value.type)) + .filter( + ([key, value]) => !EXCLUDED_TYPES.includes(value.type) && !EXPERIMENTAL_FIELDS.includes(key) + ) .map(([key, _]) => { const value: EcsMetadata = EcsFlat[key as keyof typeof EcsFlat]; return [ diff --git a/packages/kbn-alerts-as-data-utils/src/schemas/generated/ecs_schema.ts b/packages/kbn-alerts-as-data-utils/src/schemas/generated/ecs_schema.ts index a3d3ef6f0a8a7..b3bc0eb161720 100644 --- a/packages/kbn-alerts-as-data-utils/src/schemas/generated/ecs_schema.ts +++ b/packages/kbn-alerts-as-data-utils/src/schemas/generated/ecs_schema.ts @@ -308,7 +308,6 @@ const EcsOptional = rt.partial({ 'faas.execution': schemaString, 'faas.id': schemaString, 'faas.name': schemaString, - 'faas.trigger': schemaUnknown, 'faas.version': schemaString, 'file.accessed': schemaDate, 'file.attributes': schemaStringArray, diff --git a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts index 8a1476cd58277..3453bee1d7369 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts @@ -22,6 +22,7 @@ export type LogDocument = Fields & 'log.level'?: string; 'host.name'?: string; 'trace.id'?: string; + 'agent.id'?: string; 'agent.name'?: string; 'orchestrator.cluster.name'?: string; 'orchestrator.cluster.id'?: string; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/trace_with_orphan_items.ts b/packages/kbn-apm-synthtrace/src/scenarios/trace_with_orphan_items.ts new file mode 100644 index 0000000000000..ca853f9e73549 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/trace_with_orphan_items.ts @@ -0,0 +1,153 @@ +/* + * Copyright 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 { apm, ApmFields, httpExitSpan, Serializable } from '@kbn/apm-synthtrace-client'; +import { Readable } from 'stream'; +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 scenario: Scenario = async (runOptions: RunOptions) => { + return { + generate: ({ range, clients: { apmEsClient } }) => { + const transactionName = 'trace with orphans'; + const successfulTimestamps = range.interval('1s').rate(3); + + const synthRum = apm + .service({ name: 'synth-rum', environment: ENVIRONMENT, agentName: 'rum-js' }) + .instance('my-instance'); + const synthNode = apm + .service({ name: 'synth-node', environment: ENVIRONMENT, agentName: 'nodejs' }) + .instance('my-instance'); + const synthGo = apm + .service({ name: 'synth-go', environment: ENVIRONMENT, agentName: 'go' }) + .instance('my-instance'); + + const traces = successfulTimestamps.generator((timestamp) => { + // synth-rum + return synthGo + .transaction({ transactionName }) + .duration(400) + .timestamp(timestamp) + .children( + // synth-rum -> synth-node + synthRum + .span( + httpExitSpan({ + spanName: 'GET /api/products/top', + destinationUrl: 'http://synth-node:3000', + }) + ) + .duration(300) + .timestamp(timestamp) + .children( + synthRum + .transaction({ transactionName: 'Child Transaction' }) + .timestamp(timestamp) + .duration(200) + .children( + synthGo + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .timestamp(timestamp) + .duration(100) + .success() + ), + // synth-node + synthNode + .transaction({ transactionName: 'Initial transaction in synth-node' }) + .duration(300) + .timestamp(timestamp) + .children( + synthNode + // synth-node -> synth-go + .span( + httpExitSpan({ + spanName: 'GET synth-go:3000', + destinationUrl: 'http://synth-go:3000', + }) + ) + .timestamp(timestamp) + .duration(400) + + .children( + // synth-go + synthGo + .transaction({ transactionName: 'Child Transaction' }) + .timestamp(timestamp) + .duration(200) + .children( + synthGo + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .timestamp(timestamp) + .duration(100) + .success(), + synthGo + .span({ spanName: 'custom_new_operation', spanType: 'custom' }) + .timestamp(timestamp) + .duration(100) + .success() + ) + ) + ) + ) + ); + }); + + const successfulTraceEvents = Array.from( + successfulTimestamps.generator((timestamp) => + synthNode + .transaction({ transactionName: 'successful trace' }) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + synthNode + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .duration(1000) + .success() + .destination('elasticsearch') + .timestamp(timestamp), + synthNode + .span({ spanName: 'custom_operation', spanType: 'custom' }) + .duration(100) + .success() + .timestamp(timestamp) + ) + ) + ); + + const unserialized = Array.from(traces); + + const serialized = unserialized + .flatMap((event) => event.serialize()) + .filter((trace) => trace['transaction.name'] !== 'Child Transaction'); + + const unserializedChanged = serialized.map((event) => ({ + fields: event, + serialize: () => { + return [event]; + }, + })) as Array>; + + return withClient( + apmEsClient, + Readable.from([...unserializedChanged, ...successfulTraceEvents]) + ); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-calculate-auto/README.md b/packages/kbn-calculate-auto/README.md new file mode 100644 index 0000000000000..4964f65ef1818 --- /dev/null +++ b/packages/kbn-calculate-auto/README.md @@ -0,0 +1,3 @@ +# @kbn/calculate-auto + +Empty package generated by @kbn/generate diff --git a/packages/kbn-subscription-tracking/index.ts b/packages/kbn-calculate-auto/index.ts similarity index 65% rename from packages/kbn-subscription-tracking/index.ts rename to packages/kbn-calculate-auto/index.ts index de17c595918d5..fb114b4bb315e 100644 --- a/packages/kbn-subscription-tracking/index.ts +++ b/packages/kbn-calculate-auto/index.ts @@ -6,12 +6,4 @@ * Side Public License, v 1. */ -export * from './src/subscription_elements'; - -export { - SubscriptionTrackingContext, - SubscriptionTrackingProvider, - registerEvents, -} from './src/services'; - -export * from './types'; +export { calculateAuto } from './src/calculate_auto'; diff --git a/packages/kbn-calculate-auto/jest.config.js b/packages/kbn-calculate-auto/jest.config.js new file mode 100644 index 0000000000000..fa25db97a3a43 --- /dev/null +++ b/packages/kbn-calculate-auto/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../..', + roots: ['/packages/kbn-calculate-auto'], +}; diff --git a/packages/kbn-calculate-auto/kibana.jsonc b/packages/kbn-calculate-auto/kibana.jsonc new file mode 100644 index 0000000000000..2ce6c776f1a69 --- /dev/null +++ b/packages/kbn-calculate-auto/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/calculate-auto", + "owner": "@elastic/obs-ux-management-team" +} diff --git a/packages/kbn-subscription-tracking/package.json b/packages/kbn-calculate-auto/package.json similarity index 69% rename from packages/kbn-subscription-tracking/package.json rename to packages/kbn-calculate-auto/package.json index e9dd11b56c81b..71de96101c616 100644 --- a/packages/kbn-subscription-tracking/package.json +++ b/packages/kbn-calculate-auto/package.json @@ -1,5 +1,5 @@ { - "name": "@kbn/subscription-tracking", + "name": "@kbn/calculate-auto", "private": true, "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0" diff --git a/packages/kbn-calculate-auto/src/calculate_auto.test.ts b/packages/kbn-calculate-auto/src/calculate_auto.test.ts new file mode 100644 index 0000000000000..1ef166bae4fcf --- /dev/null +++ b/packages/kbn-calculate-auto/src/calculate_auto.test.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { calculateAuto } from './calculate_auto'; +import moment, { isDuration } from 'moment'; + +describe('calculateAuto.near(bucket, duration)', () => { + it('should calculate the bucket size for 15 minutes', () => { + const bucketSizeDuration = calculateAuto.near(100, moment.duration(15, 'minutes')); + expect(bucketSizeDuration).not.toBeUndefined(); + expect(isDuration(bucketSizeDuration)).toBeTruthy(); + expect(bucketSizeDuration!.asSeconds()).toBe(10); + }); + it('should calculate the bucket size for an hour', () => { + const bucketSizeDuration = calculateAuto.near(100, moment.duration(1, 'hour')); + expect(bucketSizeDuration).not.toBeUndefined(); + expect(isDuration(bucketSizeDuration)).toBeTruthy(); + expect(bucketSizeDuration!.asSeconds()).toBe(30); + }); + it('should calculate the bucket size for a day', () => { + const bucketSizeDuration = calculateAuto.near(100, moment.duration(1, 'day')); + expect(bucketSizeDuration).not.toBeUndefined(); + expect(isDuration(bucketSizeDuration)).toBeTruthy(); + expect(bucketSizeDuration!.asMinutes()).toBe(10); + }); +}); diff --git a/packages/kbn-calculate-auto/src/calculate_auto.ts b/packages/kbn-calculate-auto/src/calculate_auto.ts new file mode 100644 index 0000000000000..a955765ff15f4 --- /dev/null +++ b/packages/kbn-calculate-auto/src/calculate_auto.ts @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import moment, { isDuration, Duration } from 'moment'; +const d = moment.duration; + +const roundingRules = [ + [d(500, 'ms'), d(100, 'ms')], + [d(5, 'second'), d(1, 'second')], + [d(7.5, 'second'), d(5, 'second')], + [d(15, 'second'), d(10, 'second')], + [d(45, 'second'), d(30, 'second')], + [d(3, 'minute'), d(1, 'minute')], + [d(9, 'minute'), d(5, 'minute')], + [d(20, 'minute'), d(10, 'minute')], + [d(45, 'minute'), d(30, 'minute')], + [d(2, 'hour'), d(1, 'hour')], + [d(6, 'hour'), d(3, 'hour')], + [d(24, 'hour'), d(12, 'hour')], + [d(1, 'week'), d(1, 'd')], + [d(3, 'week'), d(1, 'week')], + [d(1, 'year'), d(1, 'month')], + [d(Infinity, 'year'), d(1, 'year')], +]; + +const reverseRoundingRules = [...roundingRules].reverse(); +type CheckFunction = (bound: Duration, interval: Duration, target: number) => Duration | undefined; + +function findRule(rules: Duration[][], check: CheckFunction, last?: boolean) { + function pickInterval(buckets: number, duration: Duration) { + const target = duration.asMilliseconds() / buckets; + let lastResult = null; + + for (const [end, start] of rules) { + const result = check(end, start, target); + + if (result == null) { + if (!last) continue; + if (lastResult) return lastResult; + break; + } + + if (!last) return result; + lastResult = result; + } + + // fallback to just a number of milliseconds, ensure ms is >= 1 + const ms = Math.max(Math.floor(target), 1); + return moment.duration(ms, 'ms'); + } + + return (buckets: number, duration: Duration) => { + const interval = pickInterval(buckets, duration); + if (isDuration(interval)) return interval; + }; +} + +export const calculateAuto = { + near: findRule( + reverseRoundingRules, + function near(bound, interval, target) { + if (isDuration(bound) && bound.asMilliseconds() > target) return interval; + }, + true + ), + lessThan: findRule( + reverseRoundingRules, + function lessThan(_bound: Duration, interval: Duration, target: number) { + if (interval.asMilliseconds() < target) return interval; + } + ), + atLeast: findRule( + reverseRoundingRules, + function atLeast(_bound: Duration, interval: Duration, target: number) { + if (interval.asMilliseconds() <= target) return interval; + } + ), +}; diff --git a/packages/kbn-calculate-auto/tsconfig.json b/packages/kbn-calculate-auto/tsconfig.json new file mode 100644 index 0000000000000..2f9ddddbeea23 --- /dev/null +++ b/packages/kbn-calculate-auto/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [] +} diff --git a/packages/kbn-cell-actions/constants.ts b/packages/kbn-cell-actions/constants.ts new file mode 100644 index 0000000000000..c78869a471cb0 --- /dev/null +++ b/packages/kbn-cell-actions/constants.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './src/constants'; diff --git a/packages/kbn-cell-actions/src/index.ts b/packages/kbn-cell-actions/src/index.ts index dfd1d83937c0f..4e478baec441f 100644 --- a/packages/kbn-cell-actions/src/index.ts +++ b/packages/kbn-cell-actions/src/index.ts @@ -20,7 +20,7 @@ export type { export type { UseDataGridColumnsCellActions, UseDataGridColumnsCellActionsProps } from './hooks'; // Constants -export { CellActionsMode, FILTER_CELL_ACTION_TYPE, COPY_CELL_ACTION_TYPE } from './constants'; +export { CellActionsMode } from './constants'; // Components and hooks export { CellActionsProvider } from './context'; diff --git a/packages/kbn-config/src/config_service.test.ts b/packages/kbn-config/src/config_service.test.ts index 434534f6d888a..b03d407c2fcc0 100644 --- a/packages/kbn-config/src/config_service.test.ts +++ b/packages/kbn-config/src/config_service.test.ts @@ -131,6 +131,23 @@ test("does not push new configs when reloading if config at path hasn't changed" expect(valuesReceived).toEqual(['value']); }); +test("does push new configs when reloading when config at path hasn't changed if ignoreUnchanged is false", async () => { + const rawConfig$ = new BehaviorSubject>({ key: 'value' }); + const rawConfigProvider = createRawConfigServiceMock({ rawConfig$ }); + + const configService = new ConfigService(rawConfigProvider, defaultEnv, logger); + await configService.setSchema('key', schema.string()); + + const valuesReceived: any[] = []; + configService.atPath('key', { ignoreUnchanged: false }).subscribe((value) => { + valuesReceived.push(value); + }); + + rawConfig$.next({ key: 'value' }); + + expect(valuesReceived).toEqual(['value', 'value']); +}); + test('pushes new config when reloading and config at path has changed', async () => { const rawConfig$ = new BehaviorSubject>({ key: 'value' }); const rawConfigProvider = createRawConfigServiceMock({ rawConfig$ }); diff --git a/packages/kbn-config/src/config_service.ts b/packages/kbn-config/src/config_service.ts index 0026876f70b4d..e1c4ccfb55fbe 100644 --- a/packages/kbn-config/src/config_service.ts +++ b/packages/kbn-config/src/config_service.ts @@ -10,7 +10,7 @@ import type { PublicMethodsOf } from '@kbn/utility-types'; import { SchemaTypeError, Type, ValidationError } from '@kbn/config-schema'; import { cloneDeep, isEqual, merge } from 'lodash'; import { set } from '@kbn/safer-lodash-set'; -import { BehaviorSubject, combineLatest, firstValueFrom, Observable } from 'rxjs'; +import { BehaviorSubject, combineLatest, firstValueFrom, Observable, identity } from 'rxjs'; import { distinctUntilChanged, first, map, shareReplay, tap } from 'rxjs/operators'; import { Logger, LoggerFactory } from '@kbn/logging'; import { getDocLinks, DocLinks } from '@kbn/doc-links'; @@ -159,9 +159,13 @@ export class ConfigService { * against its registered schema. * * @param path - The path to the desired subset of the config. + * @param ignoreUnchanged - If true (default), will not emit if the config at path did not change. */ - public atPath(path: ConfigPath) { - return this.getValidatedConfigAtPath$(path) as Observable; + public atPath( + path: ConfigPath, + { ignoreUnchanged = true }: { ignoreUnchanged?: boolean } = {} + ) { + return this.getValidatedConfigAtPath$(path, { ignoreUnchanged }) as Observable; } /** @@ -310,10 +314,13 @@ export class ConfigService { ); } - private getValidatedConfigAtPath$(path: ConfigPath) { + private getValidatedConfigAtPath$( + path: ConfigPath, + { ignoreUnchanged = true }: { ignoreUnchanged?: boolean } = {} + ) { return this.config$.pipe( map((config) => config.get(path)), - distinctUntilChanged(isEqual), + ignoreUnchanged ? distinctUntilChanged(isEqual) : identity, map((config) => this.validateAtPath(path, config)) ); } diff --git a/packages/kbn-custom-icons/.storybook/main.js b/packages/kbn-custom-icons/.storybook/main.js new file mode 100644 index 0000000000000..8dc3c5d1518f4 --- /dev/null +++ b/packages/kbn-custom-icons/.storybook/main.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = require('@kbn/storybook').defaultConfig; diff --git a/packages/kbn-custom-icons/README.md b/packages/kbn-custom-icons/README.md new file mode 100644 index 0000000000000..ec48e8b8558cb --- /dev/null +++ b/packages/kbn-custom-icons/README.md @@ -0,0 +1,29 @@ +# @kbn/custom-icons + +A utility package, `@kbn/custom-icons`, that provides components for rendering icons related to Elastic Agents, Cloud Providers and more. + +## Components + +### `` + +```jsx + +``` + +This component renders an icon corresponding to the specified Elastic Agent name (`agentName`). + +#### Props + +- **`agentName`**: The name of the Elastic Agent for which the icon should be rendered. + +### `` + +```jsx + +``` + +This component renders an icon associated with the specified Cloud Provider (`cloudProvider`). + +#### Props + +- **`cloudProvider`**: The name of the Cloud Provider for which the icon should be rendered. diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/android.svg b/packages/kbn-custom-icons/assets/android.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/android.svg rename to packages/kbn-custom-icons/assets/android.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/cpp.svg b/packages/kbn-custom-icons/assets/cpp.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/cpp.svg rename to packages/kbn-custom-icons/assets/cpp.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/cpp_dark.svg b/packages/kbn-custom-icons/assets/cpp_dark.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/cpp_dark.svg rename to packages/kbn-custom-icons/assets/cpp_dark.svg diff --git a/packages/kbn-custom-icons/assets/default.svg b/packages/kbn-custom-icons/assets/default.svg new file mode 100644 index 0000000000000..08bc5331e083b --- /dev/null +++ b/packages/kbn-custom-icons/assets/default.svg @@ -0,0 +1,3 @@ + + + diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/dot_net.svg b/packages/kbn-custom-icons/assets/dot_net.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/dot_net.svg rename to packages/kbn-custom-icons/assets/dot_net.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/erlang.svg b/packages/kbn-custom-icons/assets/erlang.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/erlang.svg rename to packages/kbn-custom-icons/assets/erlang.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/erlang_dark.svg b/packages/kbn-custom-icons/assets/erlang_dark.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/erlang_dark.svg rename to packages/kbn-custom-icons/assets/erlang_dark.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/functions.svg b/packages/kbn-custom-icons/assets/functions.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/functions.svg rename to packages/kbn-custom-icons/assets/functions.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/go.svg b/packages/kbn-custom-icons/assets/go.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/go.svg rename to packages/kbn-custom-icons/assets/go.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/ios.svg b/packages/kbn-custom-icons/assets/ios.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/ios.svg rename to packages/kbn-custom-icons/assets/ios.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/ios_dark.svg b/packages/kbn-custom-icons/assets/ios_dark.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/ios_dark.svg rename to packages/kbn-custom-icons/assets/ios_dark.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/java.svg b/packages/kbn-custom-icons/assets/java.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/java.svg rename to packages/kbn-custom-icons/assets/java.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/lambda.svg b/packages/kbn-custom-icons/assets/lambda.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/lambda.svg rename to packages/kbn-custom-icons/assets/lambda.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/nodejs.svg b/packages/kbn-custom-icons/assets/nodejs.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/nodejs.svg rename to packages/kbn-custom-icons/assets/nodejs.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/ocaml.svg b/packages/kbn-custom-icons/assets/ocaml.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/ocaml.svg rename to packages/kbn-custom-icons/assets/ocaml.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/opentelemetry.svg b/packages/kbn-custom-icons/assets/opentelemetry.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/opentelemetry.svg rename to packages/kbn-custom-icons/assets/opentelemetry.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/otel_default.svg b/packages/kbn-custom-icons/assets/otel_default.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/otel_default.svg rename to packages/kbn-custom-icons/assets/otel_default.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/php.svg b/packages/kbn-custom-icons/assets/php.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/php.svg rename to packages/kbn-custom-icons/assets/php.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/php_dark.svg b/packages/kbn-custom-icons/assets/php_dark.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/php_dark.svg rename to packages/kbn-custom-icons/assets/php_dark.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/python.svg b/packages/kbn-custom-icons/assets/python.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/python.svg rename to packages/kbn-custom-icons/assets/python.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/ruby.svg b/packages/kbn-custom-icons/assets/ruby.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/ruby.svg rename to packages/kbn-custom-icons/assets/ruby.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/rumjs.svg b/packages/kbn-custom-icons/assets/rumjs.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/rumjs.svg rename to packages/kbn-custom-icons/assets/rumjs.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/rumjs_dark.svg b/packages/kbn-custom-icons/assets/rumjs_dark.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/rumjs_dark.svg rename to packages/kbn-custom-icons/assets/rumjs_dark.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/rust.svg b/packages/kbn-custom-icons/assets/rust.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/rust.svg rename to packages/kbn-custom-icons/assets/rust.svg diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/icons/rust_dark.svg b/packages/kbn-custom-icons/assets/rust_dark.svg similarity index 100% rename from x-pack/plugins/apm/public/components/shared/agent_icon/icons/rust_dark.svg rename to packages/kbn-custom-icons/assets/rust_dark.svg diff --git a/packages/kbn-custom-icons/index.ts b/packages/kbn-custom-icons/index.ts new file mode 100644 index 0000000000000..d6bc468b66524 --- /dev/null +++ b/packages/kbn-custom-icons/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +export { getAgentIcon } from './src/components/agent_icon/get_agent_icon'; +export { getServerlessIcon } from './src/components/agent_icon/get_serverless_icon'; +export { AgentIcon } from './src/components/agent_icon'; +export type { AgentIconProps } from './src/components/agent_icon'; + +export { getCloudProviderIcon } from './src/components/cloud_provider_icon/get_cloud_provider_icon'; +export type { CloudProvider } from './src/components/cloud_provider_icon/get_cloud_provider_icon'; +export { CloudProviderIcon } from './src/components/cloud_provider_icon'; +export type { CloudProviderIconProps } from './src/components/cloud_provider_icon'; diff --git a/packages/kbn-subscription-tracking/jest.config.js b/packages/kbn-custom-icons/jest.config.js similarity index 87% rename from packages/kbn-subscription-tracking/jest.config.js rename to packages/kbn-custom-icons/jest.config.js index edc1839850dae..518564ce1dbbd 100644 --- a/packages/kbn-subscription-tracking/jest.config.js +++ b/packages/kbn-custom-icons/jest.config.js @@ -9,5 +9,5 @@ module.exports = { preset: '@kbn/test', rootDir: '../..', - roots: ['/packages/kbn-subscription-tracking'], + roots: ['/packages/kbn-custom-icons'], }; diff --git a/packages/kbn-custom-icons/kibana.jsonc b/packages/kbn-custom-icons/kibana.jsonc new file mode 100644 index 0000000000000..7bd9eaa57e871 --- /dev/null +++ b/packages/kbn-custom-icons/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/custom-icons", + "owner": "@elastic/obs-ux-logs-team" +} diff --git a/packages/kbn-custom-icons/package.json b/packages/kbn-custom-icons/package.json new file mode 100644 index 0000000000000..d6952600c0afd --- /dev/null +++ b/packages/kbn-custom-icons/package.json @@ -0,0 +1,7 @@ +{ + "name": "@kbn/custom-icons", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0", + "sideEffects": false +} \ No newline at end of file diff --git a/packages/kbn-custom-icons/src/components/agent_icon/agent_icon.stories.tsx b/packages/kbn-custom-icons/src/components/agent_icon/agent_icon.stories.tsx new file mode 100644 index 0000000000000..45ba59137a6c2 --- /dev/null +++ b/packages/kbn-custom-icons/src/components/agent_icon/agent_icon.stories.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { EuiCard, EuiFlexGroup, EuiFlexItem, EuiImage, EuiToolTip } from '@elastic/eui'; +import type { Story } from '@storybook/react'; +import React from 'react'; +import { AGENT_NAMES } from '@kbn/elastic-agent-utils'; +import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; +import { getAgentIcon } from './get_agent_icon'; +import { AgentIcon } from '.'; + +export default { + title: 'Custom Icons/AgentIcon', + component: AgentIcon, +}; + +export const List: Story = () => { + return ( + + + {AGENT_NAMES.map((agentName) => { + return ( + + + + + } + title={agentName} + description={ + + + + } + /> + + ); + })} + + + ); +}; diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/get_agent_icon.test.ts b/packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.test.ts similarity index 86% rename from x-pack/plugins/apm/public/components/shared/agent_icon/get_agent_icon.test.ts rename to packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.test.ts index aac5fc19ca37b..58dff1afb1095 100644 --- a/x-pack/plugins/apm/public/components/shared/agent_icon/get_agent_icon.test.ts +++ b/packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.test.ts @@ -1,8 +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. + * 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 { getAgentIconKey } from './get_agent_icon'; diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/get_agent_icon.ts b/packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.ts similarity index 53% rename from x-pack/plugins/apm/public/components/shared/agent_icon/get_agent_icon.ts rename to packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.ts index 04bc276dcfa65..7c37f1a86a056 100644 --- a/x-pack/plugins/apm/public/components/shared/agent_icon/get_agent_icon.ts +++ b/packages/kbn-custom-icons/src/components/agent_icon/get_agent_icon.ts @@ -1,40 +1,40 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { + isAndroidAgentName, isIosAgentName, - isRumAgentName, isJavaAgentName, - isAndroidAgentName, + isRumAgentName, + OpenTelemetryAgentName, OPEN_TELEMETRY_AGENT_NAMES, -} from '../../../../common/agent_name'; -import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; -import defaultIcon from '../span_icon/icons/default.svg'; -import cppIcon from './icons/cpp.svg'; -import darkCppIcon from './icons/cpp_dark.svg'; -import dotNetIcon from './icons/dot_net.svg'; -import erlangIcon from './icons/erlang.svg'; -import darkErlangIcon from './icons/erlang_dark.svg'; -import goIcon from './icons/go.svg'; -import iosIcon from './icons/ios.svg'; -import darkIosIcon from './icons/ios_dark.svg'; -import javaIcon from './icons/java.svg'; -import nodeJsIcon from './icons/nodejs.svg'; -import ocamlIcon from './icons/ocaml.svg'; -import openTelemetryIcon from './icons/otel_default.svg'; -import phpIcon from './icons/php.svg'; -import pythonIcon from './icons/python.svg'; -import rubyIcon from './icons/ruby.svg'; -import rumJsIcon from './icons/rumjs.svg'; -import darkPhpIcon from './icons/php_dark.svg'; -import darkRumJsIcon from './icons/rumjs_dark.svg'; -import rustIcon from './icons/rust.svg'; -import darkRustIcon from './icons/rust_dark.svg'; -import androidIcon from './icons/android.svg'; +} from '@kbn/elastic-agent-utils'; +import defaultIcon from '../../../assets/default.svg'; +import cppIcon from '../../../assets/cpp.svg'; +import darkCppIcon from '../../../assets/cpp_dark.svg'; +import dotNetIcon from '../../../assets/dot_net.svg'; +import erlangIcon from '../../../assets/erlang.svg'; +import darkErlangIcon from '../../../assets/erlang_dark.svg'; +import goIcon from '../../../assets/go.svg'; +import iosIcon from '../../../assets/ios.svg'; +import darkIosIcon from '../../../assets/ios_dark.svg'; +import javaIcon from '../../../assets/java.svg'; +import nodeJsIcon from '../../../assets/nodejs.svg'; +import ocamlIcon from '../../../assets/ocaml.svg'; +import openTelemetryIcon from '../../../assets/otel_default.svg'; +import phpIcon from '../../../assets/php.svg'; +import pythonIcon from '../../../assets/python.svg'; +import rubyIcon from '../../../assets/ruby.svg'; +import rumJsIcon from '../../../assets/rumjs.svg'; +import darkPhpIcon from '../../../assets/php_dark.svg'; +import darkRumJsIcon from '../../../assets/rumjs_dark.svg'; +import rustIcon from '../../../assets/rust.svg'; +import darkRustIcon from '../../../assets/rust_dark.svg'; +import androidIcon from '../../../assets/android.svg'; const agentIcons: { [key: string]: string } = { cpp: cppIcon, @@ -89,25 +89,19 @@ export function getAgentIconKey(agentName: string) { } // Remove "opentelemetry/" prefix - const agentNameWithoutPrefix = lowercasedAgentName.replace( - /^opentelemetry\//, - '' - ); + const agentNameWithoutPrefix = lowercasedAgentName.replace(/^opentelemetry\//, ''); if (Object.keys(agentIcons).includes(agentNameWithoutPrefix)) { return agentNameWithoutPrefix; } // OpenTelemetry-only agents - if (OPEN_TELEMETRY_AGENT_NAMES.includes(lowercasedAgentName as AgentName)) { + if (OPEN_TELEMETRY_AGENT_NAMES.includes(lowercasedAgentName as OpenTelemetryAgentName)) { return 'opentelemetry'; } } -export function getAgentIcon( - agentName: string | undefined, - isDarkMode: boolean -) { +export function getAgentIcon(agentName: string | undefined, isDarkMode: boolean = false) { const key = agentName && getAgentIconKey(agentName); if (!key) { return defaultIcon; diff --git a/packages/kbn-custom-icons/src/components/agent_icon/get_serverless_icon.ts b/packages/kbn-custom-icons/src/components/agent_icon/get_serverless_icon.ts new file mode 100644 index 0000000000000..26268d3c7dce1 --- /dev/null +++ b/packages/kbn-custom-icons/src/components/agent_icon/get_serverless_icon.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { ServerlessType } from '@kbn/elastic-agent-utils'; +import defaultIcon from '../../../assets/default.svg'; +import lambdaIcon from '../../../assets/lambda.svg'; +import azureFunctionsIcon from '../../../assets/functions.svg'; + +const serverlessIcons: Record = { + 'aws.lambda': lambdaIcon, + 'azure.functions': azureFunctionsIcon, +} as const; + +export function getServerlessIcon(serverlessType?: ServerlessType) { + if (!serverlessType) { + return defaultIcon; + } + return serverlessIcons[serverlessType] ?? defaultIcon; +} diff --git a/packages/kbn-custom-icons/src/components/agent_icon/index.tsx b/packages/kbn-custom-icons/src/components/agent_icon/index.tsx new file mode 100644 index 0000000000000..bd34aa7f3a32e --- /dev/null +++ b/packages/kbn-custom-icons/src/components/agent_icon/index.tsx @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { EuiIcon, EuiIconProps, useEuiTheme } from '@elastic/eui'; +import { AgentName } from '@kbn/elastic-agent-utils'; +import { getAgentIcon } from './get_agent_icon'; + +export interface AgentIconProps extends Omit { + agentName?: AgentName; +} + +export function AgentIcon({ agentName, size = 'l', ...props }: AgentIconProps) { + const theme = useEuiTheme(); + const icon = getAgentIcon(agentName, theme.colorMode === 'DARK'); + + return ; +} diff --git a/packages/kbn-custom-icons/src/components/cloud_provider_icon/cloud_provider_icon.stories.tsx b/packages/kbn-custom-icons/src/components/cloud_provider_icon/cloud_provider_icon.stories.tsx new file mode 100644 index 0000000000000..e84e865fb55fd --- /dev/null +++ b/packages/kbn-custom-icons/src/components/cloud_provider_icon/cloud_provider_icon.stories.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { EuiCard, EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import type { Story } from '@storybook/react'; +import React from 'react'; +import { CloudProviderIcon } from '.'; +import { CloudProvider } from './get_cloud_provider_icon'; + +export default { + title: 'Custom Icons/CloudProviderIcon', + component: CloudProviderIcon, +}; + +const providers: CloudProvider[] = ['gcp', 'aws', 'azure', 'unknownProvider']; + +export const List: Story = () => { + return ( + + {providers.map((cloudProvider) => { + return ( + + + + + } + /> + + ); + })} + + ); +}; diff --git a/packages/kbn-custom-icons/src/components/cloud_provider_icon/get_cloud_provider_icon.ts b/packages/kbn-custom-icons/src/components/cloud_provider_icon/get_cloud_provider_icon.ts new file mode 100644 index 0000000000000..7c4bcd2ec3f7c --- /dev/null +++ b/packages/kbn-custom-icons/src/components/cloud_provider_icon/get_cloud_provider_icon.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +const CLOUD_PROVIDER_ICONS = { + gcp: 'logoGCP', + aws: 'logoAWS', + azure: 'logoAzure', + unknownProvider: 'cloudSunny', +} as const; + +export type CloudProvider = keyof typeof CLOUD_PROVIDER_ICONS | null | undefined; + +export function getCloudProviderIcon(cloudProvider?: CloudProvider) { + if (cloudProvider === undefined || cloudProvider === null) { + return CLOUD_PROVIDER_ICONS.unknownProvider; + } + + return CLOUD_PROVIDER_ICONS[cloudProvider]; +} diff --git a/packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx b/packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx new file mode 100644 index 0000000000000..bf90704e4f644 --- /dev/null +++ b/packages/kbn-custom-icons/src/components/cloud_provider_icon/index.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { EuiIcon, EuiIconProps } from '@elastic/eui'; +import { CloudProvider, getCloudProviderIcon } from './get_cloud_provider_icon'; + +export interface CloudProviderIconProps extends Omit { + cloudProvider?: CloudProvider; +} + +export function CloudProviderIcon({ cloudProvider, ...props }: CloudProviderIconProps) { + const computedProps: Pick = { + type: getCloudProviderIcon(cloudProvider), + }; + + if (cloudProvider) computedProps.title = cloudProvider; + + return ; +} diff --git a/packages/kbn-custom-icons/tsconfig.json b/packages/kbn-custom-icons/tsconfig.json new file mode 100644 index 0000000000000..5cd845d4948c6 --- /dev/null +++ b/packages/kbn-custom-icons/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react", + "@kbn/ambient-ui-types" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/elastic-agent-utils", + "@kbn/kibana-react-plugin" + ] +} diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index afc8252e7e13e..ffc6a0de28f2c 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -770,6 +770,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { installAndUninstallIntegrationAssets: `${FLEET_DOCS}install-uninstall-integration-assets.html`, elasticAgentInputConfiguration: `${FLEET_DOCS}elastic-agent-input-configuration.html`, policySecrets: `${FLEET_DOCS}agent-policy.html#agent-policy-secret-values`, + remoteESOoutput: `${FLEET_DOCS}monitor-elastic-agent.html#external-elasticsearch-monitoring`, }, ecs: { guide: `${ELASTIC_WEBSITE_URL}guide/en/ecs/current/index.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 5e4202dd7fa45..7afa37539eb86 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -528,6 +528,7 @@ export interface DocLinks { installAndUninstallIntegrationAssets: string; elasticAgentInputConfiguration: string; policySecrets: string; + remoteESOoutput: string; }>; readonly ecs: { readonly guide: string; diff --git a/packages/kbn-elastic-agent-utils/README.md b/packages/kbn-elastic-agent-utils/README.md new file mode 100644 index 0000000000000..f5b99bf1b1594 --- /dev/null +++ b/packages/kbn-elastic-agent-utils/README.md @@ -0,0 +1,141 @@ +# @kbn/elastic-agent-utils + +A utility package providing functions for working with Elastic Agents. This package focuses on agent names used in various contexts, such as OpenTelemetry, Java, Rum (Real User Monitoring), Mobile, JRuby, and Serverless environments. + +## Functions + +- **`isOpenTelemetryAgentName`** + + ```typescript + export function isOpenTelemetryAgentName(agentName: string): agentName is OpenTelemetryAgentName; + ``` + + Check if the provided agent name is part of the OpenTelemetry agents. + +- **`isJavaAgentName`** + + ```typescript + export function isJavaAgentName(agentName?: string): agentName is JavaAgentName; + ``` + + Check if the provided agent name is part of the Java agents. + +- **`isRumAgentName`** + + ```typescript + export function isRumAgentName(agentName?: string): agentName is RumAgentName; + ``` + + Check if the provided agent name is part of the Rum (Real User Monitoring) agents. + +- **`isMobileAgentName`** + + ```typescript + export function isMobileAgentName(agentName?: string): boolean; + ``` + + Check if the provided agent name is either an iOS or Android agent. + +- **`isRumOrMobileAgentName`** + + ```typescript + export function isRumOrMobileAgentName(agentName?: string): boolean; + ``` + + Check if the provided agent name is either a Rum agent or a Mobile agent. + +- **`isIosAgentName`** + + ```typescript + export function isIosAgentName(agentName?: string): boolean; + ``` + + Check if the provided agent name is "ios/swift." + +- **`isAndroidAgentName`** + + ```typescript + export function isAndroidAgentName(agentName?: string): boolean; + ``` + + Check if the provided agent name is "android/java." + +- **`isJRubyAgentName`** + + ```typescript + export function isJRubyAgentName(agentName?: string, runtimeName?: string): boolean; + ``` + + Check if the provided agent name is "ruby" and the runtime name is "jruby." + +- **`isServerlessAgentName`** + + ```typescript + export function isServerlessAgentName(serverlessType?: string): serverlessType is ServerlessType; + ``` + + Check if the provided serverless type is part of the supported Serverless environments. + +- **`isAWSLambdaAgentName`** + + ```typescript + export function isAWSLambdaAgentName(serverlessType?: string): serverlessType is ServerlessType; + ``` + + Check if the provided serverless type is "aws.lambda." + +- **`isAzureFunctionsAgentName`** + + ```typescript + export function isAzureFunctionsAgentName( + serverlessType?: string + ): serverlessType is ServerlessType; + ``` + + Check if the provided serverless type is "azure.functions." + +## Additional Exports + +The `@kbn/elastic-agent-utils` package also exports several constants and types for commonly used agent names. These exports can be utilized for broader categorizations and validations within your Elastic Agent projects. + +### Agent Names Constants + +- **`ELASTIC_AGENT_NAMES`** + + An array of Elastic Agent names, including various programming languages and platforms. + +- **`OPEN_TELEMETRY_AGENT_NAMES`** + + An array of OpenTelemetry agent names, covering different languages and platforms supporting OpenTelemetry. + +- **`JAVA_AGENT_NAMES`** + + An array of Java agent names, including both generic Java and OpenTelemetry Java agents. + +- **`RUM_AGENT_NAMES`** + + An array of Real User Monitoring (RUM) agent names, encompassing both base JavaScript and specific RUM agents. + +- **`SERVERLESS_TYPE`** + + An array of supported Serverless types, including AWS Lambda and Azure Functions. + +### Agent Name Types + +- **`ElasticAgentName`** +- **`OpenTelemetryAgentName`** +- **`JavaAgentName`** +- **`RumAgentName`** +- **`ServerlessType`** + + These types represent the available agent name categories, providing TypeScript type safety for agent name usage. + +### Combined Agent Names + +- **`AgentName`** + + A union type combining all agent name categories. + +- **`AGENT_NAMES`** + + An array containing all available agent names from the combined categories. diff --git a/packages/kbn-elastic-agent-utils/index.ts b/packages/kbn-elastic-agent-utils/index.ts new file mode 100644 index 0000000000000..62e7a6cd59688 --- /dev/null +++ b/packages/kbn-elastic-agent-utils/index.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +export { + isOpenTelemetryAgentName, + isJavaAgentName, + isRumAgentName, + isMobileAgentName, + isRumOrMobileAgentName, + isIosAgentName, + isAndroidAgentName, + isJRubyAgentName, + isServerlessAgentName, + isAWSLambdaAgentName, + isAzureFunctionsAgentName, +} from './src/agent_guards'; + +export { + ELASTIC_AGENT_NAMES, + OPEN_TELEMETRY_AGENT_NAMES, + JAVA_AGENT_NAMES, + RUM_AGENT_NAMES, + SERVERLESS_TYPE, + AGENT_NAMES, +} from './src/agent_names'; + +export type { + ElasticAgentName, + OpenTelemetryAgentName, + JavaAgentName, + RumAgentName, + ServerlessType, + AgentName, +} from './src/agent_names'; diff --git a/packages/kbn-elastic-agent-utils/jest.config.js b/packages/kbn-elastic-agent-utils/jest.config.js new file mode 100644 index 0000000000000..787036bd78da7 --- /dev/null +++ b/packages/kbn-elastic-agent-utils/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../..', + roots: ['/packages/kbn-elastic-agent-utils'], +}; diff --git a/packages/kbn-elastic-agent-utils/kibana.jsonc b/packages/kbn-elastic-agent-utils/kibana.jsonc new file mode 100644 index 0000000000000..cf8dc4c03f59d --- /dev/null +++ b/packages/kbn-elastic-agent-utils/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/elastic-agent-utils", + "owner": "@elastic/obs-ux-logs-team" +} diff --git a/packages/kbn-elastic-agent-utils/package.json b/packages/kbn-elastic-agent-utils/package.json new file mode 100644 index 0000000000000..df029eb7db2dc --- /dev/null +++ b/packages/kbn-elastic-agent-utils/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/elastic-agent-utils", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-elastic-agent-utils/src/agent_guards.test.ts b/packages/kbn-elastic-agent-utils/src/agent_guards.test.ts new file mode 100644 index 0000000000000..0de2ea225ce81 --- /dev/null +++ b/packages/kbn-elastic-agent-utils/src/agent_guards.test.ts @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + isAndroidAgentName, + isAWSLambdaAgentName, + isAzureFunctionsAgentName, + isIosAgentName, + isJavaAgentName, + isJRubyAgentName, + isMobileAgentName, + isOpenTelemetryAgentName, + isRumAgentName, + isRumOrMobileAgentName, + isServerlessAgentName, +} from './agent_guards'; + +describe('Agents guards', () => { + it('isOpenTelemetryAgentName should guard if the passed agent is an OpenTelemetry one.', () => { + expect(isOpenTelemetryAgentName('otlp')).toBe(true); + expect(isOpenTelemetryAgentName('not-an-agent')).toBe(false); + }); + + it('isJavaAgentName should guard if the passed agent is an Java one.', () => { + expect(isJavaAgentName('java')).toBe(true); + expect(isJavaAgentName('not-an-agent')).toBe(false); + }); + + it('isRumAgentName should guard if the passed agent is an Rum one.', () => { + expect(isRumAgentName('rum-js')).toBe(true); + expect(isRumAgentName('not-an-agent')).toBe(false); + }); + + it('isMobileAgentName should guard if the passed agent is an Mobile one.', () => { + expect(isMobileAgentName('ios/swift')).toBe(true); + expect(isMobileAgentName('android/java')).toBe(true); + expect(isMobileAgentName('not-an-agent')).toBe(false); + }); + + it('isRumOrMobileAgentName should guard if the passed agent is an RumOrMobile one.', () => { + expect(isRumOrMobileAgentName('ios/swift')).toBe(true); + expect(isRumOrMobileAgentName('android/java')).toBe(true); + expect(isRumOrMobileAgentName('rum-js')).toBe(true); + expect(isRumOrMobileAgentName('not-an-agent')).toBe(false); + }); + + it('isIosAgentName should guard if the passed agent is an Ios one.', () => { + expect(isIosAgentName('ios/swift')).toBe(true); + expect(isIosAgentName('not-an-agent')).toBe(false); + }); + + it('isAndroidAgentName should guard if the passed agent is an Android one.', () => { + expect(isAndroidAgentName('android/java')).toBe(true); + expect(isAndroidAgentName('not-an-agent')).toBe(false); + }); + + it('isJRubyAgentName should guard if the passed agent is an JRuby one.', () => { + expect(isJRubyAgentName('ruby', 'jruby')).toBe(true); + expect(isJRubyAgentName('ruby')).toBe(false); + expect(isJRubyAgentName('not-an-agent')).toBe(false); + }); + + it('isServerlessAgentName should guard if the passed agent is an Serverless one.', () => { + expect(isServerlessAgentName('aws.lambda')).toBe(true); + expect(isServerlessAgentName('azure.functions')).toBe(true); + expect(isServerlessAgentName('not-an-agent')).toBe(false); + }); + + it('isAWSLambdaAgentName should guard if the passed agent is an AWSLambda one.', () => { + expect(isAWSLambdaAgentName('aws.lambda')).toBe(true); + expect(isAWSLambdaAgentName('not-an-agent')).toBe(false); + }); + + it('isAzureFunctionsAgentName should guard if the passed agent is an AzureFunctions one.', () => { + expect(isAzureFunctionsAgentName('azure.functions')).toBe(true); + expect(isAzureFunctionsAgentName('not-an-agent')).toBe(false); + }); +}); diff --git a/packages/kbn-elastic-agent-utils/src/agent_guards.ts b/packages/kbn-elastic-agent-utils/src/agent_guards.ts new file mode 100644 index 0000000000000..6997cbd81c42c --- /dev/null +++ b/packages/kbn-elastic-agent-utils/src/agent_guards.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { JAVA_AGENT_NAMES, OPEN_TELEMETRY_AGENT_NAMES, RUM_AGENT_NAMES } from './agent_names'; + +import type { + JavaAgentName, + OpenTelemetryAgentName, + RumAgentName, + ServerlessType, +} from './agent_names'; + +export function isOpenTelemetryAgentName(agentName: string): agentName is OpenTelemetryAgentName { + return OPEN_TELEMETRY_AGENT_NAMES.includes(agentName as OpenTelemetryAgentName); +} + +export function isJavaAgentName(agentName?: string): agentName is JavaAgentName { + return JAVA_AGENT_NAMES.includes(agentName! as JavaAgentName); +} + +export function isRumAgentName(agentName?: string): agentName is RumAgentName { + return RUM_AGENT_NAMES.includes(agentName! as RumAgentName); +} + +export function isMobileAgentName(agentName?: string) { + return isIosAgentName(agentName) || isAndroidAgentName(agentName); +} + +export function isRumOrMobileAgentName(agentName?: string) { + return isRumAgentName(agentName) || isMobileAgentName(agentName); +} + +export function isIosAgentName(agentName?: string) { + return agentName?.toLowerCase() === 'ios/swift'; +} + +export function isAndroidAgentName(agentName?: string) { + const lowercased = agentName && agentName.toLowerCase(); + return lowercased === 'android/java'; +} + +export function isJRubyAgentName(agentName?: string, runtimeName?: string) { + return agentName === 'ruby' && runtimeName?.toLowerCase() === 'jruby'; +} + +export function isServerlessAgentName(serverlessType?: string): serverlessType is ServerlessType { + return isAWSLambdaAgentName(serverlessType) || isAzureFunctionsAgentName(serverlessType); +} + +export function isAWSLambdaAgentName(serverlessType?: string): serverlessType is ServerlessType { + return serverlessType === 'aws.lambda'; +} + +export function isAzureFunctionsAgentName( + serverlessType?: string +): serverlessType is ServerlessType { + return serverlessType === 'azure.functions'; +} diff --git a/packages/kbn-elastic-agent-utils/src/agent_names.ts b/packages/kbn-elastic-agent-utils/src/agent_names.ts new file mode 100644 index 0000000000000..f29160699a241 --- /dev/null +++ b/packages/kbn-elastic-agent-utils/src/agent_names.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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. + */ + +/** + * We cannot mark these arrays as const and derive their type + * because we need to be able to assign them as mutable entities for ES queries. + */ +export type ElasticAgentName = + | 'dotnet' + | 'go' + | 'iOS/swift' + | 'java' + | 'js-base' + | 'nodejs' + | 'php' + | 'python' + | 'ruby' + | 'rum-js' + | 'android/java'; +export const ELASTIC_AGENT_NAMES: ElasticAgentName[] = [ + 'dotnet', + 'go', + 'iOS/swift', + 'java', + 'js-base', + 'nodejs', + 'php', + 'python', + 'ruby', + 'rum-js', + 'android/java', +]; + +export type OpenTelemetryAgentName = + | 'otlp' + | 'opentelemetry/cpp' + | 'opentelemetry/dotnet' + | 'opentelemetry/erlang' + | 'opentelemetry/go' + | 'opentelemetry/java' + | 'opentelemetry/nodejs' + | 'opentelemetry/php' + | 'opentelemetry/python' + | 'opentelemetry/ruby' + | 'opentelemetry/rust' + | 'opentelemetry/swift' + | 'opentelemetry/webjs'; +export const OPEN_TELEMETRY_AGENT_NAMES: OpenTelemetryAgentName[] = [ + 'otlp', + 'opentelemetry/cpp', + 'opentelemetry/dotnet', + 'opentelemetry/erlang', + 'opentelemetry/go', + 'opentelemetry/java', + 'opentelemetry/nodejs', + 'opentelemetry/php', + 'opentelemetry/python', + 'opentelemetry/ruby', + 'opentelemetry/rust', + 'opentelemetry/swift', + 'opentelemetry/webjs', +]; + +export type JavaAgentName = 'java' | 'opentelemetry/java'; +export const JAVA_AGENT_NAMES: JavaAgentName[] = ['java', 'opentelemetry/java']; + +export type RumAgentName = 'js-base' | 'rum-js' | 'opentelemetry/webjs'; +export const RUM_AGENT_NAMES: RumAgentName[] = ['js-base', 'rum-js', 'opentelemetry/webjs']; + +export type ServerlessType = 'aws.lambda' | 'azure.functions'; +export const SERVERLESS_TYPE: ServerlessType[] = ['aws.lambda', 'azure.functions']; + +export type AgentName = ElasticAgentName | OpenTelemetryAgentName | JavaAgentName | RumAgentName; +export const AGENT_NAMES: AgentName[] = [ + ...ELASTIC_AGENT_NAMES, + ...OPEN_TELEMETRY_AGENT_NAMES, + ...JAVA_AGENT_NAMES, + ...RUM_AGENT_NAMES, +]; diff --git a/packages/kbn-elastic-agent-utils/tsconfig.json b/packages/kbn-elastic-agent-utils/tsconfig.json new file mode 100644 index 0000000000000..9754544771806 --- /dev/null +++ b/packages/kbn-elastic-agent-utils/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "target/**/*" + ] +} diff --git a/packages/kbn-es-query/index.ts b/packages/kbn-es-query/index.ts index a14724fc3a748..ac0a078e34d94 100644 --- a/packages/kbn-es-query/index.ts +++ b/packages/kbn-es-query/index.ts @@ -56,6 +56,7 @@ export { getIndexPatternFromSQLQuery, getIndexPatternFromESQLQuery, getLanguageDisplayName, + cleanupESQLQueryForLensSuggestions, } from './src/es_query'; export { diff --git a/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts b/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts index ca98864aab446..504e6a5c93d44 100644 --- a/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts +++ b/packages/kbn-es-query/src/es_query/es_aggregate_query.test.ts @@ -12,6 +12,7 @@ import { getAggregateQueryMode, getIndexPatternFromSQLQuery, getIndexPatternFromESQLQuery, + cleanupESQLQueryForLensSuggestions, } from './es_aggregate_query'; describe('sql query helpers', () => { @@ -115,4 +116,18 @@ describe('sql query helpers', () => { expect(idxPattern9).toBe('foo-1, foo-2'); }); }); + + describe('cleanupESQLQueryForLensSuggestions', () => { + it('should not remove anything if a drop command is not present', () => { + expect(cleanupESQLQueryForLensSuggestions('from a | eval b = 1')).toBe('from a | eval b = 1'); + }); + + it('should remove multiple drop statement if present', () => { + expect( + cleanupESQLQueryForLensSuggestions( + 'from a | drop @timestamp | drop a | drop b | keep c | drop d' + ) + ).toBe('from a | keep c '); + }); + }); }); diff --git a/packages/kbn-es-query/src/es_query/es_aggregate_query.ts b/packages/kbn-es-query/src/es_query/es_aggregate_query.ts index 27a5e790569c8..f746505896360 100644 --- a/packages/kbn-es-query/src/es_query/es_aggregate_query.ts +++ b/packages/kbn-es-query/src/es_query/es_aggregate_query.ts @@ -66,3 +66,8 @@ export function getIndexPatternFromESQLQuery(esql?: string): string { } return ''; } + +export function cleanupESQLQueryForLensSuggestions(esql?: string): string { + const pipes = (esql || '').split('|'); + return pipes.filter((statement) => !/DROP\s/i.test(statement)).join('|'); +} diff --git a/packages/kbn-es-query/src/es_query/index.ts b/packages/kbn-es-query/src/es_query/index.ts index 22141a52e93f5..18009145a432f 100644 --- a/packages/kbn-es-query/src/es_query/index.ts +++ b/packages/kbn-es-query/src/es_query/index.ts @@ -20,6 +20,7 @@ export { getIndexPatternFromSQLQuery, getLanguageDisplayName, getIndexPatternFromESQLQuery, + cleanupESQLQueryForLensSuggestions, } from './es_aggregate_query'; export { fromCombinedFilter } from './from_combined_filter'; export type { diff --git a/packages/kbn-es/src/cli_commands/serverless.ts b/packages/kbn-es/src/cli_commands/serverless.ts index 87a573a8810dd..0743cf2e7b5b6 100644 --- a/packages/kbn-es/src/cli_commands/serverless.ts +++ b/packages/kbn-es/src/cli_commands/serverless.ts @@ -38,6 +38,7 @@ export const serverless: Command = { --host Publish ES docker container on additional host IP --port The port to bind to on 127.0.0.1 [default: ${DEFAULT_PORT}] --ssl Enable HTTP SSL on the ES cluster + --kibanaUrl Fully qualified URL where Kibana is hosted (including base path). [default: https://localhost:5601/] --skipTeardown If this process exits, leave the ES cluster running in the background --waitForReady Wait for the ES cluster to be ready to serve requests --resources Overrides resources under ES 'config/' directory, which are by default @@ -73,7 +74,7 @@ export const serverless: Command = { files: 'F', }, - string: ['tag', 'image', 'basePath', 'resources', 'host'], + string: ['tag', 'image', 'basePath', 'resources', 'host', 'kibanaUrl'], boolean: ['clean', 'ssl', 'kill', 'background', 'skipTeardown', 'waitForReady'], default: defaults, diff --git a/packages/kbn-es/src/paths.ts b/packages/kbn-es/src/paths.ts index d9b4be41aa15b..4da4448573384 100644 --- a/packages/kbn-es/src/paths.ts +++ b/packages/kbn-es/src/paths.ts @@ -8,6 +8,7 @@ import Os from 'os'; import { resolve } from 'path'; +import { REPO_ROOT } from '@kbn/repo-info'; function maybeUseBat(bin: string) { return Os.platform().startsWith('win') ? `${bin}.bat` : bin; @@ -51,6 +52,8 @@ export const SERVERLESS_SECRETS_SSL_PATH = resolve( export const SERVERLESS_JWKS_PATH = resolve(__dirname, './serverless_resources/jwks.json'); +export const SERVERLESS_IDP_METADATA_PATH = resolve(REPO_ROOT, '.es', 'idp_metadata.xml'); + export const SERVERLESS_RESOURCES_PATHS = [ SERVERLESS_OPERATOR_USERS_PATH, SERVERLESS_ROLE_MAPPING_PATH, diff --git a/packages/kbn-es/src/serverless_resources/roles.yml b/packages/kbn-es/src/serverless_resources/roles.yml index 5f968ece56e3a..a98652d5b9311 100644 --- a/packages/kbn-es/src/serverless_resources/roles.yml +++ b/packages/kbn-es/src/serverless_resources/roles.yml @@ -210,6 +210,7 @@ t3_analyst: privileges: - read - write + - maintenance - names: - .lists* - .items* @@ -263,12 +264,16 @@ threat_intelligence_analyst: - endgame-* - filebeat-* - logs-* - - .lists* - - .items* - packetbeat-* - winlogbeat-* privileges: - read + - names: + - .lists* + - .items* + privileges: + - read + - write - names: - .alerts-security* - .siem-signals-* @@ -287,8 +292,7 @@ threat_intelligence_analyst: - application: "kibana-.kibana" privileges: - feature_ml.read - - feature_siem.read - - feature_siem.read_alerts + - feature_siem.all - feature_siem.endpoint_list_read - feature_siem.blocklist_all - feature_securitySolutionCases.all @@ -573,12 +577,12 @@ endpoint_operations_analyst: privileges: - read - write + - maintenance applications: - application: "kibana-.kibana" privileges: - feature_ml.read - feature_siem.all - - feature_siem.read_alerts - feature_siem.policy_management_all - feature_siem.endpoint_list_all - feature_siem.trusted_applications_all @@ -623,11 +627,15 @@ endpoint_policy_manager: - logs-* - packetbeat-* - winlogbeat-* + - risk-score.risk-score-* + privileges: + - read + - names: - .lists* - .items* - - risk-score.risk-score-* privileges: - read + - write - names: - .alerts-security* - .siem-signals-* diff --git a/packages/kbn-es/src/serverless_resources/security_roles.json b/packages/kbn-es/src/serverless_resources/security_roles.json index 5ac286a41c164..c4a06751e19b7 100644 --- a/packages/kbn-es/src/serverless_resources/security_roles.json +++ b/packages/kbn-es/src/serverless_resources/security_roles.json @@ -107,7 +107,7 @@ }, { "names": [".alerts-security*", ".siem-signals-*"], - "privileges": ["read", "write"] + "privileges": ["read", "write", "maintenance"] }, { "names": [".lists*", ".items*"], diff --git a/packages/kbn-es/src/utils/docker.test.ts b/packages/kbn-es/src/utils/docker.test.ts index 2d71a4e628e11..b574447a20508 100644 --- a/packages/kbn-es/src/utils/docker.test.ts +++ b/packages/kbn-es/src/utils/docker.test.ts @@ -32,15 +32,17 @@ import { ServerlessOptions, } from './docker'; import { ToolingLog, ToolingLogCollectingWriter } from '@kbn/tooling-log'; -import { ES_P12_PATH } from '@kbn/dev-utils'; +import { CA_CERT_PATH, ES_P12_PATH } from '@kbn/dev-utils'; import { SERVERLESS_CONFIG_PATH, SERVERLESS_RESOURCES_PATHS, SERVERLESS_SECRETS_PATH, SERVERLESS_JWKS_PATH, + SERVERLESS_IDP_METADATA_PATH, } from '../paths'; import * as waitClusterUtil from './wait_until_cluster_ready'; import * as waitForSecurityIndexUtil from './wait_for_security_index'; +import * as mockIdpPluginUtil from '@kbn/mock-idp-plugin/common'; jest.mock('execa'); const execa = jest.requireMock('execa'); @@ -58,6 +60,8 @@ jest.mock('./wait_for_security_index', () => ({ waitForSecurityIndex: jest.fn(), })); +jest.mock('@kbn/mock-idp-plugin/common'); + const log = new ToolingLog(); const logWriter = new ToolingLogCollectingWriter(); log.setWriters([logWriter]); @@ -69,6 +73,8 @@ const serverlessObjectStorePath = `${baseEsPath}/${serverlessDir}`; const waitUntilClusterReadyMock = jest.spyOn(waitClusterUtil, 'waitUntilClusterReady'); const waitForSecurityIndexMock = jest.spyOn(waitForSecurityIndexUtil, 'waitForSecurityIndex'); +const ensureSAMLRoleMappingMock = jest.spyOn(mockIdpPluginUtil, 'ensureSAMLRoleMapping'); +const createMockIdpMetadataMock = jest.spyOn(mockIdpPluginUtil, 'createMockIdpMetadata'); beforeEach(() => { jest.resetAllMocks(); @@ -423,6 +429,66 @@ describe('resolveEsArgs()', () => { ] `); }); + + test('should add SAML realm args when kibanaUrl and SSL are passed', () => { + const esArgs = resolveEsArgs([], { + ssl: true, + kibanaUrl: 'https://localhost:5601/', + }); + + expect(esArgs).toHaveLength(26); + expect(esArgs).toMatchInlineSnapshot(` + Array [ + "--env", + "xpack.security.http.ssl.enabled=true", + "--env", + "xpack.security.http.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elasticsearch.p12", + "--env", + "xpack.security.http.ssl.verification_mode=certificate", + "--env", + "xpack.security.authc.realms.saml.mock-idp.order=0", + "--env", + "xpack.security.authc.realms.saml.mock-idp.idp.metadata.path=/usr/share/elasticsearch/config/secrets/idp_metadata.xml", + "--env", + "xpack.security.authc.realms.saml.mock-idp.idp.entity_id=urn:mock-idp", + "--env", + "xpack.security.authc.realms.saml.mock-idp.sp.entity_id=https://localhost:5601", + "--env", + "xpack.security.authc.realms.saml.mock-idp.sp.acs=https://localhost:5601/api/security/saml/callback", + "--env", + "xpack.security.authc.realms.saml.mock-idp.sp.logout=https://localhost:5601/logout", + "--env", + "xpack.security.authc.realms.saml.mock-idp.attributes.principal=http://saml.elastic-cloud.com/attributes/principal", + "--env", + "xpack.security.authc.realms.saml.mock-idp.attributes.groups=http://saml.elastic-cloud.com/attributes/roles", + "--env", + "xpack.security.authc.realms.saml.mock-idp.attributes.name=http://saml.elastic-cloud.com/attributes/email", + "--env", + "xpack.security.authc.realms.saml.mock-idp.attributes.mail=http://saml.elastic-cloud.com/attributes/name", + ] + `); + }); + + test('should not add SAML realm args when security is disabled', () => { + const esArgs = resolveEsArgs([['xpack.security.enabled', 'false']], { + ssl: true, + kibanaUrl: 'https://localhost:5601/', + }); + + expect(esArgs).toHaveLength(8); + expect(esArgs).toMatchInlineSnapshot(` + Array [ + "--env", + "xpack.security.enabled=false", + "--env", + "xpack.security.http.ssl.enabled=true", + "--env", + "xpack.security.http.ssl.keystore.path=/usr/share/elasticsearch/config/certs/elasticsearch.p12", + "--env", + "xpack.security.http.ssl.verification_mode=certificate", + ] + `); + }); }); describe('setupServerlessVolumes()', () => { @@ -463,21 +529,29 @@ describe('setupServerlessVolumes()', () => { expect(existsSync(`${serverlessObjectStorePath}/cluster_state/lease`)).toBe(false); }); - test('should add SSL volumes when ssl is passed', async () => { + test('should add SSL and IDP metadata volumes when ssl and kibanaUrl are passed', async () => { mockFs(existingObjectStore); + createMockIdpMetadataMock.mockResolvedValue(''); - const volumeCmd = await setupServerlessVolumes(log, { basePath: baseEsPath, ssl: true }); + const volumeCmd = await setupServerlessVolumes(log, { + basePath: baseEsPath, + ssl: true, + kibanaUrl: 'https://localhost:5603/', + }); + + expect(createMockIdpMetadataMock).toHaveBeenCalledTimes(1); + expect(createMockIdpMetadataMock).toHaveBeenCalledWith('https://localhost:5603/'); const requiredPaths = [ `${baseEsPath}:/objectstore:z`, + SERVERLESS_IDP_METADATA_PATH, ES_P12_PATH, ...SERVERLESS_RESOURCES_PATHS, ]; const pathsNotIncludedInCmd = requiredPaths.filter( (path) => !volumeCmd.some((cmd) => cmd.includes(path)) ); - - expect(volumeCmd).toHaveLength(20); + expect(volumeCmd).toHaveLength(22); expect(pathsNotIncludedInCmd).toEqual([]); }); @@ -543,6 +617,7 @@ describe('runServerlessEsNode()', () => { describe('runServerlessCluster()', () => { test('should start 3 serverless nodes', async () => { + waitUntilClusterReadyMock.mockResolvedValue(); mockFs({ [baseEsPath]: {}, }); @@ -567,7 +642,27 @@ describe('runServerlessCluster()', () => { expect(waitUntilClusterReadyMock.mock.calls[0][0].readyTimeout).toEqual(undefined); }); + test(`should create SAML role mapping when ssl and kibanaUrl are passed`, async () => { + waitUntilClusterReadyMock.mockResolvedValue(); + mockFs({ + [CA_CERT_PATH]: '', + [baseEsPath]: {}, + }); + execa.mockImplementation(() => Promise.resolve({ stdout: '' })); + createMockIdpMetadataMock.mockResolvedValue(''); + + await runServerlessCluster(log, { + basePath: baseEsPath, + waitForReady: true, + ssl: true, + kibanaUrl: 'https://localhost:5601/', + }); + + expect(ensureSAMLRoleMappingMock).toHaveBeenCalledTimes(1); + }); + test(`should wait for the security index`, async () => { + waitUntilClusterReadyMock.mockResolvedValue(); waitForSecurityIndexMock.mockResolvedValue(); mockFs({ [baseEsPath]: {}, @@ -580,6 +675,7 @@ describe('runServerlessCluster()', () => { }); test(`should not wait for the security index when security is disabled`, async () => { + waitUntilClusterReadyMock.mockResolvedValue(); mockFs({ [baseEsPath]: {}, }); diff --git a/packages/kbn-es/src/utils/docker.ts b/packages/kbn-es/src/utils/docker.ts index 1c89339e1a567..73e5e1fc77288 100644 --- a/packages/kbn-es/src/utils/docker.ts +++ b/packages/kbn-es/src/utils/docker.ts @@ -14,12 +14,17 @@ import { Client, ClientOptions, HttpConnection } from '@elastic/elasticsearch'; import { ToolingLog } from '@kbn/tooling-log'; import { kibanaPackageJson as pkg, REPO_ROOT } from '@kbn/repo-info'; +import { CA_CERT_PATH, ES_P12_PASSWORD, ES_P12_PATH } from '@kbn/dev-utils'; import { - CA_CERT_PATH, - ES_P12_PASSWORD, - ES_P12_PATH, - kibanaDevServiceAccount, -} from '@kbn/dev-utils'; + MOCK_IDP_REALM_NAME, + MOCK_IDP_ENTITY_ID, + MOCK_IDP_ATTRIBUTE_PRINCIPAL, + MOCK_IDP_ATTRIBUTE_ROLES, + MOCK_IDP_ATTRIBUTE_EMAIL, + MOCK_IDP_ATTRIBUTE_NAME, + ensureSAMLRoleMapping, + createMockIdpMetadata, +} from '@kbn/mock-idp-plugin/common'; import { waitForSecurityIndex } from './wait_for_security_index'; import { createCliError } from '../errors'; @@ -28,6 +33,7 @@ import { SERVERLESS_RESOURCES_PATHS, SERVERLESS_SECRETS_PATH, SERVERLESS_JWKS_PATH, + SERVERLESS_IDP_METADATA_PATH, SERVERLESS_CONFIG_PATH, SERVERLESS_FILES_PATH, SERVERLESS_SECRETS_SSL_PATH, @@ -69,6 +75,8 @@ export interface ServerlessOptions extends EsClusterExecOptions, BaseOptions { background?: boolean; /** Wait for the ES cluster to be ready to serve requests */ waitForReady?: boolean; + /** Fully qualified URL where Kibana is hosted (including base path) */ + kibanaUrl?: string; /** * Resource file(s) to overwrite * (see list of files that can be overwritten under `packages/kbn-es/src/serverless_resources/users`) @@ -460,6 +468,54 @@ export function resolveEsArgs( esArgs.set('ELASTIC_PASSWORD', password); } + // Configure mock identify provider (ES only supports SAML when running in SSL mode) + if ( + ssl && + 'kibanaUrl' in options && + options.kibanaUrl && + esArgs.get('xpack.security.enabled') !== 'false' + ) { + const trimTrailingSlash = (url: string) => (url.endsWith('/') ? url.slice(0, -1) : url); + + esArgs.set(`xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.order`, '0'); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.idp.metadata.path`, + `${SERVERLESS_CONFIG_PATH}secrets/idp_metadata.xml` + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.idp.entity_id`, + MOCK_IDP_ENTITY_ID + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.sp.entity_id`, + trimTrailingSlash(options.kibanaUrl) + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.sp.acs`, + `${trimTrailingSlash(options.kibanaUrl)}/api/security/saml/callback` + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.sp.logout`, + `${trimTrailingSlash(options.kibanaUrl)}/logout` + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.principal`, + MOCK_IDP_ATTRIBUTE_PRINCIPAL + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.groups`, + MOCK_IDP_ATTRIBUTE_ROLES + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.name`, + MOCK_IDP_ATTRIBUTE_EMAIL + ); + esArgs.set( + `xpack.security.authc.realms.saml.${MOCK_IDP_REALM_NAME}.attributes.mail`, + MOCK_IDP_ATTRIBUTE_NAME + ); + } + return Array.from(esArgs).flatMap((e) => ['--env', e.join('=')]); } @@ -480,7 +536,7 @@ export function getDockerFileMountPath(hostPath: string) { * Setup local volumes for Serverless ES */ export async function setupServerlessVolumes(log: ToolingLog, options: ServerlessOptions) { - const { basePath, clean, ssl, files, resources } = options; + const { basePath, clean, ssl, kibanaUrl, files, resources } = options; const objectStorePath = resolve(basePath, 'stateless'); log.info(chalk.bold(`Checking for local serverless ES object store at ${objectStorePath}`)); @@ -551,6 +607,16 @@ export async function setupServerlessVolumes(log: ToolingLog, options: Serverles ); } + // Create and add meta data for mock identity provider + if (ssl && kibanaUrl) { + const metadata = await createMockIdpMetadata(kibanaUrl); + await Fsp.writeFile(SERVERLESS_IDP_METADATA_PATH, metadata); + volumeCmds.push( + '--volume', + `${SERVERLESS_IDP_METADATA_PATH}:${SERVERLESS_CONFIG_PATH}secrets/idp_metadata.xml:z` + ); + } + volumeCmds.push( ...getESp12Volume(), ...serverlessResources, @@ -559,7 +625,6 @@ export async function setupServerlessVolumes(log: ToolingLog, options: Serverles `${ ssl ? SERVERLESS_SECRETS_SSL_PATH : SERVERLESS_SECRETS_PATH }:${SERVERLESS_CONFIG_PATH}secrets/secrets.json:z`, - '--volume', `${SERVERLESS_JWKS_PATH}:${SERVERLESS_CONFIG_PATH}secrets/jwks.json:z` ); @@ -661,33 +726,52 @@ export async function runServerlessCluster(log: ToolingLog, options: ServerlessO process.on('SIGINT', () => teardownServerlessClusterSync(log, options)); } + const esNodeUrl = `${options.ssl ? 'https' : 'http'}://${portCmd[1].substring( + 0, + portCmd[1].lastIndexOf(':') + )}`; + + const client = getESClient({ + node: esNodeUrl, + auth: { + username: ELASTIC_SERVERLESS_SUPERUSER, + password: ELASTIC_SERVERLESS_SUPERUSER_PASSWORD, + }, + ...(options.ssl + ? { + tls: { + ca: [fs.readFileSync(CA_CERT_PATH)], + // NOTE: Even though we've added ca into the tls options, we are using 127.0.0.1 instead of localhost + // for the ip which is not validated. As such we are getting the error + // Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list: + // To work around that we are overriding the function checkServerIdentity too + checkServerIdentity: () => { + return undefined; + }, + }, + } + : {}), + }); + + const readyPromise = waitUntilClusterReady({ client, expectedStatus: 'green', log }).then( + async () => { + if (!options.ssl || !options.kibanaUrl) { + return; + } + + await ensureSAMLRoleMapping(client); + + log.success( + `Created role mapping for mock identity provider. You can now login using ${chalk.bold.cyan( + MOCK_IDP_REALM_NAME + )} realm` + ); + } + ); + if (options.waitForReady) { log.info('Waiting until ES is ready to serve requests...'); - - const esNodeUrl = `${options.ssl ? 'https' : 'http'}://${portCmd[1].substring( - 0, - portCmd[1].lastIndexOf(':') - )}`; - - const client = getESClient({ - node: esNodeUrl, - auth: { bearer: kibanaDevServiceAccount.token }, - ...(options.ssl - ? { - tls: { - ca: [fs.readFileSync(CA_CERT_PATH)], - // NOTE: Even though we've added ca into the tls options, we are using 127.0.0.1 instead of localhost - // for the ip which is not validated. As such we are getting the error - // Hostname/IP does not match certificate's altnames: IP: 127.0.0.1 is not in the cert's list: - // To work around that we are overriding the function checkServerIdentity too - checkServerIdentity: () => { - return undefined; - }, - }, - } - : {}), - }); - await waitUntilClusterReady({ client, expectedStatus: 'green', log }); + await readyPromise; if (!options.esArgs || !options.esArgs.includes('xpack.security.enabled=false')) { // If security is not disabled, make sure the security index exists before running the test to avoid flakiness await waitForSecurityIndex({ client, log }); diff --git a/packages/kbn-es/tsconfig.json b/packages/kbn-es/tsconfig.json index 75059c2ef69cd..b40ca33825562 100644 --- a/packages/kbn-es/tsconfig.json +++ b/packages/kbn-es/tsconfig.json @@ -3,13 +3,20 @@ "compilerOptions": { "outDir": "target/types" }, - "include": ["**/*.ts", "**/*.js", "**/*.json"], - "exclude": ["target/**/*"], + "include": [ + "**/*.ts", + "**/*.js", + "**/*.json" + ], + "exclude": [ + "target/**/*" + ], "kbn_references": [ "@kbn/tooling-log", "@kbn/dev-utils", "@kbn/dev-proc-runner", "@kbn/ci-stats-reporter", + "@kbn/mock-idp-plugin", "@kbn/jest-serializers", "@kbn/repo-info" ] diff --git a/packages/kbn-eslint-plugin-i18n/README.mdx b/packages/kbn-eslint-plugin-i18n/README.mdx index 174457477e81a..6b836eb8bb528 100644 --- a/packages/kbn-eslint-plugin-i18n/README.mdx +++ b/packages/kbn-eslint-plugin-i18n/README.mdx @@ -6,22 +6,88 @@ description: Custom ESLint rules to support translations in the Kibana repositor tags: ['kibana', 'dev', 'contributor', 'operations', 'eslint', 'i18n'] --- -`@kbn/eslint-plugin-i18n` is an ESLint plugin providing custom rules for validating JSXCode in the Kibana repo to make sure they are translated. +# Summary -Note: At the moment these rules only work for apps that are inside `/x-pack/plugins`. -If you want to enable this rule on code that is outside of this path, adjust `/helpers/get_i18n_identifier_from_file_path.ts`. +`@kbn/eslint-plugin-i18n` is an ESLint plugin providing custom ESLint rules to help validating code in the Kibana repo in the area of translations. + +The aim of this package is to help engineers type less and have a nicer experience. + +If a rule does not behave as you expect or you have an idea of how these rules can be improved, please reach out to the Observability Knowledge Team or the Kibana Operations team. + +# Rules ## `@kbn/i18n/strings_should_be_translated_with_i18n` -This rule warns engineers to translate their strings by using i18n.translate from the '@kbn/i18n' package. It provides an autofix that takes into account the context of the translatable string in the JSX tree to generate a translation ID. -It kicks in on JSXText elements and specific JSXAttributes (`label` and `aria-label`) which expect a translated value. +This rule warns engineers to translate their strings by using `i18n.translate` from the `@kbn/i18n` package. + +It provides an autofix that takes into account the context of the translatable string in the JSX tree to generate a translation ID. + +This rule kicks in on: + +- JSXText elements; +- specific JSXAttributes (`label` and `aria-label`) which expect a translated value. + +### Example + +This code: + +``` +// Filename: /x-pack/plugins/observability/public/my_component.tsx + +import React from 'react'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + return ( + You know, for search + ) +} +``` + +will be autofixed with: + +``` +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiText } from '@elastic/eui'; + +function MyComponent() { + return ( + + {i18n.translate('xpack.observability.myComponent.textLabel', { defaultMessage: 'You know, for search' } )} + + ) +} +``` + +If `i18n` has not been imported yet, the autofix will automatically add the import statement as well. + +### Exemptions and exceptions + +A JSXText element or JSXAttribute `label` or `aria-label` of which the value is: + +- wrapped in a `EuiCode` or `EuiBetaBadge` component, +- made up of non alpha characters such as `!@#$%^&*(){}` or numbers, +- wrapped in three backticks, + +are exempt from this rule. + +If this rule kicks in on a string value that you don't like, you can escape it by wrapping the string inside a JSXExpression: `{'my escaped value'}`. + +--- ## `@kbn/i18n/strings_should_be_translated_with_formatted_message` -This rule warns engineers to translate their strings by using `` from the '@kbn/i18n-react' package. It provides an autofix that takes into account the context of the translatable string in the JSX tree and to generate a translation ID. -It kicks in on JSXText elements and specific JSXAttributes (`label` and `aria-label`) which expect a translated value. +This rule warns engineers to translate their strings by using `` from the `@kbn/i18n-react` package. + +It provides an autofix that takes into account the context of the translatable string in the JSX tree and to generate a translation ID. + +This rule kicks in on: -## Exemptions and exceptions +- JSXText elements; +- specific JSXAttributes (`label` and `aria-label`) which expect a translated value. + +### Exemptions and exceptions A JSXText element or JSXAttribute `label` or `aria-label` of which the value is: @@ -32,3 +98,52 @@ A JSXText element or JSXAttribute `label` or `aria-label` of which the value is: are exempt from this rule. If this rule kicks in on a string value that you don't like, you can escape it by wrapping the string inside a JSXExpression: `{'my escaped value'}`. + +--- + +## `@kbn/i18n/i18n_translate_should_start_with_the_right_id` + +This rule checks every instance of `i18n.translate()` if the first parameter passed: + +1. has a string value, +2. if the parameter starts with the correct i18n app identifier for the file. + +It checks the repo for the `i18nrc.json` and `/x-pack/i18nrc.json` files and determines what the right i18n identifier should be. + +If the parameter is missing or does not start with the right i18n identifier, it can autofix the parameter. + +This rule is useful when defining translated values in plain functions (non-JSX), but it works in JSX as well. + +### Example + +This code: + +``` +// Filename: /x-pack/plugins/observability/public/my_function.ts + +function myFunction() { + const translations = [ + { + id: 'copy'; + label: i18n.translate() + } + ] +} +``` + +will be autofixed with: + +``` +import { i18n } from '@kbn/i18n'; + +function myFunction() { + const translations = [ + { + id: 'copy'; + label: i18n.translate('xpack.observability.myFunction.', { defaultMessage: '' }) + } + ] +} +``` + +If `i18n` has not been imported yet, the autofix will automatically add the import statement as well. diff --git a/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.test.ts b/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.test.ts index 6e01b89b23565..cea9fa1c333d9 100644 --- a/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.test.ts +++ b/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.test.ts @@ -11,17 +11,15 @@ import { getI18nIdentifierFromFilePath } from './get_i18n_identifier_from_file_p const SYSTEMPATH = 'systemPath'; const testMap = [ - ['x-pack/plugins/observability/foo/bar/baz/header_actions.tsx', 'xpack.observability'], - ['x-pack/plugins/apm/public/components/app/correlations/correlations_table.tsx', 'xpack.apm'], - ['x-pack/plugins/cases/public/components/foo.tsx', 'xpack.cases'], + ['x-pack/plugins/observability/public/header_actions.tsx', 'xpack.observability'], + ['x-pack/plugins/apm/common/components/app/correlations/correlations_table.tsx', 'xpack.apm'], + ['x-pack/plugins/cases/server/components/foo.tsx', 'xpack.cases'], [ 'x-pack/plugins/synthetics/public/apps/synthetics/components/alerts/toggle_alert_flyout_button.tsx', 'xpack.synthetics', ], - [ - 'packages/kbn-alerts-ui-shared/src/alert_lifecycle_status_badge/index.tsx', - 'app_not_found_in_i18nrc', - ], + ['src/plugins/vis_types/gauge/public/editor/collections.ts', 'visTypeGauge'], + ['packages/kbn-alerts-ui-shared/src/alert_lifecycle_status_badge/index.tsx', 'alertsUIShared'], ]; describe('Get i18n Identifier for file', () => { diff --git a/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.ts b/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.ts index d23a42f4ebcfb..7b39d119ee845 100644 --- a/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.ts +++ b/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_identifier_from_file_path.ts @@ -14,18 +14,38 @@ export function getI18nIdentifierFromFilePath(fileName: string, cwd: string) { const { dir } = parse(fileName); const relativePathToFile = dir.replace(cwd, ''); - const relativePathArray = relativePathToFile.split('/'); + // We need to match the path of the file that is being worked in with the path + // that is noted in the values inside the i18nrc.json object. + // These values differ depending on which i18nrc.json object you look at (there are multiple) + // so we need to account for both notations. + const relativePathArray = relativePathToFile.includes('src') + ? relativePathToFile.split('/').slice(1) + : relativePathToFile.split('/').slice(2); - const path = `${relativePathArray[2]}/${relativePathArray[3]}`; + const pluginNameIndex = relativePathArray.findIndex( + (el) => el === 'public' || el === 'server' || el === 'common' + ); + + const path = relativePathArray.slice(0, pluginNameIndex).join('/'); const xpackRC = resolve(join(__dirname, '../../../'), 'x-pack/.i18nrc.json'); + const rootRC = resolve(join(__dirname, '../../../'), '.i18nrc.json'); + + const xpackI18nrcFile = fs.readFileSync(xpackRC, 'utf8'); + const xpackI18nrc = JSON.parse(xpackI18nrcFile); + + const rootI18nrcFile = fs.readFileSync(rootRC, 'utf8'); + const rootI18nrc = JSON.parse(rootI18nrcFile); + + const allPaths = { ...xpackI18nrc.paths, ...rootI18nrc.paths }; - const i18nrcFile = fs.readFileSync(xpackRC, 'utf8'); - const i18nrc = JSON.parse(i18nrcFile); + if (Object.keys(allPaths).length === 0) return 'could_not_find_i18nrc'; - return i18nrc && i18nrc.paths - ? findKey(i18nrc.paths, (v) => - Array.isArray(v) ? v.find((e) => e === path) : typeof v === 'string' && v === path - ) ?? 'app_not_found_in_i18nrc' - : 'could_not_find_i18nrc'; + return ( + findKey(allPaths, (value) => + Array.isArray(value) + ? value.find((el) => el === path) + : typeof value === 'string' && value === path + ) ?? 'app_not_found_in_i18nrc' + ); } diff --git a/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_import_fixer.ts b/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_import_fixer.ts index cf3a7330f7584..7b81c0f7a6b8c 100644 --- a/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_import_fixer.ts +++ b/packages/kbn-eslint-plugin-i18n/helpers/get_i18n_import_fixer.ts @@ -10,10 +10,10 @@ import { SourceCode } from 'eslint'; export function getI18nImportFixer({ sourceCode, - mode, + translationFunction, }: { sourceCode: SourceCode; - mode: 'i18n.translate' | 'FormattedMessage'; + translationFunction: 'i18n.translate' | 'FormattedMessage'; }) { let existingI18nImportLineIndex = -1; let i18nImportLineToBeAdded = ''; @@ -27,7 +27,7 @@ export function getI18nImportFixer({ * * */ - if (mode === 'i18n.translate') { + if (translationFunction === 'i18n.translate') { existingI18nImportLineIndex = sourceCode.lines.findIndex((l) => l.includes("from '@kbn/i18n'")); const i18nImportLineInSource = sourceCode.lines[existingI18nImportLineIndex]; @@ -46,7 +46,7 @@ export function getI18nImportFixer({ } } - if (mode === 'FormattedMessage') { + if (translationFunction === 'FormattedMessage') { existingI18nImportLineIndex = sourceCode.lines.findIndex((l) => l.includes("from '@kbn/i18n-react'") ); @@ -83,21 +83,27 @@ export function getI18nImportFixer({ return { i18nImportLine: i18nImportLineToBeAdded, rangeToAddI18nImportLine: [start, end] as [number, number], - mode: 'replace', + replaceMode: 'replace', }; } // If the file doesn't have an import line for the translation package yet, we need to add it. // Pretty safe bet to add it underneath the import line for React. - const lineIndex = sourceCode.lines.findIndex((l) => l.includes("from 'react'")); + let lineIndex = sourceCode.lines.findIndex((l) => l.includes("from 'react'") || l.includes('*/')); + + if (lineIndex === -1) { + lineIndex = 0; + } + const targetLine = sourceCode.lines[lineIndex]; + // `getIndexFromLoc` is 0-based, so we need to add 1 to the line index. const start = sourceCode.getIndexFromLoc({ line: lineIndex + 1, column: 0 }); const end = start + targetLine.length; return { i18nImportLine: i18nImportLineToBeAdded, rangeToAddI18nImportLine: [start, end] as [number, number], - mode: 'insert', + replaceMode: 'insert', }; } diff --git a/packages/kbn-eslint-plugin-i18n/index.ts b/packages/kbn-eslint-plugin-i18n/index.ts index be5661cf46dec..dd99785204c33 100644 --- a/packages/kbn-eslint-plugin-i18n/index.ts +++ b/packages/kbn-eslint-plugin-i18n/index.ts @@ -8,6 +8,7 @@ import { StringsShouldBeTranslatedWithI18n } from './rules/strings_should_be_translated_with_i18n'; import { StringsShouldBeTranslatedWithFormattedMessage } from './rules/strings_should_be_translated_with_formatted_message'; +import { I18nTranslateShouldStartWithTheRightId } from './rules/i18n_translate_should_start_with_the_right_id'; /** * Custom ESLint rules, add `'@kbn/eslint-plugin-i18n'` to your eslint config to use them @@ -17,4 +18,5 @@ export const rules = { strings_should_be_translated_with_i18n: StringsShouldBeTranslatedWithI18n, strings_should_be_translated_with_formatted_message: StringsShouldBeTranslatedWithFormattedMessage, + i18n_translate_should_start_with_the_right_id: I18nTranslateShouldStartWithTheRightId, }; diff --git a/packages/kbn-eslint-plugin-i18n/kibana.jsonc b/packages/kbn-eslint-plugin-i18n/kibana.jsonc index 72e051941db68..b234cc835ed3a 100644 --- a/packages/kbn-eslint-plugin-i18n/kibana.jsonc +++ b/packages/kbn-eslint-plugin-i18n/kibana.jsonc @@ -1,6 +1,6 @@ { "type": "shared-common", "id": "@kbn/eslint-plugin-i18n", - "owner": "@elastic/obs-knowledge-team", + "owner": ["@elastic/obs-knowledge-team", "@elastic/kibana-operations"], "devOnly": true } diff --git a/packages/kbn-eslint-plugin-i18n/rules/i18n_translate_should_start_with_the_right_id.test.ts b/packages/kbn-eslint-plugin-i18n/rules/i18n_translate_should_start_with_the_right_id.test.ts new file mode 100644 index 0000000000000..49bdb03a4f476 --- /dev/null +++ b/packages/kbn-eslint-plugin-i18n/rules/i18n_translate_should_start_with_the_right_id.test.ts @@ -0,0 +1,134 @@ +/* + * Copyright 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 { RuleTester } from 'eslint'; +import { + I18nTranslateShouldStartWithTheRightId, + RULE_WARNING_MESSAGE, +} from './i18n_translate_should_start_with_the_right_id'; + +const tsTester = [ + '@typescript-eslint/parser', + new RuleTester({ + parser: require.resolve('@typescript-eslint/parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + ecmaFeatures: { + jsx: true, + }, + }, + }), +] as const; + +const babelTester = [ + '@babel/eslint-parser', + new RuleTester({ + parser: require.resolve('@babel/eslint-parser'), + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018, + requireConfigFile: false, + babelOptions: { + presets: ['@kbn/babel-preset/node_preset'], + }, + }, + }), +] as const; + +const invalid: RuleTester.InvalidTestCase[] = [ + { + name: 'When a string literal is passed to i18n.translate, it should start with the correct i18n identifier.', + filename: '/x-pack/plugins/observability/public/test_component.ts', + code: ` +import { i18n } from '@kbn/i18n'; + +function TestComponent() { + const foo = i18n.translate('foo'); +}`, + errors: [ + { + line: 5, + message: RULE_WARNING_MESSAGE, + }, + ], + output: ` +import { i18n } from '@kbn/i18n'; + +function TestComponent() { + const foo = i18n.translate('xpack.observability.testComponent.', { defaultMessage: '' }); +}`, + }, + { + name: 'When no string literal is passed to i18n.translate, it should start with the correct i18n identifier.', + filename: '/x-pack/plugins/observability/public/test_component.ts', + code: ` +import { i18n } from '@kbn/i18n'; + +function TestComponent() { + const foo = i18n.translate(); +}`, + errors: [ + { + line: 5, + message: RULE_WARNING_MESSAGE, + }, + ], + output: ` +import { i18n } from '@kbn/i18n'; + +function TestComponent() { + const foo = i18n.translate('xpack.observability.testComponent.', { defaultMessage: '' }); +}`, + }, + { + name: 'When i18n is not imported yet, the rule should add it.', + filename: '/x-pack/plugins/observability/public/test_component.ts', + code: ` +function TestComponent() { + const foo = i18n.translate(); +}`, + errors: [ + { + line: 3, + message: RULE_WARNING_MESSAGE, + }, + ], + output: ` +import { i18n } from '@kbn/i18n'; +function TestComponent() { + const foo = i18n.translate('xpack.observability.testComponent.', { defaultMessage: '' }); +}`, + }, +]; + +const valid: RuleTester.ValidTestCase[] = [ + { + name: invalid[0].name, + filename: invalid[0].filename, + code: invalid[0].output as string, + }, + { + name: invalid[1].name, + filename: invalid[1].filename, + code: invalid[1].output as string, + }, +]; + +for (const [name, tester] of [tsTester, babelTester]) { + describe(name, () => { + tester.run( + '@kbn/i18n_translate_should_start_with_the_right_id', + I18nTranslateShouldStartWithTheRightId, + { + valid, + invalid, + } + ); + }); +} diff --git a/packages/kbn-eslint-plugin-i18n/rules/i18n_translate_should_start_with_the_right_id.ts b/packages/kbn-eslint-plugin-i18n/rules/i18n_translate_should_start_with_the_right_id.ts new file mode 100644 index 0000000000000..d6510ba588a4e --- /dev/null +++ b/packages/kbn-eslint-plugin-i18n/rules/i18n_translate_should_start_with_the_right_id.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { TSESTree } from '@typescript-eslint/typescript-estree'; +import type { Rule } from 'eslint'; +import { getI18nIdentifierFromFilePath } from '../helpers/get_i18n_identifier_from_file_path'; +import { getFunctionName } from '../helpers/get_function_name'; +import { getI18nImportFixer } from '../helpers/get_i18n_import_fixer'; +import { isTruthy } from '../helpers/utils'; + +export const RULE_WARNING_MESSAGE = + 'First parameter passed to i18n.translate should start with the correct i18n identifier for this file. Correct it or use the autofix suggestion.'; + +export const I18nTranslateShouldStartWithTheRightId: Rule.RuleModule = { + meta: { + type: 'suggestion', + fixable: 'code', + }, + create(context) { + const { cwd, filename, getScope, sourceCode, report } = context; + + return { + CallExpression: (node: TSESTree.CallExpression) => { + const { callee } = node; + + if ( + !callee || + !('object' in callee) || + !('property' in callee) || + !('name' in callee.object) || + !('name' in callee.property) || + callee.object.name !== 'i18n' || + callee.property.name !== 'translate' + ) + return; + + const identifier = + Array.isArray(node.arguments) && + node.arguments.length && + 'value' in node.arguments[0] && + typeof node.arguments[0].value === 'string' && + node.arguments[0].value; + + const i18nAppId = getI18nIdentifierFromFilePath(filename, cwd); + const functionDeclaration = getScope().block as TSESTree.FunctionDeclaration; + const functionName = getFunctionName(functionDeclaration); + + // Check if i18n has already been imported into the file + const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, replaceMode } = + getI18nImportFixer({ + sourceCode, + translationFunction: 'i18n.translate', + }); + + if (!identifier || (identifier && !identifier.startsWith(`${i18nAppId}.`))) { + report({ + node: node as any, + message: RULE_WARNING_MESSAGE, + fix(fixer) { + return [ + fixer.replaceTextRange( + node.range, + `i18n.translate('${i18nAppId}.${functionName}.', { defaultMessage: '' })` + ), + !hasI18nImportLine && rangeToAddI18nImportLine + ? replaceMode === 'replace' + ? fixer.replaceTextRange(rangeToAddI18nImportLine, i18nImportLine) + : fixer.insertTextAfterRange(rangeToAddI18nImportLine, `\n${i18nImportLine}`) + : null, + ].filter(isTruthy); + }, + }); + } + }, + } as Rule.RuleListener; + }, +}; diff --git a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.test.ts b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.test.ts index 009fac255fc63..6faf6732f9015 100644 --- a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.test.ts +++ b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.test.ts @@ -7,7 +7,10 @@ */ import { RuleTester } from 'eslint'; -import { StringsShouldBeTranslatedWithFormattedMessage } from './strings_should_be_translated_with_formatted_message'; +import { + StringsShouldBeTranslatedWithFormattedMessage, + RULE_WARNING_MESSAGE, +} from './strings_should_be_translated_with_formatted_message'; const tsTester = [ '@typescript-eslint/parser', @@ -41,7 +44,7 @@ const babelTester = [ const invalid: RuleTester.InvalidTestCase[] = [ { name: 'A JSX element with a string literal should be translated with i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; @@ -53,7 +56,7 @@ function TestComponent() { errors: [ { line: 6, - message: `Strings should be translated with . Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -64,7 +67,7 @@ function TestComponent() { return (
    ) @@ -72,7 +75,7 @@ function TestComponent() { }, { name: 'A JSX element with a string literal that are inside an Eui component should take the component name of the parent into account', - filename: 'x-pack/plugins/observability/public/another_component.tsx', + filename: '/x-pack/plugins/observability/public/another_component.tsx', code: ` import React from 'react'; @@ -90,7 +93,7 @@ function AnotherComponent() { errors: [ { line: 9, - message: `Strings should be translated with . Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -104,7 +107,7 @@ function AnotherComponent() { @@ -115,7 +118,7 @@ function AnotherComponent() { }, { name: 'When no import of the translation module is present, the import line should be added', - filename: 'x-pack/plugins/observability/public/yet_another_component.tsx', + filename: '/x-pack/plugins/observability/public/yet_another_component.tsx', code: ` import React from 'react'; @@ -129,7 +132,7 @@ function YetAnotherComponent() { errors: [ { line: 7, - message: `Strings should be translated with . Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -141,7 +144,7 @@ function YetAnotherComponent() {
    @@ -150,7 +153,7 @@ function YetAnotherComponent() { }, { name: 'Import lines without the necessary translation module should be updated to include i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; import { SomeOtherModule } from '@kbn/i18n-react'; @@ -163,7 +166,7 @@ function TestComponent() { errors: [ { line: 7, - message: `Strings should be translated with . Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -172,13 +175,13 @@ import { SomeOtherModule, FormattedMessage } from '@kbn/i18n-react'; function TestComponent() { return ( - } /> + } /> ) }`, }, { name: 'JSX elements that have a label or aria-label prop with a string value should be translated with i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -191,7 +194,7 @@ function TestComponent() { errors: [ { line: 7, - message: `Strings should be translated with . Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -200,13 +203,13 @@ import { FormattedMessage } from '@kbn/i18n-react'; function TestComponent() { return ( - } /> + } /> ) }`, }, { name: 'JSX elements that have a label or aria-label prop with a JSXExpression value that is a string should be translated with i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -219,7 +222,7 @@ function TestComponent() { errors: [ { line: 7, - message: `Strings should be translated with . Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -228,7 +231,7 @@ function TestComponent() { function TestComponent() { return ( - } /> + } /> ) }`, }, @@ -237,7 +240,7 @@ function TestComponent() { const valid: RuleTester.ValidTestCase[] = [ { name: 'A JSXText element inside a EuiCode component should not be translated', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; @@ -249,7 +252,7 @@ function TestComponent() { }, { name: 'A JSXText element that contains anything other than alpha characters should not be translated', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; @@ -261,7 +264,7 @@ function TestComponent() { }, { name: 'A JSXText element that is wrapped in three backticks (markdown) should not be translated', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; diff --git a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.ts b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.ts index 77b5918951036..ea96cf313d1b4 100644 --- a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.ts +++ b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_formatted_message.ts @@ -14,6 +14,8 @@ import { getFunctionName } from '../helpers/get_function_name'; import { getI18nImportFixer } from '../helpers/get_i18n_import_fixer'; import { cleanString, isTruthy } from '../helpers/utils'; +export const RULE_WARNING_MESSAGE = + 'Strings should be translated with . Use the autofix suggestion or add your own.'; export const StringsShouldBeTranslatedWithFormattedMessage: Rule.RuleModule = { meta: { type: 'suggestion', @@ -44,17 +46,16 @@ export const StringsShouldBeTranslatedWithFormattedMessage: Rule.RuleModule = { const translationIdSuggestion = `${i18nAppId}.${functionName}.${intent}`; // 'xpack.observability.overview.logs.loadMoreLabel' // Check if i18n has already been imported into the file - const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, mode } = + const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, replaceMode } = getI18nImportFixer({ sourceCode, - mode: 'FormattedMessage', + translationFunction: 'FormattedMessage', }); // Show warning to developer and offer autofix suggestion report({ node: node as any, - message: - 'Strings should be translated with . Use the autofix suggestion or add your own.', + message: RULE_WARNING_MESSAGE, fix(fixer) { return [ fixer.replaceText( @@ -65,7 +66,7 @@ export const StringsShouldBeTranslatedWithFormattedMessage: Rule.RuleModule = { />` ), !hasI18nImportLine && rangeToAddI18nImportLine - ? mode === 'replace' + ? replaceMode === 'replace' ? fixer.replaceTextRange(rangeToAddI18nImportLine, i18nImportLine) : fixer.insertTextAfterRange(rangeToAddI18nImportLine, `\n${i18nImportLine}`) : null, @@ -106,17 +107,16 @@ export const StringsShouldBeTranslatedWithFormattedMessage: Rule.RuleModule = { const translationIdSuggestion = `${i18nAppId}.${functionName}.${intent}`; // 'xpack.observability.overview.logs.loadMoreLabel' // Check if i18n has already been imported into the file. - const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, mode } = + const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, replaceMode } = getI18nImportFixer({ sourceCode, - mode: 'FormattedMessage', + translationFunction: 'FormattedMessage', }); // Show warning to developer and offer autofix suggestion report({ node: node as any, - message: - 'Strings should be translated with . Use the autofix suggestion or add your own.', + message: RULE_WARNING_MESSAGE, fix(fixer) { return [ fixer.replaceTextRange( @@ -124,7 +124,7 @@ export const StringsShouldBeTranslatedWithFormattedMessage: Rule.RuleModule = { `{}` ), !hasI18nImportLine && rangeToAddI18nImportLine - ? mode === 'replace' + ? replaceMode === 'replace' ? fixer.replaceTextRange(rangeToAddI18nImportLine, i18nImportLine) : fixer.insertTextAfterRange(rangeToAddI18nImportLine, `\n${i18nImportLine}`) : null, diff --git a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.test.ts b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.test.ts index f470ed885682f..3142d368b0764 100644 --- a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.test.ts +++ b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.test.ts @@ -7,7 +7,10 @@ */ import { RuleTester } from 'eslint'; -import { StringsShouldBeTranslatedWithI18n } from './strings_should_be_translated_with_i18n'; +import { + StringsShouldBeTranslatedWithI18n, + RULE_WARNING_MESSAGE, +} from './strings_should_be_translated_with_i18n'; const tsTester = [ '@typescript-eslint/parser', @@ -41,7 +44,7 @@ const babelTester = [ const invalid: RuleTester.InvalidTestCase[] = [ { name: 'A JSX element with a string literal should be translated with i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; @@ -53,7 +56,7 @@ function TestComponent() { errors: [ { line: 6, - message: `Strings should be translated with i18n. Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -62,13 +65,13 @@ import { i18n } from '@kbn/i18n'; function TestComponent() { return ( -
    {i18n.translate('app_not_found_in_i18nrc.testComponent.div.thisIsATestLabel', { defaultMessage: 'This is a test' })}
    +
    {i18n.translate('xpack.observability.testComponent.div.thisIsATestLabel', { defaultMessage: 'This is a test' })}
    ) }`, }, { name: 'A JSX element with a string literal that are inside an Eui component should take the component name of the parent into account', - filename: 'x-pack/plugins/observability/public/another_component.tsx', + filename: '/x-pack/plugins/observability/public/another_component.tsx', code: ` import React from 'react'; @@ -86,7 +89,7 @@ function AnotherComponent() { errors: [ { line: 9, - message: `Strings should be translated with i18n. Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -98,7 +101,7 @@ function AnotherComponent() { - {i18n.translate('app_not_found_in_i18nrc.anotherComponent.thisIsATestButtonLabel', { defaultMessage: 'This is a test' })} + {i18n.translate('xpack.observability.anotherComponent.thisIsATestButtonLabel', { defaultMessage: 'This is a test' })} @@ -107,7 +110,7 @@ function AnotherComponent() { }, { name: 'When no import of the translation module is present, the import line should be added', - filename: 'x-pack/plugins/observability/public/yet_another_component.tsx', + filename: '/x-pack/plugins/observability/public/yet_another_component.tsx', code: ` import React from 'react'; @@ -121,7 +124,7 @@ function YetAnotherComponent() { errors: [ { line: 7, - message: `Strings should be translated with i18n. Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -131,14 +134,14 @@ import { i18n } from '@kbn/i18n'; function YetAnotherComponent() { return (
    - {i18n.translate('app_not_found_in_i18nrc.yetAnotherComponent.selectMeSelectLabel', { defaultMessage: 'Select me' })} + {i18n.translate('xpack.observability.yetAnotherComponent.selectMeSelectLabel', { defaultMessage: 'Select me' })}
    ) }`, }, { name: 'Import lines without the necessary translation module should be updated to include i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; import { SomeOtherModule } from '@kbn/i18n'; @@ -151,7 +154,7 @@ function TestComponent() { errors: [ { line: 7, - message: `Strings should be translated with i18n. Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -160,13 +163,13 @@ import { SomeOtherModule, i18n } from '@kbn/i18n'; function TestComponent() { return ( - + ) }`, }, { name: 'JSX elements that have a label or aria-label prop with a string value should be translated with i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; import { i18n } from '@kbn/i18n'; @@ -179,7 +182,7 @@ function TestComponent() { errors: [ { line: 7, - message: `Strings should be translated with i18n. Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -188,13 +191,13 @@ import { i18n } from '@kbn/i18n'; function TestComponent() { return ( - + ) }`, }, { name: 'JSX elements that have a label or aria-label prop with a JSXExpression value that is a string should be translated with i18n', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; import { i18n } from '@kbn/i18n'; @@ -207,7 +210,7 @@ function TestComponent() { errors: [ { line: 7, - message: `Strings should be translated with i18n. Use the autofix suggestion or add your own.`, + message: RULE_WARNING_MESSAGE, }, ], output: ` @@ -216,7 +219,7 @@ import { i18n } from '@kbn/i18n'; function TestComponent() { return ( - + ) }`, }, @@ -225,7 +228,7 @@ function TestComponent() { const valid: RuleTester.ValidTestCase[] = [ { name: 'A JSXText element inside a EuiCode component should not be translated', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; @@ -237,7 +240,7 @@ function TestComponent() { }, { name: 'A JSXText element that contains anything other than alpha characters should not be translated', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; @@ -249,7 +252,7 @@ function TestComponent() { }, { name: 'A JSXText element that is wrapped in three backticks (markdown) should not be translated', - filename: 'x-pack/plugins/observability/public/test_component.tsx', + filename: '/x-pack/plugins/observability/public/test_component.tsx', code: ` import React from 'react'; diff --git a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.ts b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.ts index fea04d33d555f..ec1630de115e6 100644 --- a/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.ts +++ b/packages/kbn-eslint-plugin-i18n/rules/strings_should_be_translated_with_i18n.ts @@ -14,6 +14,9 @@ import { getFunctionName } from '../helpers/get_function_name'; import { getI18nImportFixer } from '../helpers/get_i18n_import_fixer'; import { cleanString, isTruthy } from '../helpers/utils'; +export const RULE_WARNING_MESSAGE = + 'Strings should be translated with i18n. Use the autofix suggestion or add your own.'; + export const StringsShouldBeTranslatedWithI18n: Rule.RuleModule = { meta: { type: 'suggestion', @@ -44,17 +47,16 @@ export const StringsShouldBeTranslatedWithI18n: Rule.RuleModule = { const translationIdSuggestion = `${i18nAppId}.${functionName}.${intent}`; // 'xpack.observability.overview.logs.loadMoreLabel' // Check if i18n has already been imported into the file - const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, mode } = + const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, replaceMode } = getI18nImportFixer({ sourceCode, - mode: 'i18n.translate', + translationFunction: 'i18n.translate', }); // Show warning to developer and offer autofix suggestion report({ node: node as any, - message: - 'Strings should be translated with i18n. Use the autofix suggestion or add your own.', + message: RULE_WARNING_MESSAGE, fix(fixer) { return [ fixer.replaceText( @@ -62,7 +64,7 @@ export const StringsShouldBeTranslatedWithI18n: Rule.RuleModule = { `${whiteSpaces}{i18n.translate('${translationIdSuggestion}', { defaultMessage: '${value}' })}` ), !hasI18nImportLine && rangeToAddI18nImportLine - ? mode === 'replace' + ? replaceMode === 'replace' ? fixer.replaceTextRange(rangeToAddI18nImportLine, i18nImportLine) : fixer.insertTextAfterRange(rangeToAddI18nImportLine, `\n${i18nImportLine}`) : null, @@ -103,17 +105,16 @@ export const StringsShouldBeTranslatedWithI18n: Rule.RuleModule = { const translationIdSuggestion = `${i18nAppId}.${functionName}.${intent}`; // 'xpack.observability.overview.logs.loadMoreLabel' // Check if i18n has already been imported into the file. - const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, mode } = + const { hasI18nImportLine, i18nImportLine, rangeToAddI18nImportLine, replaceMode } = getI18nImportFixer({ sourceCode, - mode: 'i18n.translate', + translationFunction: 'i18n.translate', }); // Show warning to developer and offer autofix suggestion report({ node: node as any, - message: - 'Strings should be translated with i18n. Use the autofix suggestion or add your own.', + message: RULE_WARNING_MESSAGE, fix(fixer) { return [ fixer.replaceTextRange( @@ -121,7 +122,7 @@ export const StringsShouldBeTranslatedWithI18n: Rule.RuleModule = { `{i18n.translate('${translationIdSuggestion}', { defaultMessage: '${val}' })}` ), !hasI18nImportLine && rangeToAddI18nImportLine - ? mode === 'replace' + ? replaceMode === 'replace' ? fixer.replaceTextRange(rangeToAddI18nImportLine, i18nImportLine) : fixer.insertTextAfterRange(rangeToAddI18nImportLine, `\n${i18nImportLine}`) : null, diff --git a/packages/kbn-handlebars/__snapshots__/index.test.ts.snap b/packages/kbn-handlebars/__snapshots__/index.test.ts.snap index b9a8c27e45911..d25a455699fd6 100644 --- a/packages/kbn-handlebars/__snapshots__/index.test.ts.snap +++ b/packages/kbn-handlebars/__snapshots__/index.test.ts.snap @@ -42,7 +42,7 @@ HandlebarsEnvironment { "isFunction": [Function], "toString": [Function], }, - "VERSION": "4.7.7", + "VERSION": "4.7.8", "VM": Object { "__esModule": true, "checkRevision": [Function], diff --git a/packages/kbn-handlebars/scripts/check_for_upstream_updates.sh b/packages/kbn-handlebars/scripts/check_for_upstream_updates.sh index 73f7376ab4312..7f2bf784f863e 100755 --- a/packages/kbn-handlebars/scripts/check_for_upstream_updates.sh +++ b/packages/kbn-handlebars/scripts/check_for_upstream_updates.sh @@ -34,7 +34,7 @@ else echo " our local versions of these files (located in" echo " 'packages/kbn-handlebars/src/spec')." echo - echo " https://github.com/handlebars-lang/handlebars.js/compare/$hash...4.x" + echo " https://github.com/handlebars-lang/handlebars.js/compare/$expected_hash...4.x" echo echo " 2. Execute the following script and commit the updated '$HASH_FILE'" echo " file including any changes you made to our own spec files." diff --git a/packages/kbn-handlebars/src/spec/.upstream_git_hash b/packages/kbn-handlebars/src/spec/.upstream_git_hash index 5a6b183166d46..0d4d453a0c5c3 100644 --- a/packages/kbn-handlebars/src/spec/.upstream_git_hash +++ b/packages/kbn-handlebars/src/spec/.upstream_git_hash @@ -1 +1 @@ -c65c6cce3f626e4896a9d59250f0908be695adae \ No newline at end of file +eab1d141cb4a1d93375d7380ed070aa1f576a2c9 \ No newline at end of file diff --git a/packages/kbn-language-documentation-popover/src/components/documentation_content.test.tsx b/packages/kbn-language-documentation-popover/src/components/documentation_content.test.tsx index 6d91cc403795e..e0d7e3c28dbea 100644 --- a/packages/kbn-language-documentation-popover/src/components/documentation_content.test.tsx +++ b/packages/kbn-language-documentation-popover/src/components/documentation_content.test.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { mountWithIntl, findTestSubject } from '@kbn/test-jest-helpers'; import { act } from 'react-dom/test-utils'; +import { Markdown } from '@kbn/kibana-react-plugin/public'; import { LanguageDocumentationPopoverContent } from './documentation_content'; describe('###Documentation popover content', () => { @@ -24,11 +25,11 @@ describe('###Documentation popover content', () => { items: [ { label: 'Section two item 1', - description: Section 2 item 1 description, + description: , }, { label: 'Section two item 2', - description: Section 2 item 2 description, + description: , }, ], }, @@ -52,7 +53,7 @@ describe('###Documentation popover content', () => { }); }); - test('Documentation component should list all sections that match the search input', () => { + test('Documentation component should list all sections that match the search input when title matches', () => { const component = mountWithIntl( ); @@ -69,4 +70,25 @@ describe('###Documentation popover content', () => { expect(sectionsLabels.length).toBe(1); expect(sectionsLabels.text()).toEqual('Section one'); }); + + test('Documentation component should list all sections that match the search input when description matches', () => { + const component = mountWithIntl( + + ); + const searchBox = component.find('[data-test-subj="language-documentation-navigation-search"]'); + act(() => { + searchBox.at(0).prop('onChange')!({ + target: { value: 'item 2 description' }, + } as React.ChangeEvent); + }); + + component.update(); + + const sectionsLabels = findTestSubject(component, 'language-documentation-navigation-title'); + expect(sectionsLabels.length).toBe(1); + }); }); diff --git a/packages/kbn-language-documentation-popover/src/components/documentation_content.tsx b/packages/kbn-language-documentation-popover/src/components/documentation_content.tsx index b7c2e800bbaf5..0f24e233a4f28 100644 --- a/packages/kbn-language-documentation-popover/src/components/documentation_content.tsx +++ b/packages/kbn-language-documentation-popover/src/components/documentation_content.tsx @@ -20,6 +20,7 @@ import { EuiHighlight, EuiSpacer, } from '@elastic/eui'; +import { elementToString } from '../utils/element_to_string'; import './documentation.scss'; @@ -35,9 +36,11 @@ export interface LanguageDocumentationSections { interface DocumentationProps { language: string; sections?: LanguageDocumentationSections; + // if sets to true, allows searching in the markdown description + searchInDescription?: boolean; } -function DocumentationContent({ language, sections }: DocumentationProps) { +function DocumentationContent({ language, sections, searchInDescription }: DocumentationProps) { const [selectedSection, setSelectedSection] = useState(); const scrollTargets = useRef>({}); @@ -55,7 +58,13 @@ function DocumentationContent({ language, sections }: DocumentationProps) { .map((group) => { const items = group.items.filter((helpItem) => { return ( - !normalizedSearchText || helpItem.label.toLocaleLowerCase().includes(normalizedSearchText) + !normalizedSearchText || + helpItem.label.toLocaleLowerCase().includes(normalizedSearchText) || + // Converting the JSX element to a string first + (searchInDescription && + elementToString(helpItem.description) + ?.toLocaleLowerCase() + .includes(normalizedSearchText)) ); }); return { ...group, items }; diff --git a/packages/kbn-language-documentation-popover/src/components/documentation_popover.tsx b/packages/kbn-language-documentation-popover/src/components/documentation_popover.tsx index 8ff16737337aa..db66d69d7173f 100644 --- a/packages/kbn-language-documentation-popover/src/components/documentation_popover.tsx +++ b/packages/kbn-language-documentation-popover/src/components/documentation_popover.tsx @@ -17,9 +17,15 @@ interface DocumentationPopoverProps { language: string; sections?: LanguageDocumentationSections; buttonProps?: Omit; + searchInDescription?: boolean; } -function DocumentationPopover({ language, sections, buttonProps }: DocumentationPopoverProps) { +function DocumentationPopover({ + language, + sections, + buttonProps, + searchInDescription, +}: DocumentationPopoverProps) { const [isHelpOpen, setIsHelpOpen] = useState(false); const toggleDocumentationPopover = useCallback(() => { @@ -50,7 +56,11 @@ function DocumentationPopover({ language, sections, buttonProps }: Documentation } > - + ); } diff --git a/packages/kbn-language-documentation-popover/src/utils/element_to_string.test.tsx b/packages/kbn-language-documentation-popover/src/utils/element_to_string.test.tsx new file mode 100644 index 0000000000000..42ca61cca472b --- /dev/null +++ b/packages/kbn-language-documentation-popover/src/utils/element_to_string.test.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import React from 'react'; +import { Markdown } from '@kbn/kibana-react-plugin/public'; +import { elementToString } from './element_to_string'; + +describe('elementToString', () => { + test('Should return empty string if no element is given', () => { + const text = elementToString(undefined); + expect(text).toEqual(''); + }); + + test('Should return empty string if no markdown is passed', () => { + const text = elementToString(Meow); + expect(text).toEqual(''); + }); + + test('Should convert to string if markdown is passed', () => { + const text = elementToString(); + expect(text).toEqual('## Markdown goes here '); + }); + + test('Should convert to string if children with markdown are passed', () => { + const text = elementToString( + <> +

    Meow

    + + + ); + expect(text).toEqual('## Markdown goes here '); + }); +}); diff --git a/packages/kbn-language-documentation-popover/src/utils/element_to_string.ts b/packages/kbn-language-documentation-popover/src/utils/element_to_string.ts new file mode 100644 index 0000000000000..f13bb652f662a --- /dev/null +++ b/packages/kbn-language-documentation-popover/src/utils/element_to_string.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import React, { isValidElement } from 'react'; + +function nonNullable(v: T): v is NonNullable { + return v != null; +} + +/** + * Gets the JSX.Element as the input. It returns the markdown as string. + * If the children are not markdown it will return an empty string. + */ +export function elementToString(element?: JSX.Element): string { + if (!element) { + return ''; + } + const props = element.props; + if (props && 'markdown' in props) { + return String(props.markdown); + } else if (props && 'children' in props && Array.isArray(props.children)) { + return props.children.reduce((text: string, child: React.ReactNode): string => { + const validChildren = React.Children.toArray(child).filter(nonNullable); + if (isValidElement(child) && validChildren.length > 0) { + return text.concat(elementToString(child)); + } + return text; + }, ''); + } + return ''; +} diff --git a/packages/kbn-language-documentation-popover/tsconfig.json b/packages/kbn-language-documentation-popover/tsconfig.json index 82710b41d10b4..a0c043b8a15e5 100644 --- a/packages/kbn-language-documentation-popover/tsconfig.json +++ b/packages/kbn-language-documentation-popover/tsconfig.json @@ -14,6 +14,7 @@ "kbn_references": [ "@kbn/i18n", "@kbn/test-jest-helpers", + "@kbn/kibana-react-plugin", ], "exclude": [ "target/**/*", diff --git a/packages/kbn-management/settings/components/field_category/__stories__/use_category_story.tsx b/packages/kbn-management/settings/components/field_category/__stories__/use_category_story.tsx index a04e2aa93177e..fe65004f551cc 100644 --- a/packages/kbn-management/settings/components/field_category/__stories__/use_category_story.tsx +++ b/packages/kbn-management/settings/components/field_category/__stories__/use_category_story.tsx @@ -59,8 +59,13 @@ export const useCategoryStory = ({ isFiltered, isSavingEnabled }: Params) => { setUnsavedChanges((changes) => ({ ...changes, [id]: change })); }; - // This is only needed for when a search query is present - const categoryCounts = {}; + const categoryCounts = Object.keys(categorizedFields).reduce( + (acc, category) => ({ + ...acc, + [category]: categorizedFields[category].count, + }), + {} + ); return { onClearQuery, diff --git a/packages/kbn-management/settings/components/form/storybook/form.stories.tsx b/packages/kbn-management/settings/components/form/storybook/form.stories.tsx index 235ca90f9bef1..d239c862a6317 100644 --- a/packages/kbn-management/settings/components/form/storybook/form.stories.tsx +++ b/packages/kbn-management/settings/components/form/storybook/form.stories.tsx @@ -12,6 +12,7 @@ import { FieldDefinition } from '@kbn/management-settings-types'; import { getFieldDefinitions } from '@kbn/management-settings-field-definition'; import { getSettingsMock } from '@kbn/management-settings-utilities/mocks/settings.mock'; +import { categorizeFields } from '@kbn/management-settings-utilities'; import { uiSettingsClientMock } from '../mocks'; import { Form as Component } from '../form'; import { FormProvider } from '../services'; @@ -69,8 +70,16 @@ export const Form = ({ isSavingEnabled, requirePageReload }: FormStoryProps) => uiSettingsClientMock ); - // This is only needed for when a search query is present - const categoryCounts = {}; + const categorizedFields = categorizeFields(fields); + + const categoryCounts = Object.keys(categorizedFields).reduce( + (acc, category) => ({ + ...acc, + [category]: categorizedFields[category].count, + }), + {} + ); + const onClearQuery = () => {}; return ; diff --git a/packages/kbn-mock-idp-plugin/common/constants.ts b/packages/kbn-mock-idp-plugin/common/constants.ts new file mode 100644 index 0000000000000..6fb5475587574 --- /dev/null +++ b/packages/kbn-mock-idp-plugin/common/constants.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { resolve } from 'path'; + +export const MOCK_IDP_PLUGIN_PATH = resolve(__dirname, '..'); +export const MOCK_IDP_METADATA_PATH = resolve(MOCK_IDP_PLUGIN_PATH, 'metadata.xml'); + +export const MOCK_IDP_LOGIN_PATH = '/mock_idp/login'; +export const MOCK_IDP_LOGOUT_PATH = '/mock_idp/logout'; + +export const MOCK_IDP_REALM_NAME = 'mock-idp'; +export const MOCK_IDP_ENTITY_ID = 'urn:mock-idp'; // Must match `entityID` in `metadata.xml` +export const MOCK_IDP_ROLE_MAPPING_NAME = 'mock-idp-mapping'; + +export const MOCK_IDP_ATTRIBUTE_PRINCIPAL = 'http://saml.elastic-cloud.com/attributes/principal'; +export const MOCK_IDP_ATTRIBUTE_ROLES = 'http://saml.elastic-cloud.com/attributes/roles'; +export const MOCK_IDP_ATTRIBUTE_EMAIL = 'http://saml.elastic-cloud.com/attributes/email'; +export const MOCK_IDP_ATTRIBUTE_NAME = 'http://saml.elastic-cloud.com/attributes/name'; diff --git a/packages/kbn-mock-idp-plugin/common/index.ts b/packages/kbn-mock-idp-plugin/common/index.ts new file mode 100644 index 0000000000000..aaaffc15f10f8 --- /dev/null +++ b/packages/kbn-mock-idp-plugin/common/index.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { + MOCK_IDP_PLUGIN_PATH, + MOCK_IDP_METADATA_PATH, + MOCK_IDP_LOGIN_PATH, + MOCK_IDP_LOGOUT_PATH, + MOCK_IDP_REALM_NAME, + MOCK_IDP_ENTITY_ID, + MOCK_IDP_ROLE_MAPPING_NAME, + MOCK_IDP_ATTRIBUTE_PRINCIPAL, + MOCK_IDP_ATTRIBUTE_ROLES, + MOCK_IDP_ATTRIBUTE_EMAIL, + MOCK_IDP_ATTRIBUTE_NAME, +} from './constants'; +export { + createMockIdpMetadata, + createSAMLResponse, + ensureSAMLRoleMapping, + parseSAMLAuthnRequest, +} from './utils'; diff --git a/packages/kbn-mock-idp-plugin/common/utils.ts b/packages/kbn-mock-idp-plugin/common/utils.ts new file mode 100644 index 0000000000000..5d55fbc565685 --- /dev/null +++ b/packages/kbn-mock-idp-plugin/common/utils.ts @@ -0,0 +1,231 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { Client } from '@elastic/elasticsearch'; +import { SignedXml } from 'xml-crypto'; +import { KBN_KEY_PATH, KBN_CERT_PATH } from '@kbn/dev-utils'; +import { readFile } from 'fs/promises'; +import zlib from 'zlib'; +import { promisify } from 'util'; +import { parseString } from 'xml2js'; +import { X509Certificate } from 'crypto'; + +import { + MOCK_IDP_REALM_NAME, + MOCK_IDP_ENTITY_ID, + MOCK_IDP_ROLE_MAPPING_NAME, + MOCK_IDP_ATTRIBUTE_PRINCIPAL, + MOCK_IDP_ATTRIBUTE_ROLES, + MOCK_IDP_ATTRIBUTE_EMAIL, + MOCK_IDP_ATTRIBUTE_NAME, + MOCK_IDP_LOGIN_PATH, + MOCK_IDP_LOGOUT_PATH, +} from './constants'; + +const inflateRawAsync = promisify(zlib.inflateRaw); +const parseStringAsync = promisify(parseString); + +/** + * Creates XML metadata for our mock identity provider. + * + * This can be saved to file and used to configure Elasticsearch SAML realm. + * + * @param kibanaUrl Fully qualified URL where Kibana is hosted (including base path) + */ +export async function createMockIdpMetadata(kibanaUrl: string) { + const signingKey = await readFile(KBN_CERT_PATH); + const cert = new X509Certificate(signingKey); + const trimTrailingSlash = (url: string) => (url.endsWith('/') ? url.slice(0, -1) : url); + + return ` + + + + + + ${cert.raw.toString('base64')} + + + + + + + + + + `; +} + +/** + * Creates a SAML response that can be passed directly to the Kibana ACS endpoint to authenticate a user. + * + * @example Create a SAML response. + * + * ```ts + * const samlResponse = await createSAMLResponse({ + * username: '1234567890', + * email: 'mail@elastic.co', + * fullname: 'Test User', + * roles: ['t1_analyst', 'editor'], + * }) + * ``` + * + * @example Authenticate user with SAML response. + * + * ```ts + * fetch('/api/security/saml/callback', { + * method: 'POST', + * body: JSON.stringify({ SAMLResponse: samlResponse }), + * redirect: 'manual' + * }) + * ``` + */ +export async function createSAMLResponse(options: { + /** Fully qualified URL where Kibana is hosted (including base path) */ + kibanaUrl: string; + /** ID from SAML authentication request */ + authnRequestId?: string; + username: string; + fullname?: string; + email?: string; + roles: string[]; +}) { + const issueInstant = new Date().toISOString(); + const notOnOrAfter = new Date(Date.now() + 3600 * 1000).toISOString(); + + const samlAssertionTemplateXML = ` + + ${MOCK_IDP_ENTITY_ID} + + _643ec1b3f5673583b9f9a1e9e73a36daa2a3748f + + + + + + + urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified + + + + + ${options.username} + + + ${options.roles + .map( + (role) => `${role}` + ) + .join('')} + + ${ + options.email + ? ` + ${options.email} + ` + : '' + } + ${ + options.fullname + ? ` + ${options.fullname} + ` + : '' + } + + + `; + + const signature = new SignedXml(); + signature.signatureAlgorithm = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; + signature.signingKey = await readFile(KBN_KEY_PATH); + + // Adds a reference to a `Assertion` xml element and an array of transform algorithms to be used during signing. + signature.addReference( + `//*[local-name(.)='Assertion']`, + [ + 'http://www.w3.org/2000/09/xmldsig#enveloped-signature', + 'http://www.w3.org/2001/10/xml-exc-c14n#', + ], + 'http://www.w3.org/2001/04/xmlenc#sha256' + ); + + signature.computeSignature(samlAssertionTemplateXML, { + location: { reference: `//*[local-name(.)='Issuer']`, action: 'after' }, + }); + + const value = await Buffer.from( + ` + + ${MOCK_IDP_ENTITY_ID} + + + ${signature.getSignedXml()} + + ` + ).toString('base64'); + + return value; +} + +/** + * Creates the role mapping required for developers to authenticate using SAML. + */ +export async function ensureSAMLRoleMapping(client: Client) { + return client.transport.request({ + method: 'PUT', + path: `/_security/role_mapping/${MOCK_IDP_ROLE_MAPPING_NAME}`, + body: { + enabled: true, + role_templates: [ + { + template: '{"source":"{{#tojson}}groups{{/tojson}}"}', + format: 'json', + }, + ], + rules: { + all: [ + { + field: { + 'realm.name': MOCK_IDP_REALM_NAME, + }, + }, + ], + }, + }, + }); +} + +interface SAMLAuthnRequest { + 'saml2p:AuthnRequest': { + $: { + AssertionConsumerServiceURL: string; + Destination: string; + ID: string; + IssueInstant: string; + }; + }; +} + +export async function parseSAMLAuthnRequest(samlRequest: string) { + const inflatedSAMLRequest = (await inflateRawAsync(Buffer.from(samlRequest, 'base64'))) as Buffer; + const parsedSAMLRequest = (await parseStringAsync( + inflatedSAMLRequest.toString() + )) as SAMLAuthnRequest; + return parsedSAMLRequest['saml2p:AuthnRequest'].$; +} diff --git a/packages/kbn-mock-idp-plugin/kibana.jsonc b/packages/kbn-mock-idp-plugin/kibana.jsonc new file mode 100644 index 0000000000000..929d7b9b990db --- /dev/null +++ b/packages/kbn-mock-idp-plugin/kibana.jsonc @@ -0,0 +1,11 @@ +{ + "type": "plugin", + "id": "@kbn/mock-idp-plugin", + "owner": "@elastic/kibana-security", + "devOnly": true, + "plugin": { + "id": "mockIdpPlugin", + "server": true, + "browser": false + } +} \ No newline at end of file diff --git a/packages/kbn-mock-idp-plugin/package.json b/packages/kbn-mock-idp-plugin/package.json new file mode 100644 index 0000000000000..456a2cfa5ce32 --- /dev/null +++ b/packages/kbn-mock-idp-plugin/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/mock-idp-plugin", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/shared-ux/chrome/navigation/src/ui/hooks/index.ts b/packages/kbn-mock-idp-plugin/server/index.ts similarity index 87% rename from packages/shared-ux/chrome/navigation/src/ui/hooks/index.ts rename to packages/kbn-mock-idp-plugin/server/index.ts index 631ad5f590ce4..db807851d4564 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/hooks/index.ts +++ b/packages/kbn-mock-idp-plugin/server/index.ts @@ -6,4 +6,4 @@ * Side Public License, v 1. */ -export { useInitNavNode } from './use_init_navnode'; +export { plugin } from './plugin'; diff --git a/packages/kbn-mock-idp-plugin/server/plugin.ts b/packages/kbn-mock-idp-plugin/server/plugin.ts new file mode 100644 index 0000000000000..20c115d80cf2c --- /dev/null +++ b/packages/kbn-mock-idp-plugin/server/plugin.ts @@ -0,0 +1,120 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { PluginInitializer, Plugin } from '@kbn/core-plugins-server'; +import { schema } from '@kbn/config-schema'; + +import { + MOCK_IDP_LOGIN_PATH, + MOCK_IDP_LOGOUT_PATH, + createSAMLResponse, + parseSAMLAuthnRequest, +} from '../common'; + +export const plugin: PluginInitializer = async (): Promise => ({ + setup(core) { + core.http.resources.register( + { + path: MOCK_IDP_LOGIN_PATH, + validate: { + query: schema.object({ + SAMLRequest: schema.string(), + }), + }, + options: { authRequired: false }, + }, + async (context, request, response) => { + let samlRequest: Awaited>; + try { + samlRequest = await parseSAMLAuthnRequest(request.query.SAMLRequest); + } catch (error) { + return response.badRequest({ + body: '[request query.SAMLRequest]: value is not valid SAMLRequest.', + }); + } + + const userRoles: Array<[string, string]> = [ + ['system_indices_superuser', 'system_indices_superuser'], + ['t1_analyst', 't1_analyst'], + ['t2_analyst', 't2_analyst'], + ['t3_analyst', 't3_analyst'], + ['threat_intelligence_analyst', 'threat_intelligence_analyst'], + ['rule_author', 'rule_author'], + ['soc_manager', 'soc_manager'], + ['detections_admin', 'detections_admin'], + ['platform_engineer', 'platform_engineer'], + ['endpoint_operations_analyst', 'endpoint_operations_analyst'], + ['endpoint_policy_manager', 'endpoint_policy_manager'], + ]; + + const samlResponses = await Promise.all( + userRoles.map(([username, role]) => + createSAMLResponse({ + authnRequestId: samlRequest.ID, + kibanaUrl: samlRequest.AssertionConsumerServiceURL, + username, + roles: [role], + }) + ) + ); + + return response.renderHtml({ + body: ` + + Mock Identity Provider + + +

    Mock Identity Provider

    +
    +

    Pick a role:

    +
      + ${userRoles + .map( + ([username], i) => + ` +
    • + +
    • + ` + ) + .join('')} +
    + + + `, + }); + } + ); + + core.http.resources.register( + { + path: `${MOCK_IDP_LOGIN_PATH}/submit.js`, + validate: false, + options: { authRequired: false }, + }, + (context, request, response) => { + return response.renderJs({ body: 'document.getElementById("loginForm").submit();' }); + } + ); + + core.http.resources.register( + { + path: MOCK_IDP_LOGOUT_PATH, + validate: false, + options: { authRequired: false }, + }, + async (context, request, response) => { + return response.redirected({ headers: { location: '/' } }); + } + ); + }, + start() {}, + stop() {}, +}); diff --git a/packages/kbn-mock-idp-plugin/tsconfig.json b/packages/kbn-mock-idp-plugin/tsconfig.json new file mode 100644 index 0000000000000..1420a34208f13 --- /dev/null +++ b/packages/kbn-mock-idp-plugin/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core-plugins-server", + "@kbn/config-schema", + "@kbn/dev-utils" + ] +} diff --git a/packages/kbn-profiling-utils/common/functions.ts b/packages/kbn-profiling-utils/common/functions.ts index 47bf0a3100077..50cbd40a6d191 100644 --- a/packages/kbn-profiling-utils/common/functions.ts +++ b/packages/kbn-profiling-utils/common/functions.ts @@ -207,3 +207,21 @@ export const topNFunctionSortFieldRt = t.union([ t.literal(TopNFunctionSortField.AnnualizedCo2), t.literal(TopNFunctionSortField.AnnualizedDollarCost), ]); + +export enum TopNComparisonFunctionSortField { + ComparisonRank = 'comparison_rank', + ComparisonFrame = 'comparison_frame', + ComparisonSamples = 'comparison_samples', + ComparisonSelfCPU = 'comparison_selfCPU', + ComparisonTotalCPU = 'comparison_totalCPU', + ComparisonDiff = 'comparison_diff', +} + +export const topNComparisonFunctionSortFieldRt = t.union([ + t.literal(TopNComparisonFunctionSortField.ComparisonRank), + t.literal(TopNComparisonFunctionSortField.ComparisonFrame), + t.literal(TopNComparisonFunctionSortField.ComparisonSamples), + t.literal(TopNComparisonFunctionSortField.ComparisonSelfCPU), + t.literal(TopNComparisonFunctionSortField.ComparisonTotalCPU), + t.literal(TopNComparisonFunctionSortField.ComparisonDiff), +]); diff --git a/packages/kbn-profiling-utils/index.ts b/packages/kbn-profiling-utils/index.ts index 38ab8d11be237..54376e29b6d10 100644 --- a/packages/kbn-profiling-utils/index.ts +++ b/packages/kbn-profiling-utils/index.ts @@ -30,6 +30,8 @@ export { createTopNFunctions, TopNFunctionSortField, topNFunctionSortFieldRt, + TopNComparisonFunctionSortField, + topNComparisonFunctionSortFieldRt, } from './common/functions'; export type { CalleeTree } from './common/callee'; diff --git a/packages/kbn-search-api-panels/components/ingest_data.tsx b/packages/kbn-search-api-panels/components/ingest_data.tsx index 0b0e11b13618d..f8ba59d29bf30 100644 --- a/packages/kbn-search-api-panels/components/ingest_data.tsx +++ b/packages/kbn-search-api-panels/components/ingest_data.tsx @@ -6,25 +6,22 @@ * Side Public License, v 1. */ -import React, { useState } from 'react'; +import React from 'react'; -import { EuiCheckableCard, EuiFormFieldset, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; +import { EuiSpacer, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { ApplicationStart } from '@kbn/core-application-browser'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import { CodeBox } from './code_box'; import { LanguageDefinition } from '../types'; import { OverviewPanel } from './overview_panel'; -import { IntegrationsPanel } from './integrations_panel'; - +import { IngestionsPanel } from './ingestions_panel'; interface IngestDataProps { codeSnippet: string; selectedLanguage: LanguageDefinition; setSelectedLanguage: (language: LanguageDefinition) => void; docLinks: { beats: string; - connectors: string; - integrations: string; logstash: string; }; assetBasePath: string; @@ -32,6 +29,7 @@ interface IngestDataProps { sharePlugin: SharePluginStart; languages: LanguageDefinition[]; consoleRequest?: string; + additionalIngestionPanel?: React.ReactNode; } export const IngestData: React.FC = ({ @@ -44,115 +42,45 @@ export const IngestData: React.FC = ({ sharePlugin, languages, consoleRequest, + additionalIngestionPanel, }) => { - const [selectedIngestMethod, setSelectedIngestMethod] = useState< - 'ingestViaApi' | 'ingestViaIntegration' - >('ingestViaApi'); return ( - ) : ( - - ) + } - links={[ - ...(selectedLanguage.apiReference - ? [ - { - href: selectedLanguage.apiReference, - label: i18n.translate('searchApiPanels.welcomeBanner.ingestData.clientDocLink', { - defaultMessage: '{languageName} API reference', - values: { languageName: selectedLanguage.name }, - }), - }, - ] - : []), - { - href: docLinks.integrations, - label: i18n.translate('searchApiPanels.welcomeBanner.ingestData.integrationsLink', { - defaultMessage: 'About Integrations', - }), - }, - ]} + links={[]} title={i18n.translate('searchApiPanels.welcomeBanner.ingestData.title', { defaultMessage: 'Ingest data', })} > - - -

    - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.ingestApiLabel', { - defaultMessage: 'Ingest via API', - })} -

    - - } - value="ingestViaApi" - checked={selectedIngestMethod === 'ingestViaApi'} - onChange={() => setSelectedIngestMethod('ingestViaApi')} - > - - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.ingestApiDescription', { - defaultMessage: - 'The most flexible way to index data, enabling full control over your customization and optimization options.', - })} - -
    - - -

    - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.ingestIntegrationLabel', { - defaultMessage: 'Ingest via integration', - })} -

    - - } - value="ingestViaIntegration" - checked={selectedIngestMethod === 'ingestViaIntegration'} - onChange={() => setSelectedIngestMethod('ingestViaIntegration')} - > - - {i18n.translate( - 'searchApiPanels.welcomeBanner.ingestData.ingestIntegrationDescription', - { - defaultMessage: - 'Specialized ingestion tools optimized for transforming data and shipping it to Elasticsearch.', - } - )} - -
    -
    + +

    + {i18n.translate('searchApiPanels.welcomeBanner.ingestData.alternativeOptions', { + defaultMessage: 'Alternative ingestion options', + })} +

    +
    + + +
    ); }; diff --git a/packages/kbn-search-api-panels/components/ingestions_panel.tsx b/packages/kbn-search-api-panels/components/ingestions_panel.tsx new file mode 100644 index 0000000000000..ef9a0ef95ad09 --- /dev/null +++ b/packages/kbn-search-api-panels/components/ingestions_panel.tsx @@ -0,0 +1,131 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; + +import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiSpacer, EuiText, EuiLink } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { GithubLink } from './github_link'; + +interface IngestionPanelProps { + additionalIngestionPanel?: React.ReactNode; + docLinks: { beats: string; logstash: string }; + assetBasePath: string; +} + +export const IngestionsPanel: React.FC = ({ + additionalIngestionPanel, + docLinks, + assetBasePath, +}) => { + const panels = [ + { + description: i18n.translate( + 'searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDescription', + { + defaultMessage: + 'General-purpose data processing pipeline for Elasticsearch. Use Logstash to extract and transform data from a variety of inputs and outputs.', + } + ), + title: i18n.translate( + 'searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashTitle', + { + defaultMessage: 'Logstash', + } + ), + links: [ + { + href: docLinks.logstash, + label: i18n.translate( + 'searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDocumentationLabel', + { + defaultMessage: 'Documentation', + } + ), + }, + { + href: 'https://github.com/elastic/logstash', + isGithubLink: true, + label: 'logstash', + }, + ], + }, + { + description: i18n.translate( + 'searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDescription', + { + defaultMessage: + 'Lightweight, single-purpose data shippers for Elasticsearch. Use Beats to send operational data from your servers.', + } + ), + title: i18n.translate( + 'searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsTitle', + { + defaultMessage: 'Beats', + } + ), + links: [ + { + href: docLinks.beats, + label: i18n.translate( + 'searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDocumentationLabel', + { + defaultMessage: 'Documentation', + } + ), + }, + { + href: 'https://github.com/elastic/beats', + isGithubLink: true, + label: 'beats', + }, + ], + }, + ]; + return ( + <> + {additionalIngestionPanel} + {panels.map(({ title, description, links }, panelIndex) => ( + + + +
    {title}
    +
    + + +

    {description}

    +
    +
    + {links && links.length > 0 && ( + <> + + {links.map(({ label, href, isGithubLink }, linksIndex) => ( + + {isGithubLink ? ( + + ) : ( + + {label} + + )} + + ))} + + + + )} +
    + ))} + + ); +}; diff --git a/packages/kbn-search-api-panels/components/integrations_panel.tsx b/packages/kbn-search-api-panels/components/integrations_panel.tsx deleted file mode 100644 index 3f6005f26cebd..0000000000000 --- a/packages/kbn-search-api-panels/components/integrations_panel.tsx +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; - -import { - EuiThemeProvider, - EuiPanel, - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiTitle, - EuiSpacer, - EuiText, - EuiLink, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { LEARN_MORE_LABEL } from '../constants'; -import { GithubLink } from './github_link'; - -export interface IntegrationsPanelProps { - docLinks: { beats: string; connectors: string; logstash: string }; - assetBasePath: string; -} - -export const IntegrationsPanel: React.FC = ({ - docLinks, - assetBasePath, -}) => { - return ( - - - - - - - - -

    - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.logstashTitle', { - defaultMessage: 'Logstash', - })} -

    -
    - - -

    - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.logstashDescription', { - defaultMessage: - 'Add data to your data stream or index to make it searchable. Choose an ingestion method that fits your application and workflow.', - })} -

    -
    - - - - - - {LEARN_MORE_LABEL} - - - - - - - -
    -
    - - - - - - - -

    - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.beatsTitle', { - defaultMessage: 'Beats', - })} -

    -
    - - - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.beatsDescription', { - defaultMessage: - 'Lightweight, single-purpose data shippers for Elasticsearch. Use Beats to send operational data from your servers.', - })} - - - - - - - {LEARN_MORE_LABEL} - - - - - - - -
    -
    - - - - - - - -

    - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.connectorsTitle', { - defaultMessage: 'Connector clients', - })} -

    -
    - - - {i18n.translate('searchApiPanels.welcomeBanner.ingestData.connectorsDescription', { - defaultMessage: - 'Specialized integrations for syncing data from third-party sources to Elasticsearch. Use Elastic connectors to sync content from a range of databases and object stores.', - })} - - - - - - - {LEARN_MORE_LABEL} - - - - - - - -
    -
    -
    -
    - ); -}; diff --git a/packages/kbn-search-api-panels/index.tsx b/packages/kbn-search-api-panels/index.tsx index 059aaf184ebf5..7372e381c576b 100644 --- a/packages/kbn-search-api-panels/index.tsx +++ b/packages/kbn-search-api-panels/index.tsx @@ -14,7 +14,7 @@ import { AuthenticatedUser } from '@kbn/security-plugin/common'; export * from './components/code_box'; export * from './components/github_link'; export * from './components/ingest_data'; -export * from './components/integrations_panel'; +export * from './components/ingestions_panel'; export * from './components/language_client_panel'; export * from './components/overview_panel'; export * from './components/select_client'; diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx index f0b5931e54436..9eab42f5cec73 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_wildcard/index.test.tsx @@ -14,7 +14,7 @@ import { AutocompleteFieldWildcardComponent } from '.'; import { useFieldValueAutocomplete } from '../hooks/use_field_value_autocomplete'; import { fields, getField } from '../fields/index.mock'; import { autocompleteStartMock } from '../autocomplete/index.mock'; -import { FILENAME_WILDCARD_WARNING, FILEPATH_WARNING } from '@kbn/securitysolution-utils'; +import { WILDCARD_WARNING, FILEPATH_WARNING } from '@kbn/securitysolution-utils'; jest.mock('../hooks/use_field_value_autocomplete'); jest.mock('../translations', () => ({ @@ -368,7 +368,7 @@ describe('AutocompleteFieldWildcardComponent', () => { placeholder="Placeholder text" selectedField={getField('file.path.text')} selectedValue="invalid path" - warning={FILENAME_WILDCARD_WARNING} + warning={WILDCARD_WARNING} /> ); @@ -384,7 +384,7 @@ describe('AutocompleteFieldWildcardComponent', () => { const helpText = wrapper .find('[data-test-subj="valuesAutocompleteWildcardLabel"] div.euiFormHelpText') .at(0); - expect(helpText.text()).toEqual(FILENAME_WILDCARD_WARNING); + expect(helpText.text()).toEqual(WILDCARD_WARNING); expect(helpText.find('.euiToolTipAnchor')).toBeTruthy(); }); test('should show the warning helper text if the new value contains spaces when change', async () => { @@ -412,7 +412,7 @@ describe('AutocompleteFieldWildcardComponent', () => { placeholder="Placeholder text" selectedField={getField('file.path.text')} selectedValue="invalid path" - warning={FILENAME_WILDCARD_WARNING} + warning={WILDCARD_WARNING} /> ); diff --git a/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx index 3595b96d7e426..954b14a8ea244 100644 --- a/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx @@ -223,6 +223,7 @@ describe('operator', () => { { label: 'is one of' }, { label: 'is not one of' }, { label: 'matches' }, + { label: 'does not match' }, ]); }); diff --git a/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts b/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts index f9caa6387e359..c236cacad6a2c 100644 --- a/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts +++ b/packages/kbn-securitysolution-list-utils/src/autocomplete_operators/index.ts @@ -109,6 +109,7 @@ export const EVENT_FILTERS_OPERATORS: OperatorOption[] = [ isOneOfOperator, isNotOneOfOperator, matchesOperator, + doesNotMatchOperator, ]; /* diff --git a/packages/kbn-securitysolution-utils/src/path_validations/index.test.ts b/packages/kbn-securitysolution-utils/src/path_validations/index.test.ts index 5bb84816b1602..f877683caec10 100644 --- a/packages/kbn-securitysolution-utils/src/path_validations/index.test.ts +++ b/packages/kbn-securitysolution-utils/src/path_validations/index.test.ts @@ -11,11 +11,43 @@ import { hasSimpleExecutableName, OperatingSystem, ConditionEntryField, + validatePotentialWildcardInput, validateFilePathInput, - FILENAME_WILDCARD_WARNING, + validateWildcardInput, + WILDCARD_WARNING, FILEPATH_WARNING, } from '.'; +describe('validatePotentialWildcardInput', () => { + it('warns on wildcard when field is file.path.text', () => { + expect( + validatePotentialWildcardInput({ + field: 'file.path.text', + os: OperatingSystem.WINDOWS, + value: 'c:\\path*.exe', + }) + ).toEqual(WILDCARD_WARNING); + }); + it('warns on wildcard when field is not file.path.text', () => { + expect( + validatePotentialWildcardInput({ + field: 'event.category', + os: OperatingSystem.WINDOWS, + value: 'some*value', + }) + ).toEqual(WILDCARD_WARNING); + }); +}); + +describe('validateWildcardInput', () => { + it('warns on wildcard for fields that are not file paths', () => { + expect(validateWildcardInput('*')).toEqual(WILDCARD_WARNING); + }); + it('does not warn if no wildcard', () => { + expect(validateWildcardInput('non-wildcard')).toEqual(undefined); + }); +}); + describe('validateFilePathInput', () => { describe('windows', () => { const os = OperatingSystem.WINDOWS; @@ -36,15 +68,13 @@ describe('validateFilePathInput', () => { }); it('warns on wildcard in file name at the end of the path', () => { - expect(validateFilePathInput({ os, value: 'c:\\path*.exe' })).toEqual( - FILENAME_WILDCARD_WARNING - ); + expect(validateFilePathInput({ os, value: 'c:\\path*.exe' })).toEqual(WILDCARD_WARNING); expect( validateFilePathInput({ os, value: 'C:\\Windows\\*\\FILENAME.EXE-*.gz', }) - ).toEqual(FILENAME_WILDCARD_WARNING); + ).toEqual(WILDCARD_WARNING); }); it('warns on unix paths or non-windows paths', () => { @@ -65,20 +95,23 @@ describe('validateFilePathInput', () => { : OperatingSystem.LINUX; it('does not warn on valid filenames', () => { - expect(validateFilePathInput({ os, value: '/opt/*/FILENAME.EXE-1231205124.gz' })).not.toEqual( - FILENAME_WILDCARD_WARNING - ); + expect( + validateFilePathInput({ + os, + value: '/opt/*/FILENAME.EXE-1231205124.gz', + }) + ).not.toEqual(WILDCARD_WARNING); expect( validateFilePathInput({ os, value: "/opt/*/test$ as2@13---12!@#A,DS.#$^&$!#~ 'as'd.华语.txt", }) - ).not.toEqual(FILENAME_WILDCARD_WARNING); + ).not.toEqual(WILDCARD_WARNING); }); it('warns on wildcard in file name at the end of the path', () => { - expect(validateFilePathInput({ os, value: '/opt/bin*' })).toEqual(FILENAME_WILDCARD_WARNING); + expect(validateFilePathInput({ os, value: '/opt/bin*' })).toEqual(WILDCARD_WARNING); expect(validateFilePathInput({ os, value: '/opt/FILENAME.EXE-*.gz' })).toEqual( - FILENAME_WILDCARD_WARNING + WILDCARD_WARNING ); }); diff --git a/packages/kbn-securitysolution-utils/src/path_validations/index.ts b/packages/kbn-securitysolution-utils/src/path_validations/index.ts index ac7c17426e723..b2ae2d9fbceb7 100644 --- a/packages/kbn-securitysolution-utils/src/path_validations/index.ts +++ b/packages/kbn-securitysolution-utils/src/path_validations/index.ts @@ -8,8 +8,8 @@ import { i18n } from '@kbn/i18n'; -export const FILENAME_WILDCARD_WARNING = i18n.translate('utils.filename.wildcardWarning', { - defaultMessage: `Using wildcards in file paths can impact Endpoint performance`, +export const WILDCARD_WARNING = i18n.translate('utils.wildcardWarning', { + defaultMessage: `Using wildcards can impact Endpoint performance`, }); export const FILEPATH_WARNING = i18n.translate('utils.filename.pathWarning', { @@ -52,39 +52,60 @@ export enum OperatingSystem { export type EntryTypes = 'match' | 'wildcard' | 'match_any'; export type TrustedAppEntryTypes = Extract; -export const validateFilePathInput = ({ +export const validatePotentialWildcardInput = ({ + field = '', os, value = '', }: { + field?: string; os: OperatingSystem; value?: string; }): string | undefined => { const textInput = value.trim(); + if (field === 'file.path.text') { + return validateFilePathInput({ os, value: textInput }); + } + return validateWildcardInput(textInput); +}; + +export const validateFilePathInput = ({ + os, + value, +}: { + os: OperatingSystem; + value: string; +}): string | undefined => { const isValidFilePath = isPathValid({ os, field: 'file.path.text', type: 'wildcard', - value: textInput, + value, }); const hasSimpleFileName = hasSimpleExecutableName({ os, type: 'wildcard', - value: textInput, + value, }); - if (!textInput.length) { + if (!value.length) { return FILEPATH_WARNING; } if (isValidFilePath) { if (hasSimpleFileName !== undefined && !hasSimpleFileName) { - return FILENAME_WILDCARD_WARNING; + return WILDCARD_WARNING; } } else { return FILEPATH_WARNING; } }; +export const validateWildcardInput = (value?: string): string | undefined => { + if (/[*?]/.test(value ?? '')) { + return WILDCARD_WARNING; + } +}; + export const hasSimpleExecutableName = ({ os, type, diff --git a/packages/kbn-server-http-tools/index.ts b/packages/kbn-server-http-tools/index.ts index 3e172297bf6c7..a572cc6ab0832 100644 --- a/packages/kbn-server-http-tools/index.ts +++ b/packages/kbn-server-http-tools/index.ts @@ -10,6 +10,7 @@ export type { IHttpConfig, ISslConfig, ICorsConfig } from './src/types'; export { createServer } from './src/create_server'; export { defaultValidationErrorHandler } from './src/default_validation_error_handler'; export { getListenerOptions } from './src/get_listener_options'; -export { getServerOptions } from './src/get_server_options'; +export { getServerOptions, getServerTLSOptions } from './src/get_server_options'; export { getRequestId } from './src/get_request_id'; +export { setTlsConfig } from './src/set_tls_config'; export { sslSchema, SslConfig } from './src/ssl'; diff --git a/packages/kbn-server-http-tools/src/get_server_options.ts b/packages/kbn-server-http-tools/src/get_server_options.ts index ade90a0e0d3f5..5cac081fdd148 100644 --- a/packages/kbn-server-http-tools/src/get_server_options.ts +++ b/packages/kbn-server-http-tools/src/get_server_options.ts @@ -9,7 +9,7 @@ import { RouteOptionsCors, ServerOptions } from '@hapi/hapi'; import { ServerOptions as TLSOptions } from 'https'; import { defaultValidationErrorHandler } from './default_validation_error_handler'; -import { IHttpConfig } from './types'; +import { IHttpConfig, ISslConfig } from './types'; const corsAllowedHeaders = ['Accept', 'Authorization', 'Content-Type', 'If-None-Match', 'kbn-xsrf']; @@ -50,26 +50,31 @@ export function getServerOptions(config: IHttpConfig, { configureTLS = true } = }, }; - if (configureTLS && config.ssl.enabled) { - const ssl = config.ssl; - - // TODO: Hapi types have a typo in `tls` property type definition: `https.RequestOptions` is used instead of - // `https.ServerOptions`, and `honorCipherOrder` isn't presented in `https.RequestOptions`. - const tlsOptions: TLSOptions = { - ca: ssl.certificateAuthorities, - cert: ssl.certificate, - ciphers: config.ssl.cipherSuites?.join(':'), - // We use the server's cipher order rather than the client's to prevent the BEAST attack. - honorCipherOrder: true, - key: ssl.key, - passphrase: ssl.keyPassphrase, - secureOptions: ssl.getSecureOptions ? ssl.getSecureOptions() : undefined, - requestCert: ssl.requestCert, - rejectUnauthorized: ssl.rejectUnauthorized, - }; - - options.tls = tlsOptions; + if (configureTLS) { + options.tls = getServerTLSOptions(config.ssl); } return options; } + +/** + * Converts Kibana `SslConfig` into `TLSOptions` that are accepted by the Hapi server, + * and by https.Server.setSecureContext() + */ +export function getServerTLSOptions(ssl: ISslConfig): TLSOptions | undefined { + if (!ssl.enabled) { + return undefined; + } + return { + ca: ssl.certificateAuthorities, + cert: ssl.certificate, + ciphers: ssl.cipherSuites?.join(':'), + // We use the server's cipher order rather than the client's to prevent the BEAST attack. + honorCipherOrder: true, + key: ssl.key, + passphrase: ssl.keyPassphrase, + secureOptions: ssl.getSecureOptions ? ssl.getSecureOptions() : undefined, + requestCert: ssl.requestCert, + rejectUnauthorized: ssl.rejectUnauthorized, + }; +} diff --git a/packages/kbn-server-http-tools/src/set_tls_config.test.mocks.ts b/packages/kbn-server-http-tools/src/set_tls_config.test.mocks.ts new file mode 100644 index 0000000000000..4b93301b334e5 --- /dev/null +++ b/packages/kbn-server-http-tools/src/set_tls_config.test.mocks.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const getServerTLSOptionsMock = jest.fn(); + +jest.doMock('./get_server_options', () => { + const actual = jest.requireActual('./get_server_options'); + return { + ...actual, + getServerTLSOptions: getServerTLSOptionsMock, + }; +}); diff --git a/packages/kbn-server-http-tools/src/set_tls_config.test.ts b/packages/kbn-server-http-tools/src/set_tls_config.test.ts new file mode 100644 index 0000000000000..ea3e61c139448 --- /dev/null +++ b/packages/kbn-server-http-tools/src/set_tls_config.test.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { getServerTLSOptionsMock } from './set_tls_config.test.mocks'; +import { Server } from '@hapi/hapi'; +import type { ISslConfig } from './types'; +import { setTlsConfig } from './set_tls_config'; + +describe('setTlsConfig', () => { + beforeEach(() => { + getServerTLSOptionsMock.mockReset(); + getServerTLSOptionsMock.mockReturnValue({}); + }); + + it('throws when called for a non-TLS server', () => { + const server = new Server({}); + const config: ISslConfig = { enabled: true }; + expect(() => setTlsConfig(server, config)).toThrowErrorMatchingInlineSnapshot( + `"tried to set TLS config on a non-TLS http server"` + ); + }); + + it('calls `getServerTLSOptions` with the correct parameters', () => { + const server = new Server({}); + // easiest way to shim a tls.Server + (server.listener as any).setSecureContext = jest.fn(); + const config: ISslConfig = { enabled: true }; + + setTlsConfig(server, config); + + expect(getServerTLSOptionsMock).toHaveBeenCalledTimes(1); + expect(getServerTLSOptionsMock).toHaveBeenCalledWith(config); + }); + + it('throws when called for a disabled SSL config', () => { + const server = new Server({}); + // easiest way to shim a tls.Server + (server.listener as any).setSecureContext = jest.fn(); + const config: ISslConfig = { enabled: false }; + + getServerTLSOptionsMock.mockReturnValue(undefined); + + expect(() => setTlsConfig(server, config)).toThrowErrorMatchingInlineSnapshot( + `"tried to apply a disabled SSL config"` + ); + }); + + it('calls `setSecureContext` on the underlying server', () => { + const server = new Server({}); + // easiest way to shim a tls.Server + const setSecureContextMock = jest.fn(); + (server.listener as any).setSecureContext = setSecureContextMock; + const config: ISslConfig = { enabled: true }; + + const tlsConfig = { someTlsConfig: true }; + getServerTLSOptionsMock.mockReturnValue(tlsConfig); + + setTlsConfig(server, config); + + expect(setSecureContextMock).toHaveBeenCalledTimes(1); + expect(setSecureContextMock).toHaveBeenCalledWith(tlsConfig); + }); +}); diff --git a/packages/kbn-server-http-tools/src/set_tls_config.ts b/packages/kbn-server-http-tools/src/set_tls_config.ts new file mode 100644 index 0000000000000..1f2e1d70fa126 --- /dev/null +++ b/packages/kbn-server-http-tools/src/set_tls_config.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Server as HapiServer } from '@hapi/hapi'; +import type { Server as HttpServer } from 'http'; +import type { Server as TlsServer } from 'https'; +import type { ISslConfig } from './types'; +import { getServerTLSOptions } from './get_server_options'; + +function isServerTLS(server: HttpServer): server is TlsServer { + return 'setSecureContext' in server; +} + +export const setTlsConfig = (hapiServer: HapiServer, sslConfig: ISslConfig) => { + const server = hapiServer.listener; + if (!isServerTLS(server)) { + throw new Error('tried to set TLS config on a non-TLS http server'); + } + const tlsOptions = getServerTLSOptions(sslConfig); + if (!tlsOptions) { + throw new Error('tried to apply a disabled SSL config'); + } + server.setSecureContext(tlsOptions); +}; diff --git a/packages/kbn-server-http-tools/src/ssl/ssl_config.test.ts b/packages/kbn-server-http-tools/src/ssl/ssl_config.test.ts index 112fcd8a449f7..c6f701ef67a1e 100644 --- a/packages/kbn-server-http-tools/src/ssl/ssl_config.test.ts +++ b/packages/kbn-server-http-tools/src/ssl/ssl_config.test.ts @@ -164,6 +164,79 @@ describe('#SslConfig', () => { expect(configValue.certificate).toEqual('content-of-another-path'); }); }); + + describe('isEqualTo()', () => { + const createEnabledConfig = (obj: any) => + createConfig({ + enabled: true, + key: 'same-key', + certificate: 'same-cert', + ...obj, + }); + + it('compares `enabled`', () => { + const reference = createConfig({ enabled: true, key: 'same-key', certificate: 'same-cert' }); + const same = createConfig({ enabled: true, key: 'same-key', certificate: 'same-cert' }); + const different = createConfig({ enabled: false, key: 'same-key', certificate: 'same-cert' }); + + expect(reference.isEqualTo(same)).toBe(true); + expect(reference.isEqualTo(different)).toBe(false); + }); + + it('compares `key`', () => { + const reference = createEnabledConfig({ key: 'keyA', certificate: 'same-cert' }); + const same = createEnabledConfig({ key: 'keyA', certificate: 'same-cert' }); + const different = createEnabledConfig({ key: 'keyB', certificate: 'same-cert' }); + + expect(reference.isEqualTo(same)).toBe(true); + expect(reference.isEqualTo(different)).toBe(false); + }); + + it('compares `keyPassphrase`', () => { + const reference = createEnabledConfig({ keyPassphrase: 'passA' }); + const same = createEnabledConfig({ keyPassphrase: 'passA' }); + const different = createEnabledConfig({ keyPassphrase: 'passB' }); + + expect(reference.isEqualTo(same)).toBe(true); + expect(reference.isEqualTo(different)).toBe(false); + }); + + it('compares `certificate`', () => { + const reference = createEnabledConfig({ key: 'same-key', certificate: 'cert-a' }); + const same = createEnabledConfig({ key: 'same-key', certificate: 'cert-a' }); + const different = createEnabledConfig({ key: 'same-key', certificate: 'cert-b' }); + + expect(reference.isEqualTo(same)).toBe(true); + expect(reference.isEqualTo(different)).toBe(false); + }); + + it('compares `cipherSuites`', () => { + const reference = createEnabledConfig({ cipherSuites: ['A', 'B'] }); + const same = createEnabledConfig({ cipherSuites: ['A', 'B'] }); + const different = createEnabledConfig({ cipherSuites: ['A', 'C'] }); + + expect(reference.isEqualTo(same)).toBe(true); + expect(reference.isEqualTo(different)).toBe(false); + }); + + it('compares `supportedProtocols`', () => { + const reference = createEnabledConfig({ supportedProtocols: ['TLSv1.1', 'TLSv1.2'] }); + const same = createEnabledConfig({ supportedProtocols: ['TLSv1.1', 'TLSv1.2'] }); + const different = createEnabledConfig({ supportedProtocols: ['TLSv1.1', 'TLSv1.3'] }); + + expect(reference.isEqualTo(same)).toBe(true); + expect(reference.isEqualTo(different)).toBe(false); + }); + + it('compares `clientAuthentication`', () => { + const reference = createEnabledConfig({ clientAuthentication: 'none' }); + const same = createEnabledConfig({ clientAuthentication: 'none' }); + const different = createEnabledConfig({ clientAuthentication: 'required' }); + + expect(reference.isEqualTo(same)).toBe(true); + expect(reference.isEqualTo(different)).toBe(false); + }); + }); }); describe('#sslSchema', () => { diff --git a/packages/kbn-server-http-tools/src/ssl/ssl_config.ts b/packages/kbn-server-http-tools/src/ssl/ssl_config.ts index 53d3616a09a75..a5d43064baa6b 100644 --- a/packages/kbn-server-http-tools/src/ssl/ssl_config.ts +++ b/packages/kbn-server-http-tools/src/ssl/ssl_config.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { isEqual } from 'lodash'; import { schema, TypeOf } from '@kbn/config-schema'; import { readPkcs12Keystore, readPkcs12Truststore } from '@kbn/crypto'; import { constants as cryptoConstants } from 'crypto'; @@ -161,6 +162,13 @@ export class SslConfig { : secureOptions | secureOption; // eslint-disable-line no-bitwise }, 0); } + + public isEqualTo(otherConfig: SslConfig) { + if (this === otherConfig) { + return true; + } + return isEqual(this, otherConfig); + } } const readFile = (file: string) => readFileSync(file, 'utf8'); diff --git a/packages/kbn-subscription-tracking/README.md b/packages/kbn-subscription-tracking/README.md deleted file mode 100644 index 4f84593980881..0000000000000 --- a/packages/kbn-subscription-tracking/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# @kbn/subscription-tracking - -This package leverages the `@kbn/analytics-client` package to send dedicated subscription tracking events. - -It provides a set of React components that automatically track `impression` and `click` events. Consumers of those components need to specify a `subscription context` that gives more details on the type of feature that is advertised and the location of the upsell. - -```typescript -import { SubscriptionLink } from '@kbn/subscription-tracking'; -import type { SubscriptionContext } from '@kbn/subscription-tracking'; - -const subscriptionContext: SubscriptionContext = { - feature: 'threat-intelligence', - source: 'security__threat-intelligence', -}; - -export const Paywall = () => { - return ( -
    - - Upgrade to Platinum to get this feature - -
    - ); -}; -``` - -The example above uses a `SubscriptionLink` which is a wrapper of `EuiLink` . So it behaves just like a normal link. Alternatively, upsells can also use a `SubscriptionButton` or `SubscriptionButtonEmpty` which wrap `EuiButton` and `EuiButtonEmpty` respectively. - -When the link is mounted, it will send off an `impression` event with the given `subscriptionContext`. That piece of metadata consists of an identifier of the advertised feature (in this case `threat-intelligence`) and the `source` (aka location) of the impression (in this case the `threat-intelligence` page in the `security` solution). `source` follows the following format: `{solution-identifier}__location-identifier`. - -There are no special rules for how to name these identifiers but it's good practise to make sure that `feature` has the same value for all upsells advertising the same feature (e.g. use enums for features to prevent spelling mistakes). - -Upon interaction with the upsell link/button, a special `click` event is sent, which, again, contains the same subscription context. - -If you want to use the `subscription-tracking` elements in your app, you have to set up a `SubscriptionTrackingProvider` in your plugin setup and register the tracking events on startup. Have a look at https://github.com/elastic/kibana/pull/143910 for an example of an integration. diff --git a/packages/kbn-subscription-tracking/kibana.jsonc b/packages/kbn-subscription-tracking/kibana.jsonc deleted file mode 100644 index e165baebfa76b..0000000000000 --- a/packages/kbn-subscription-tracking/kibana.jsonc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type": "shared-common", - "id": "@kbn/subscription-tracking", - "owner": "@elastic/security-threat-hunting-investigations" -} diff --git a/packages/kbn-subscription-tracking/mocks.tsx b/packages/kbn-subscription-tracking/mocks.tsx deleted file mode 100644 index b918f9bba2828..0000000000000 --- a/packages/kbn-subscription-tracking/mocks.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { FC } from 'react'; -import { analyticsClientMock } from '@kbn/analytics-client/src/mocks'; - -import { SubscriptionTrackingProvider } from './src/services'; - -const analyticsClientMockInst = analyticsClientMock.create(); - -/** - * Mock for the external services provider. Only use in tests! - */ -export const MockSubscriptionTrackingProvider: FC = ({ children }) => { - return ( - - {children} - - ); -}; diff --git a/packages/kbn-subscription-tracking/src/helpers.test.ts b/packages/kbn-subscription-tracking/src/helpers.test.ts deleted file mode 100644 index fa000567d35d3..0000000000000 --- a/packages/kbn-subscription-tracking/src/helpers.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { isValidContext } from './helpers'; - -describe('tracking', () => { - describe('isValidLocation', () => { - it('identifies correct contexts', () => { - expect( - isValidContext({ - feature: 'test', - source: 'security__test', - }) - ).toBeTruthy(); - }); - - it('identifies incorrect contexts', () => { - expect( - isValidContext({ - feature: '', - source: 'security__', - }) - ).toBeFalsy(); - - expect( - isValidContext({ - feature: 'test', - source: 'security__', - }) - ).toBeFalsy(); - - expect( - isValidContext({ - feature: '', - source: 'security__test', - }) - ).toBeFalsy(); - }); - }); -}); diff --git a/packages/kbn-subscription-tracking/src/services.tsx b/packages/kbn-subscription-tracking/src/services.tsx deleted file mode 100644 index 857bd0b0dcd89..0000000000000 --- a/packages/kbn-subscription-tracking/src/services.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React, { FC, useContext } from 'react'; -import type { AnalyticsClient, EventTypeOpts } from '@kbn/analytics-client'; -import { EVENT_NAMES, Services, SubscriptionContextData } from '../types'; - -export const SubscriptionTrackingContext = React.createContext(null); - -/** - * External services provider - */ -export const SubscriptionTrackingProvider: FC = ({ children, ...services }) => { - return ( - - {children} - - ); -}; - -/** - * React hook for accessing pre-wired services. - */ -export function useServices() { - const context = useContext(SubscriptionTrackingContext); - - if (!context) { - throw new Error( - 'SubscriptionTrackingContext is missing. Ensure your component or React root is wrapped with SubscriptionTrackingProvider.' - ); - } - - return context; -} - -const subscriptionContextSchema: EventTypeOpts['schema'] = { - source: { - type: 'keyword', - _meta: { - description: - 'A human-readable identifier describing the location of the beginning of the subscription flow', - }, - }, - feature: { - type: 'keyword', - _meta: { - description: 'A human-readable identifier describing the feature that is being promoted', - }, - }, -}; - -/** - * Registers the subscription-specific event types - */ -export function registerEvents(analyticsClient: Pick) { - analyticsClient.registerEventType({ - eventType: EVENT_NAMES.IMPRESSION, - schema: subscriptionContextSchema, - }); - - analyticsClient.registerEventType({ - eventType: EVENT_NAMES.CLICK, - schema: subscriptionContextSchema, - }); -} diff --git a/packages/kbn-subscription-tracking/src/subscription_elements.test.tsx b/packages/kbn-subscription-tracking/src/subscription_elements.test.tsx deleted file mode 100644 index 1795bbf42dd0c..0000000000000 --- a/packages/kbn-subscription-tracking/src/subscription_elements.test.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import { render, screen } from '@testing-library/react'; -import { - SubscriptionLink, - SubscriptionButton, - SubscriptionButtonEmpty, -} from './subscription_elements'; -import { SubscriptionTrackingProvider } from './services'; -import { EVENT_NAMES, Services, SubscriptionContextData } from '../types'; -import { coolDownTimeMs, resetCoolDown } from './use_impression'; - -const testServices: Services = { - navigateToApp: jest.fn(), - analyticsClient: { - reportEvent: jest.fn(), - registerEventType: jest.fn(), - } as any, -}; -const testContext: SubscriptionContextData = { feature: 'test', source: 'security__test' }; - -const WithProviders: React.FC = ({ children }) => ( - - {children} - -); - -const renderWithProviders = (children: React.ReactElement) => - render(children, { wrapper: WithProviders }); - -const reset = () => { - jest.resetAllMocks(); - resetCoolDown(); -}; - -describe('SubscriptionElements', () => { - beforeAll(() => { - jest.useFakeTimers(); - }); - - afterAll(() => { - jest.useRealTimers(); - }); - - [SubscriptionButton, SubscriptionLink, SubscriptionButtonEmpty].forEach((SubscriptionElement) => { - describe(SubscriptionElement.name, () => { - beforeEach(reset); - - it('renders the children correctly', () => { - renderWithProviders( - Hello - ); - expect(screen.getByText('Hello')).toBeTruthy(); - }); - - it('fires an impression event when rendered', () => { - renderWithProviders(); - expect(testServices.analyticsClient.reportEvent).toHaveBeenCalledWith( - EVENT_NAMES.IMPRESSION, - testContext - ); - }); - - it('fires an impression event when rendered (but only once)', () => { - const { unmount } = renderWithProviders( - - ); - expect(testServices.analyticsClient.reportEvent).toHaveBeenCalledTimes(1); - unmount(); - - // does not create an impression again when remounted - const { unmount: unmountAgain } = renderWithProviders( - - ); - unmountAgain(); - expect(testServices.analyticsClient.reportEvent).toHaveBeenCalledTimes(1); - - // only creates anew impression when the cooldown time has passed - jest.setSystemTime(Date.now() + coolDownTimeMs); - renderWithProviders(); - expect(testServices.analyticsClient.reportEvent).toHaveBeenCalledTimes(2); - }); - - it('tracks a click when clicked and navigates to page', () => { - renderWithProviders( - hello - ); - - screen.getByText('hello').click(); - expect(testServices.analyticsClient.reportEvent).toHaveBeenCalledWith( - EVENT_NAMES.CLICK, - testContext - ); - expect(testServices.navigateToApp).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/packages/kbn-subscription-tracking/src/subscription_elements.tsx b/packages/kbn-subscription-tracking/src/subscription_elements.tsx deleted file mode 100644 index f29c58d8a0a41..0000000000000 --- a/packages/kbn-subscription-tracking/src/subscription_elements.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import { EuiLink, EuiButton, EuiButtonEmpty } from '@elastic/eui'; -import type { EuiLinkProps, EuiButtonEmptyProps, EuiButtonProps } from '@elastic/eui'; -import { useGoToSubscription } from './use_go_to_subscription'; -import { useImpression } from './use_impression'; -import type { SubscriptionContextData } from '../types'; - -interface CommonProps { - /** The context information for this subscription element */ - subscriptionContext: SubscriptionContextData; -} - -export type SubscriptionLinkProps = EuiLinkProps & CommonProps; - -/** - * Wrapper around `EuiLink` that provides subscription events - */ -export function SubscriptionLink({ - subscriptionContext, - children, - ...restProps -}: SubscriptionLinkProps) { - const goToSubscription = useGoToSubscription({ subscriptionContext }); - useImpression(subscriptionContext); - - return ( - - {children} - - ); -} - -export type SubscriptionButtonProps = EuiButtonProps & CommonProps; - -/** - * Wrapper around `EuiButton` that provides subscription events - */ -export function SubscriptionButton({ - subscriptionContext, - children, - ...restProps -}: SubscriptionButtonProps) { - const goToSubscription = useGoToSubscription({ subscriptionContext }); - useImpression(subscriptionContext); - - return ( - - {children} - - ); -} - -export type SubscriptionButtonEmptyProps = EuiButtonEmptyProps & CommonProps; - -/** - * Wrapper around `EuiButtonEmpty` that provides subscription events - */ -export function SubscriptionButtonEmpty({ - subscriptionContext, - children, - ...restProps -}: SubscriptionButtonEmptyProps) { - const goToSubscription = useGoToSubscription({ subscriptionContext }); - useImpression(subscriptionContext); - - return ( - - {children} - - ); -} diff --git a/packages/kbn-subscription-tracking/src/use_go_to_subscription.ts b/packages/kbn-subscription-tracking/src/use_go_to_subscription.ts deleted file mode 100644 index 6c93fb27ee9bd..0000000000000 --- a/packages/kbn-subscription-tracking/src/use_go_to_subscription.ts +++ /dev/null @@ -1,35 +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 { useCallback } from 'react'; -import { isValidContext } from './helpers'; -import { useServices } from './services'; -import { EVENT_NAMES, SubscriptionContextData } from '../types'; - -interface Options { - subscriptionContext: SubscriptionContextData; -} - -/** - * Provides a navigation function that navigates to the subscription - * management page. When the function executes, a click event with the - * given context is emitted. - */ -export const useGoToSubscription = ({ subscriptionContext }: Options) => { - const { navigateToApp, analyticsClient } = useServices(); - const goToSubscription = useCallback(() => { - if (isValidContext(subscriptionContext)) { - analyticsClient.reportEvent(EVENT_NAMES.CLICK, subscriptionContext); - } else { - // eslint-disable-next-line no-console - console.error('The provided subscription context is invalid', subscriptionContext); - } - navigateToApp('management', { path: 'stack/license_management' }); - }, [analyticsClient, navigateToApp, subscriptionContext]); - - return goToSubscription; -}; diff --git a/packages/kbn-subscription-tracking/src/use_impression.ts b/packages/kbn-subscription-tracking/src/use_impression.ts deleted file mode 100644 index eb8aa4c2e0ec5..0000000000000 --- a/packages/kbn-subscription-tracking/src/use_impression.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import { useEffect } from 'react'; -import { isValidContext } from './helpers'; -import { useServices } from './services'; -import { EVENT_NAMES, SubscriptionContextData } from '../types'; - -/** - * Sends an impression event with the given context. - * - * Note: impression events are throttled and will not fire more - * often than once every 30 seconds. - */ -export const useImpression = (context: SubscriptionContextData) => { - const { analyticsClient } = useServices(); - - useEffect(() => { - if (!isValidContext(context)) { - // eslint-disable-next-line no-console - console.error('The provided subscription context is invalid', context); - return; - } - if (!isCoolingDown(context)) { - analyticsClient.reportEvent(EVENT_NAMES.IMPRESSION, context); - coolDown(context); - } - }, [analyticsClient, context]); -}; - -/** - * Impressions from the same context should not fire more than once every 30 seconds. - * This prevents logging too many impressions in case a page is reloaded often or - * if the user is navigating back and forth rapidly. - */ -export const coolDownTimeMs = 30 * 1000; -let impressionCooldown = new WeakMap(); - -function isCoolingDown(context: SubscriptionContextData) { - const previousLog = impressionCooldown.get(context); - - // we logged before and we are in the cooldown period - return previousLog && Date.now() - previousLog < coolDownTimeMs; -} - -function coolDown(context: SubscriptionContextData) { - impressionCooldown.set(context, Date.now()); -} - -export function resetCoolDown() { - impressionCooldown = new WeakMap(); -} diff --git a/packages/kbn-subscription-tracking/tsconfig.json b/packages/kbn-subscription-tracking/tsconfig.json deleted file mode 100644 index 677e9db998bb7..0000000000000 --- a/packages/kbn-subscription-tracking/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "outDir": "target/types", - "types": ["jest", "node", "react"] - }, - "include": ["**/*.ts", "**/*.tsx"], - "exclude": ["target/**/*"], - "kbn_references": ["@kbn/analytics-client"] -} diff --git a/packages/kbn-subscription-tracking/types.ts b/packages/kbn-subscription-tracking/types.ts deleted file mode 100644 index a2adf0c6d90c5..0000000000000 --- a/packages/kbn-subscription-tracking/types.ts +++ /dev/null @@ -1,47 +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 type { AnalyticsClient } from '@kbn/analytics-client'; - -enum SolutionIdentifier { - observability = 'observability', - security = 'security', -} -type LocationString = string; -type SourceIdentifier = `${SolutionIdentifier}__${LocationString}`; -/** - * A piece of metadata which consists of an identifier of the advertised feature and - * the `source` (e.g. location) of the subscription element. - */ -export interface SubscriptionContextData { - /** - * A human-readable identifier describing the location of the beginning of the - * subscription flow. - * Location identifiers are prefixed with a solution identifier, e.g. `security__` - * - * @example "security__host-overview" - the user is looking at an upsell button - * on the host overview page in the security solution - */ - source: SourceIdentifier; - - /** - * A human-readable identifier describing the feature that is being promoted. - * - * @example "alerts-by-process-ancestry" - */ - feature: string; -} - -export interface Services { - navigateToApp: (app: string, options: { path: string }) => void; - analyticsClient: Pick; -} - -export enum EVENT_NAMES { - CLICK = 'subscription__upsell__click', - IMPRESSION = 'subscription__upsell__impression', -} diff --git a/packages/kbn-test/src/es/test_es_cluster.ts b/packages/kbn-test/src/es/test_es_cluster.ts index 461ad2b6f0df1..84c2da1e52f80 100644 --- a/packages/kbn-test/src/es/test_es_cluster.ts +++ b/packages/kbn-test/src/es/test_es_cluster.ts @@ -71,7 +71,10 @@ export interface CreateTestEsClusterOptions { */ esArgs?: string[]; esFrom?: string; - esServerlessOptions?: Pick; + esServerlessOptions?: Pick< + ServerlessOptions, + 'image' | 'tag' | 'resources' | 'host' | 'kibanaUrl' + >; esJavaOpts?: string; /** * License to run your cluster under. Keep in mind that a `trial` license @@ -242,10 +245,7 @@ export function createTestEsCluster< await firstNode.runServerless({ basePath, esArgs: customEsArgs, - image: esServerlessOptions?.image, - tag: esServerlessOptions?.tag, - host: esServerlessOptions?.host, - resources: esServerlessOptions?.resources, + ...esServerlessOptions, port, clean: true, background: true, diff --git a/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts b/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts index 742f729745d27..4f01321b82391 100644 --- a/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts +++ b/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import Url from 'url'; import { resolve } from 'path'; import type { ToolingLog } from '@kbn/tooling-log'; import getPort from 'get-port'; @@ -160,7 +161,18 @@ async function startEsNode({ return cluster; } -function getESServerlessOptions(esServerlessImageFromArg: string | undefined, config: Config) { +interface EsServerlessOptions { + host?: string; + resources: string[]; + kibanaUrl: string; + tag?: string; + image?: string; +} + +function getESServerlessOptions( + esServerlessImageFromArg: string | undefined, + config: Config +): EsServerlessOptions { const esServerlessImageUrlOrTag = esServerlessImageFromArg || esTestConfig.getESServerlessImage() || @@ -172,24 +184,24 @@ function getESServerlessOptions(esServerlessImageFromArg: string | undefined, co const serverlessHost: string | undefined = config.has('esServerlessOptions.host') && config.get('esServerlessOptions.host'); + const commonOptions = { + host: serverlessHost, + resources: serverlessResources, + kibanaUrl: Url.format({ + protocol: config.get('servers.kibana.protocol'), + hostname: config.get('servers.kibana.hostname'), + port: config.get('servers.kibana.port'), + }), + }; + if (esServerlessImageUrlOrTag) { - if (esServerlessImageUrlOrTag.includes(':')) { - return { - resources: serverlessResources, - image: esServerlessImageUrlOrTag, - host: serverlessHost, - }; - } else { - return { - resources: serverlessResources, - tag: esServerlessImageUrlOrTag, - host: serverlessHost, - }; - } + return { + ...commonOptions, + ...(esServerlessImageUrlOrTag.includes(':') + ? { image: esServerlessImageUrlOrTag } + : { tag: esServerlessImageUrlOrTag }), + }; } - return { - resources: serverlessResources, - host: serverlessHost, - }; + return commonOptions; } diff --git a/packages/kbn-text-based-editor/src/editor_footer.tsx b/packages/kbn-text-based-editor/src/editor_footer.tsx index 5070e2d5789e7..d31f731821bb3 100644 --- a/packages/kbn-text-based-editor/src/editor_footer.tsx +++ b/packages/kbn-text-based-editor/src/editor_footer.tsx @@ -19,6 +19,8 @@ import { EuiPopoverTitle, EuiDescriptionList, EuiDescriptionListDescription, + EuiButton, + useEuiTheme, } from '@elastic/eui'; import { Interpolation, Theme, css } from '@emotion/react'; import { css as classNameCss } from '@emotion/css'; @@ -60,12 +62,14 @@ export function ErrorsWarningsPopover({ type, setIsPopoverOpen, onErrorClick, + isSpaceReduced, }: { isPopoverOpen: boolean; items: MonacoError[]; type: 'error' | 'warning'; setIsPopoverOpen: (flag: boolean) => void; onErrorClick: (error: MonacoError) => void; + isSpaceReduced?: boolean; }) { const strings = getConstsByType(type, items.length); return ( @@ -90,7 +94,7 @@ export function ErrorsWarningsPopover({ setIsPopoverOpen(!isPopoverOpen); }} > -

    {strings.message}

    +

    {isSpaceReduced ? items.length : strings.message}

    } ownFocus={false} @@ -151,8 +155,11 @@ interface EditorFooterProps { warning?: MonacoError[]; detectTimestamp: boolean; onErrorClick: (error: MonacoError) => void; - refreshErrors: () => void; + runQuery: () => void; hideRunQueryText?: boolean; + disableSubmitAction?: boolean; + editorIsInline?: boolean; + isSpaceReduced?: boolean; } export const EditorFooter = memo(function EditorFooter({ @@ -162,10 +169,15 @@ export const EditorFooter = memo(function EditorFooter({ warning, detectTimestamp, onErrorClick, - refreshErrors, + runQuery, hideRunQueryText, + disableSubmitAction, + editorIsInline, + isSpaceReduced, }: EditorFooterProps) { + const { euiTheme } = useEuiTheme(); const [isPopoverOpen, setIsPopoverOpen] = useState(false); + return ( - {errors && errors.length > 0 && ( - - )} - {warning && warning.length > 0 && ( - - )}

    @@ -206,23 +200,22 @@ export const EditorFooter = memo(function EditorFooter({ - - -

    - {detectTimestamp + {isSpaceReduced + ? '@timestamp' + : detectTimestamp ? i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.timestampDetected', { - defaultMessage: '@timestamp detected', + defaultMessage: '@timestamp found', } ) : i18n.translate( 'textBasedEditor.query.textBasedLanguagesEditor.timestampNotDetected', { - defaultMessage: '@timestamp not detected', + defaultMessage: '@timestamp not found', } )}

    @@ -230,6 +223,26 @@ export const EditorFooter = memo(function EditorFooter({
    + {errors && errors.length > 0 && ( + + )} + {warning && warning.length > 0 && ( + + )}
    {!hideRunQueryText && ( @@ -255,6 +268,53 @@ export const EditorFooter = memo(function EditorFooter({ )} + {Boolean(editorIsInline) && ( + + + + + {isSpaceReduced + ? i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.run', { + defaultMessage: 'Run', + }) + : i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.runQuery', { + defaultMessage: 'Run query', + })} + + + + {COMMAND_KEY}⏎ + + + + + + )} ); }); diff --git a/packages/kbn-text-based-editor/src/resizable_button.tsx b/packages/kbn-text-based-editor/src/resizable_button.tsx index fb4ee944bc2f5..5a52d67780ca6 100644 --- a/packages/kbn-text-based-editor/src/resizable_button.tsx +++ b/packages/kbn-text-based-editor/src/resizable_button.tsx @@ -13,11 +13,13 @@ import { css } from '@emotion/react'; export function ResizableButton({ onMouseDownResizeHandler, onKeyDownResizeHandler, + editorIsInline, }: { onMouseDownResizeHandler: ( mouseDownEvent: React.MouseEvent | React.TouchEvent ) => void; onKeyDownResizeHandler: (keyDownEvernt: React.KeyboardEvent) => void; + editorIsInline?: boolean; }) { return ( { let position = isCompactFocused ? ('absolute' as 'absolute') : ('relative' as 'relative'); // cast string to type 'relative' | 'absolute' if (isCodeEditorExpanded) { @@ -33,7 +34,9 @@ export const textBasedLanguagedEditorStyles = ( zIndex: isCompactFocused ? 4 : 0, height: `${editorHeight}px`, border: isCompactFocused ? euiTheme.border.thin : 'none', - borderTopLeftRadius: isCodeEditorExpanded ? 0 : '6px', + borderLeft: editorIsInline || !isCompactFocused ? 'none' : euiTheme.border.thin, + borderRight: editorIsInline || !isCompactFocused ? 'none' : euiTheme.border.thin, + borderTopLeftRadius: isCodeEditorExpanded ? 0 : euiTheme.border.radius.medium, borderBottom: isCodeEditorExpanded ? 'none' : isCompactFocused @@ -45,8 +48,8 @@ export const textBasedLanguagedEditorStyles = ( width: isCodeEditorExpanded ? '100%' : `calc(100% - ${hasReference ? 80 : 40}px)`, alignItems: isCompactFocused ? 'flex-start' : 'center', border: !isCompactFocused ? euiTheme.border.thin : 'none', - borderTopLeftRadius: '6px', - borderBottomLeftRadius: '6px', + borderTopLeftRadius: euiTheme.border.radius.medium, + borderBottomLeftRadius: euiTheme.border.radius.medium, borderBottomWidth: hasErrors ? '2px' : '1px', borderBottomColor: hasErrors ? euiTheme.colors.danger : euiTheme.colors.lightShade, }, @@ -66,6 +69,8 @@ export const textBasedLanguagedEditorStyles = ( }, bottomContainer: { border: euiTheme.border.thin, + borderLeft: editorIsInline ? 'none' : euiTheme.border.thin, + borderRight: editorIsInline ? 'none' : euiTheme.border.thin, borderTop: isCodeEditorExpanded && !isCodeEditorExpandedFocused ? hasErrors @@ -75,29 +80,29 @@ export const textBasedLanguagedEditorStyles = ( backgroundColor: euiTheme.colors.lightestShade, paddingLeft: euiTheme.size.base, paddingRight: euiTheme.size.base, - paddingTop: euiTheme.size.xs, - paddingBottom: euiTheme.size.xs, + paddingTop: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, + paddingBottom: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, width: 'calc(100% + 2px)', position: 'relative' as 'relative', // cast string to type 'relative', marginTop: 0, marginLeft: 0, marginBottom: 0, - borderBottomLeftRadius: '6px', - borderBottomRightRadius: '6px', + borderBottomLeftRadius: editorIsInline ? 0 : euiTheme.border.radius.medium, + borderBottomRightRadius: editorIsInline ? 0 : euiTheme.border.radius.medium, }, topContainer: { - border: euiTheme.border.thin, - borderTopLeftRadius: '6px', - borderTopRightRadius: '6px', + border: editorIsInline ? 'none' : euiTheme.border.thin, + borderTopLeftRadius: editorIsInline ? 0 : euiTheme.border.radius.medium, + borderTopRightRadius: editorIsInline ? 0 : euiTheme.border.radius.medium, backgroundColor: euiTheme.colors.lightestShade, paddingLeft: euiTheme.size.base, paddingRight: euiTheme.size.base, - paddingTop: euiTheme.size.xs, - paddingBottom: euiTheme.size.xs, + paddingTop: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, + paddingBottom: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, width: 'calc(100% + 2px)', position: 'relative' as 'relative', // cast string to type 'relative', marginLeft: 0, - marginTop: euiTheme.size.s, + marginTop: editorIsInline ? 0 : euiTheme.size.s, }, dragResizeContainer: { width: '100%', diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx index 0be4c38eed749..173c023f8b619 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.test.tsx @@ -84,7 +84,7 @@ describe('TextBasedLanguagesEditor', () => { }); }); - it('should render the date info with no @timestamp detected', async () => { + it('should render the date info with no @timestamp found', async () => { const newProps = { ...props, isCodeEditorExpanded: true, @@ -93,11 +93,11 @@ describe('TextBasedLanguagesEditor', () => { const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps })); expect( component.find('[data-test-subj="TextBasedLangEditor-date-info"]').at(0).text() - ).toStrictEqual('@timestamp not detected'); + ).toStrictEqual('@timestamp not found'); }); }); - it('should render the date info with @timestamp detected if detectTimestamp is true', async () => { + it('should render the date info with @timestamp found if detectTimestamp is true', async () => { const newProps = { ...props, isCodeEditorExpanded: true, @@ -107,7 +107,7 @@ describe('TextBasedLanguagesEditor', () => { const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps })); expect( component.find('[data-test-subj="TextBasedLangEditor-date-info"]').at(0).text() - ).toStrictEqual('@timestamp detected'); + ).toStrictEqual('@timestamp found'); }); }); @@ -265,4 +265,24 @@ describe('TextBasedLanguagesEditor', () => { expect(component.find('[data-test-subj="TextBasedLangEditor-run-query"]').length).toBe(0); }); }); + + it('should render correctly if editorIsInline prop is set to true', async () => { + const onTextLangQuerySubmit = jest.fn(); + const newProps = { + ...props, + isCodeEditorExpanded: true, + hideRunQueryText: true, + editorIsInline: true, + onTextLangQuerySubmit, + }; + await act(async () => { + const component = mount(renderTextBasedLanguagesEditorComponent({ ...newProps })); + expect(component.find('[data-test-subj="TextBasedLangEditor-run-query"]').length).toBe(0); + expect( + component.find('[data-test-subj="TextBasedLangEditor-run-query-button"]').length + ).not.toBe(1); + findTestSubject(component, 'TextBasedLangEditor-run-query-button').simulate('click'); + expect(onTextLangQuerySubmit).toHaveBeenCalled(); + }); + }); }); diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index 312d08cadf0c2..9a5eae37ed097 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -65,19 +65,43 @@ import { fetchFieldsFromESQL } from './fetch_fields_from_esql'; import './overwrite.scss'; export interface TextBasedLanguagesEditorProps { + /** The aggregate type query */ query: AggregateQuery; + /** Callback running everytime the query changes */ onTextLangQueryChange: (query: AggregateQuery) => void; - onTextLangQuerySubmit: () => void; + /** Callback running when the user submits the query */ + onTextLangQuerySubmit: (query?: AggregateQuery) => void; + /** Can be used to expand/minimize the editor */ expandCodeEditor: (status: boolean) => void; + /** If it is true, the editor initializes with height EDITOR_INITIAL_HEIGHT_EXPANDED */ isCodeEditorExpanded: boolean; + /** If it is true, the editor displays the message @timestamp found + * The text based queries are relying on adhoc dataviews which + * can have an @timestamp timefield or nothing + */ detectTimestamp?: boolean; + /** Array of errors */ errors?: Error[]; + /** Warning string as it comes from ES */ warning?: string; + /** Disables the editor */ isDisabled?: boolean; + /** Indicator if the editor is on dark mode */ isDarkMode?: boolean; dataTestSubj?: string; + /** If true it hides the minimize button and the user can't return to the minimized version + * Useful when the application doesn't want to give this capability + */ hideMinimizeButton?: boolean; + /** Hide the Run query information which appears on the footer*/ hideRunQueryText?: boolean; + /** This is used for applications (such as the inline editing flyout in dashboards) + * which want to add the editor without being part of the Unified search component + * It renders a submit query button inside the editor + */ + editorIsInline?: boolean; + /** Disables the submit query action*/ + disableSubmitAction?: boolean; } interface TextBasedEditorDeps { @@ -94,6 +118,9 @@ const EDITOR_ONE_LINER_UNUSED_SPACE_WITH_ERRORS = 220; const KEYCODE_ARROW_UP = 38; const KEYCODE_ARROW_DOWN = 40; +// for editor width smaller than this value we want to start hiding some text +const BREAKPOINT_WIDTH = 410; + const languageId = (language: string) => { switch (language) { case 'esql': { @@ -125,6 +152,8 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ isDarkMode, hideMinimizeButton, hideRunQueryText, + editorIsInline, + disableSubmitAction, dataTestSubj, }: TextBasedLanguagesEditorProps) { const { euiTheme } = useEuiTheme(); @@ -137,6 +166,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [editorHeight, setEditorHeight] = useState( isCodeEditorExpanded ? EDITOR_INITIAL_HEIGHT_EXPANDED : EDITOR_INITIAL_HEIGHT ); + const [isSpaceReduced, setIsSpaceReduced] = useState(false); const [showLineNumbers, setShowLineNumbers] = useState(isCodeEditorExpanded); const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); @@ -166,7 +196,8 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ Boolean(errors?.length), Boolean(warning), isCodeEditorExpandedFocused, - Boolean(documentationSections) + Boolean(documentationSections), + Boolean(editorIsInline) ); const isDark = isDarkMode; const editorModel = useRef(); @@ -216,6 +247,11 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ [editorHeight] ); + const onQuerySubmit = useCallback(() => { + const currentValue = editor1.current?.getValue(); + onTextLangQuerySubmit({ [language]: currentValue } as AggregateQuery); + }, [language, onTextLangQuerySubmit]); + const restoreInitialMode = () => { setIsCodeEditorExpandedFocused(false); if (isCodeEditorExpanded) return; @@ -355,6 +391,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ }, [code, isCodeEditorExpanded, isWordWrapped]); const onResize = ({ width }: { width: number }) => { + setIsSpaceReduced(Boolean(editorIsInline && width < BREAKPOINT_WIDTH)); calculateVisibleCode(width); if (editor1.current) { editor1.current.layout({ width, height: editorHeight }); @@ -514,6 +551,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ { expandCodeEditor(false); updateLinesFromModel = false; @@ -582,8 +621,10 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ )}

    @@ -782,6 +826,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ language={ String(language) === 'esql' ? 'ES|QL' : String(language).toUpperCase() } + searchInDescription sections={documentationSections} buttonProps={{ display: 'empty', @@ -816,15 +861,19 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ errors={editorErrors} warning={editorWarning} onErrorClick={onErrorClick} - refreshErrors={onTextLangQuerySubmit} + runQuery={onQuerySubmit} detectTimestamp={detectTimestamp} hideRunQueryText={hideRunQueryText} + editorIsInline={editorIsInline} + disableSubmitAction={disableSubmitAction} + isSpaceReduced={isSpaceReduced} /> )} {isCodeEditorExpanded && ( )} diff --git a/packages/kbn-ui-actions-browser/index.ts b/packages/kbn-ui-actions-browser/index.ts index 9662013cf99e3..076b77680826b 100644 --- a/packages/kbn-ui-actions-browser/index.ts +++ b/packages/kbn-ui-actions-browser/index.ts @@ -15,7 +15,5 @@ export { visualizeGeoFieldTrigger, ROW_CLICK_TRIGGER, rowClickTrigger, - CATEGORIZE_FIELD_TRIGGER, - categorizeFieldTrigger, defaultTrigger, } from './src/triggers'; diff --git a/packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts b/packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts deleted file mode 100644 index a332a21acb431..0000000000000 --- a/packages/kbn-ui-actions-browser/src/triggers/categorize_field_trigger.ts +++ /dev/null @@ -1,16 +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 { Trigger } from './trigger'; - -export const CATEGORIZE_FIELD_TRIGGER = 'CATEGORIZE_FIELD_TRIGGER'; -export const categorizeFieldTrigger: Trigger = { - id: CATEGORIZE_FIELD_TRIGGER, - title: 'Run pattern analysis', - description: 'Triggered when user wants to run pattern analysis on a field.', -}; diff --git a/packages/kbn-ui-actions-browser/src/triggers/index.ts b/packages/kbn-ui-actions-browser/src/triggers/index.ts index 433a9cd6dff40..091305791d858 100644 --- a/packages/kbn-ui-actions-browser/src/triggers/index.ts +++ b/packages/kbn-ui-actions-browser/src/triggers/index.ts @@ -11,4 +11,3 @@ export * from './row_click_trigger'; export * from './default_trigger'; export * from './visualize_field_trigger'; export * from './visualize_geo_field_trigger'; -export * from './categorize_field_trigger'; diff --git a/packages/kbn-unified-data-table/__mocks__/data_view_without_timefield.ts b/packages/kbn-unified-data-table/__mocks__/data_view_without_timefield.ts new file mode 100644 index 0000000000000..cc07103a54486 --- /dev/null +++ b/packages/kbn-unified-data-table/__mocks__/data_view_without_timefield.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { DataView } from '@kbn/data-views-plugin/public'; +import { buildDataViewMock } from '@kbn/discover-utils/src/__mocks__'; + +const fields = [ + { + name: '_index', + type: 'string', + scripted: false, + filterable: true, + }, + { + name: 'timestamp', + displayName: 'timestamp', + type: 'date', + scripted: false, + filterable: true, + aggregatable: true, + sortable: true, + }, + { + name: 'message', + displayName: 'message', + type: 'string', + scripted: false, + filterable: false, + }, + { + name: 'extension', + displayName: 'extension', + type: 'string', + scripted: false, + filterable: true, + aggregatable: true, + }, + { + name: 'bytes', + displayName: 'bytes', + type: 'number', + scripted: false, + filterable: true, + aggregatable: true, + }, + { + name: 'scripted', + displayName: 'scripted', + type: 'number', + scripted: true, + filterable: false, + }, +] as DataView['fields']; + +export const dataViewWithoutTimefieldMock = buildDataViewMock({ + name: 'index-pattern-without-timefield', + fields, + timeFieldName: undefined, +}); diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index 4ce88e52e6c8d..1f05601fd6892 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -56,7 +56,12 @@ import { getDisplayedColumns } from '../utils/columns'; import { convertValueToString } from '../utils/convert_value_to_string'; import { getRowsPerPageOptions } from '../utils/rows_per_page'; import { getRenderCellValueFn } from '../utils/get_render_cell_value'; -import { getEuiGridColumns, getLeadControlColumns, getVisibleColumns } from './data_table_columns'; +import { + getEuiGridColumns, + getLeadControlColumns, + getVisibleColumns, + hasSourceTimeFieldValue, +} from './data_table_columns'; import { UnifiedDataTableContext } from '../table_context'; import { getSchemaDetectors } from './data_table_schema'; import { DataTableDocumentToolbarBtn } from './data_table_document_selection'; @@ -617,9 +622,15 @@ export const UnifiedDataTable = ({ [dataView, onFieldEdited, services.dataViewFieldEditor] ); + const shouldShowTimeField = useMemo( + () => + hasSourceTimeFieldValue(displayedColumns, dataView, columnTypes, showTimeCol, isPlainRecord), + [dataView, displayedColumns, isPlainRecord, showTimeCol, columnTypes] + ); + const visibleColumns = useMemo( - () => getVisibleColumns(displayedColumns, dataView, showTimeCol), - [dataView, displayedColumns, showTimeCol] + () => getVisibleColumns(displayedColumns, dataView, shouldShowTimeField), + [dataView, displayedColumns, shouldShowTimeField] ); const getCellValue = useCallback( diff --git a/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx b/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx index 38cbdb5aeb63a..e1d7082353e1c 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_columns.test.tsx @@ -7,8 +7,14 @@ */ import { dataViewMock } from '@kbn/discover-utils/src/__mocks__'; -import { getEuiGridColumns, getVisibleColumns } from './data_table_columns'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { + getEuiGridColumns, + getVisibleColumns, + hasSourceTimeFieldValue, +} from './data_table_columns'; import { dataViewWithTimefieldMock } from '../../__mocks__/data_view_with_timefield'; +import { dataViewWithoutTimefieldMock } from '../../__mocks__/data_view_without_timefield'; import { dataTableContextMock } from '../../__mocks__/table_context'; import { servicesMock } from '../../__mocks__/services'; @@ -110,6 +116,133 @@ describe('Data table columns', function () { }); }); + describe('hasSourceTimeFieldValue', () => { + function buildColumnTypes(dataView: DataView) { + const columnTypes: Record = {}; + for (const field of dataView.fields) { + columnTypes[field.name] = ''; + } + return columnTypes; + } + + describe('dataView with timeField', () => { + it('should forward showTimeCol if no _source columns is passed', () => { + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['extension', 'message'], + dataViewWithTimefieldMock, + buildColumnTypes(dataViewWithTimefieldMock), + showTimeCol, + false + ) + ).toBe(showTimeCol); + } + }); + + it('should forward showTimeCol if no _source columns is passed, text-based datasource', () => { + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['extension', 'message'], + dataViewWithTimefieldMock, + buildColumnTypes(dataViewWithTimefieldMock), + showTimeCol, + true + ) + ).toBe(showTimeCol); + } + }); + + it('should forward showTimeCol if _source column is passed', () => { + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['_source'], + dataViewWithTimefieldMock, + buildColumnTypes(dataViewWithTimefieldMock), + showTimeCol, + false + ) + ).toBe(showTimeCol); + } + }); + + it('should return true if _source column is passed, text-based datasource', () => { + // ... | DROP @timestamp test case + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['_source'], + dataViewWithTimefieldMock, + buildColumnTypes(dataViewWithTimefieldMock), + showTimeCol, + true + ) + ).toBe(true); + } + }); + }); + + describe('dataView without timeField', () => { + it('should forward showTimeCol if no _source columns is passed', () => { + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['extension', 'message'], + dataViewWithoutTimefieldMock, + buildColumnTypes(dataViewWithoutTimefieldMock), + showTimeCol, + false + ) + ).toBe(showTimeCol); + } + }); + + it('should forward showTimeCol if no _source columns is passed, text-based datasource', () => { + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['extension', 'message'], + dataViewWithoutTimefieldMock, + buildColumnTypes(dataViewWithoutTimefieldMock), + showTimeCol, + true + ) + ).toBe(showTimeCol); + } + }); + + it('should forward showTimeCol if _source column is passed', () => { + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['_source'], + dataViewWithoutTimefieldMock, + buildColumnTypes(dataViewWithoutTimefieldMock), + showTimeCol, + false + ) + ).toBe(showTimeCol); + } + }); + + it('should return false if _source column is passed, text-based datasource', () => { + for (const showTimeCol of [true, false]) { + expect( + hasSourceTimeFieldValue( + ['_source'], + dataViewWithoutTimefieldMock, + buildColumnTypes(dataViewWithoutTimefieldMock), + showTimeCol, + true + ) + ).toBe(showTimeCol); + } + }); + }); + }); + describe('column tokens', () => { it('returns eui grid columns with tokens', async () => { const actual = getEuiGridColumns({ diff --git a/packages/kbn-unified-data-table/src/components/data_table_columns.tsx b/packages/kbn-unified-data-table/src/components/data_table_columns.tsx index 274b1148df4eb..f7a3d41bf330e 100644 --- a/packages/kbn-unified-data-table/src/components/data_table_columns.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table_columns.tsx @@ -267,6 +267,20 @@ export function getEuiGridColumns({ ); } +export function hasSourceTimeFieldValue( + columns: string[], + dataView: DataView, + columnTypes: DataTableColumnTypes | undefined, + showTimeCol: boolean, + isPlainRecord: boolean +) { + const timeFieldName = dataView.timeFieldName; + if (!isPlainRecord || !columns.includes('_source') || !timeFieldName || !columnTypes) { + return showTimeCol; + } + return timeFieldName in columnTypes; +} + export function getVisibleColumns(columns: string[], dataView: DataView, showTimeCol: boolean) { const timeFieldName = dataView.timeFieldName; diff --git a/packages/kbn-unified-doc-viewer/src/services/types.ts b/packages/kbn-unified-doc-viewer/src/services/types.ts index 071704e0559a2..25493db97d09e 100644 --- a/packages/kbn-unified-doc-viewer/src/services/types.ts +++ b/packages/kbn-unified-doc-viewer/src/services/types.ts @@ -36,6 +36,7 @@ export interface DocViewRenderProps { columnTypes?: Record; query?: Query | AggregateQuery; textBasedHits?: DataTableRecord[]; + hideActionsColumn?: boolean; filter?: DocViewFilterFn; onAddColumn?: (columnName: string) => void; onRemoveColumn?: (columnName: string) => void; diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.ts b/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.ts index afeb34e6572af..007a88b2c7f97 100644 --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.ts +++ b/packages/kbn-unified-field-list/src/components/field_categorize_button/categorize_trigger_utils.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import type { UiActionsStart, CategorizeFieldContext } from '@kbn/ui-actions-plugin/public'; -import { CATEGORIZE_FIELD_TRIGGER } from '@kbn/ui-actions-browser/src/triggers'; +import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import { CATEGORIZE_FIELD_TRIGGER, type CategorizeFieldContext } from '@kbn/ml-ui-actions'; import type { DataViewField, DataView } from '@kbn/data-views-plugin/public'; async function getCompatibleActions( diff --git a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.test.tsx b/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.test.tsx index 4e0d00b4549ca..45569b3443370 100644 --- a/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.test.tsx +++ b/packages/kbn-unified-field-list/src/components/field_categorize_button/field_categorize_button.test.tsx @@ -14,9 +14,12 @@ import { stubLogstashDataView as dataView } from '@kbn/data-views-plugin/common/ import { ActionInternal } from '@kbn/ui-actions-plugin/public'; import { uiActionsPluginMock } from '@kbn/ui-actions-plugin/public/mocks'; import { getFieldCategorizeButton } from './field_categorize_button'; -import { ACTION_CATEGORIZE_FIELD, CategorizeFieldContext } from '@kbn/ui-actions-plugin/public'; +import { + CATEGORIZE_FIELD_TRIGGER, + ACTION_CATEGORIZE_FIELD, + type CategorizeFieldContext, +} from '@kbn/ml-ui-actions'; import { TriggerContract } from '@kbn/ui-actions-plugin/public/triggers'; -import { CATEGORIZE_FIELD_TRIGGER } from '@kbn/ui-actions-browser'; const ORIGINATING_APP = 'test'; const mockExecuteAction = jest.fn(); diff --git a/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx b/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx index 4f5b71384b326..929627537bbb9 100755 --- a/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx +++ b/packages/kbn-unified-field-list/src/components/field_stats/field_stats.tsx @@ -270,7 +270,7 @@ const FieldStatsComponent: React.FC = ({ const [showingHistogram, setShowingHistogram] = useState(histogramDefault); if (isLoading) { - return ; + return ; } if (!dataView) { diff --git a/packages/kbn-unified-field-list/tsconfig.json b/packages/kbn-unified-field-list/tsconfig.json index 27cbb23cf3d7c..eeca808e1bee7 100644 --- a/packages/kbn-unified-field-list/tsconfig.json +++ b/packages/kbn-unified-field-list/tsconfig.json @@ -31,6 +31,7 @@ "@kbn/ebt-tools", "@kbn/shared-ux-button-toolbar", "@kbn/field-utils", + "@kbn/ml-ui-actions", ], "exclude": ["target/**/*"] } diff --git a/packages/shared-ux/chrome/navigation/__jest__/__snapshots__/project_navigation.test.tsx.snap b/packages/shared-ux/chrome/navigation/__jest__/__snapshots__/project_navigation.test.tsx.snap index 65ed8b80aa8a3..fd5e1b1af30e0 100644 --- a/packages/shared-ux/chrome/navigation/__jest__/__snapshots__/project_navigation.test.tsx.snap +++ b/packages/shared-ux/chrome/navigation/__jest__/__snapshots__/project_navigation.test.tsx.snap @@ -5,21 +5,14 @@ Array [ Object { "children": Array [ Object { - "children": undefined, "deepLink": undefined, "href": undefined, "id": "item1", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "item1", - ], + "path": "group1.item1", "sideNavStatus": "visible", "title": "Item 1", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "", "href": "", @@ -27,19 +20,13 @@ Array [ "title": "Title from deeplink!", "url": "", }, - "href": undefined, + "href": "", "id": "item2", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "item2", - ], + "path": "group1.item2", "sideNavStatus": "visible", "title": "Title from deeplink!", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "", "href": "", @@ -47,14 +34,9 @@ Array [ "title": "Title from deeplink!", "url": "", }, - "href": undefined, + "href": "", "id": "item3", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "item3", - ], + "path": "group1.item3", "sideNavStatus": "visible", "title": "Deeplink title overriden", }, @@ -62,11 +44,7 @@ Array [ "deepLink": undefined, "href": undefined, "id": "group1", - "isActive": false, - "isGroup": true, - "path": Array [ - "group1", - ], + "path": "group1", "sideNavStatus": "visible", "title": "Group 1", "type": "navGroup", @@ -74,7 +52,6 @@ Array [ Object { "children": Array [ Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/discover", @@ -82,19 +59,13 @@ Array [ "title": "Deeplink discover", "url": "/mocked/discover", }, - "href": undefined, + "href": "/mocked/discover", "id": "discover", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:analytics", - "discover", - ], + "path": "rootNav:analytics.discover", "sideNavStatus": "visible", "title": "Deeplink discover", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/dashboards", @@ -102,19 +73,13 @@ Array [ "title": "Deeplink dashboards", "url": "/mocked/dashboards", }, - "href": undefined, + "href": "/mocked/dashboards", "id": "dashboards", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:analytics", - "dashboards", - ], + "path": "rootNav:analytics.dashboards", "sideNavStatus": "visible", "title": "Deeplink dashboards", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/visualize", @@ -122,14 +87,9 @@ Array [ "title": "Deeplink visualize", "url": "/mocked/visualize", }, - "href": undefined, + "href": "/mocked/visualize", "id": "visualize", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:analytics", - "visualize", - ], + "path": "rootNav:analytics.visualize", "sideNavStatus": "visible", "title": "Deeplink visualize", }, @@ -138,11 +98,7 @@ Array [ "href": undefined, "icon": "stats", "id": "rootNav:analytics", - "isActive": false, - "isGroup": true, - "path": Array [ - "rootNav:analytics", - ], + "path": "rootNav:analytics", "renderAs": "accordion", "sideNavStatus": "visible", "title": "Data exploration", @@ -151,7 +107,6 @@ Array [ Object { "children": Array [ Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:overview", @@ -159,19 +114,13 @@ Array [ "title": "Deeplink ml:overview", "url": "/mocked/ml:overview", }, - "href": undefined, + "href": "/mocked/ml:overview", "id": "ml:overview", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:overview", - ], + "path": "rootNav:ml.ml:overview", "sideNavStatus": "visible", "title": "Deeplink ml:overview", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:notifications", @@ -179,19 +128,13 @@ Array [ "title": "Deeplink ml:notifications", "url": "/mocked/ml:notifications", }, - "href": undefined, + "href": "/mocked/ml:notifications", "id": "ml:notifications", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:notifications", - ], + "path": "rootNav:ml.ml:notifications", "sideNavStatus": "visible", "title": "Deeplink ml:notifications", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:memoryUsage", @@ -199,14 +142,9 @@ Array [ "title": "Deeplink ml:memoryUsage", "url": "/mocked/ml:memoryUsage", }, - "href": undefined, + "href": "/mocked/ml:memoryUsage", "id": "ml:memoryUsage", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:memoryUsage", - ], + "path": "rootNav:ml.ml:memoryUsage", "sideNavStatus": "visible", "title": "Deeplink ml:memoryUsage", }, @@ -214,7 +152,6 @@ Array [ "children": Array [ Object { "breadcrumbStatus": "hidden", - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:anomalyDetection", @@ -222,20 +159,13 @@ Array [ "title": "Deeplink ml:anomalyDetection", "url": "/mocked/ml:anomalyDetection", }, - "href": undefined, + "href": "/mocked/ml:anomalyDetection", "id": "ml:anomalyDetection", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:anomalyDetection", - "ml:anomalyDetection", - ], + "path": "rootNav:ml.ml:anomalyDetection.ml:anomalyDetection", "sideNavStatus": "visible", "title": "Jobs", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:anomalyExplorer", @@ -243,20 +173,13 @@ Array [ "title": "Deeplink ml:anomalyExplorer", "url": "/mocked/ml:anomalyExplorer", }, - "href": undefined, + "href": "/mocked/ml:anomalyExplorer", "id": "ml:anomalyExplorer", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:anomalyDetection", - "ml:anomalyExplorer", - ], + "path": "rootNav:ml.ml:anomalyDetection.ml:anomalyExplorer", "sideNavStatus": "visible", "title": "Deeplink ml:anomalyExplorer", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:singleMetricViewer", @@ -264,20 +187,13 @@ Array [ "title": "Deeplink ml:singleMetricViewer", "url": "/mocked/ml:singleMetricViewer", }, - "href": undefined, + "href": "/mocked/ml:singleMetricViewer", "id": "ml:singleMetricViewer", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:anomalyDetection", - "ml:singleMetricViewer", - ], + "path": "rootNav:ml.ml:anomalyDetection.ml:singleMetricViewer", "sideNavStatus": "visible", "title": "Deeplink ml:singleMetricViewer", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:settings", @@ -285,15 +201,9 @@ Array [ "title": "Deeplink ml:settings", "url": "/mocked/ml:settings", }, - "href": undefined, + "href": "/mocked/ml:settings", "id": "ml:settings", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:anomalyDetection", - "ml:settings", - ], + "path": "rootNav:ml.ml:anomalyDetection.ml:settings", "sideNavStatus": "visible", "title": "Deeplink ml:settings", }, @@ -305,14 +215,9 @@ Array [ "title": "Deeplink ml:anomalyDetection", "url": "/mocked/ml:anomalyDetection", }, - "href": undefined, + "href": "/mocked/ml:anomalyDetection", "id": "ml:anomalyDetection", - "isActive": false, - "isGroup": true, - "path": Array [ - "rootNav:ml", - "ml:anomalyDetection", - ], + "path": "rootNav:ml.ml:anomalyDetection", "renderAs": "accordion", "sideNavStatus": "visible", "title": "Anomaly Detection", @@ -321,7 +226,6 @@ Array [ "children": Array [ Object { "breadcrumbStatus": "hidden", - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:dataFrameAnalytics", @@ -329,20 +233,13 @@ Array [ "title": "Deeplink ml:dataFrameAnalytics", "url": "/mocked/ml:dataFrameAnalytics", }, - "href": undefined, + "href": "/mocked/ml:dataFrameAnalytics", "id": "ml:dataFrameAnalytics", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:dataFrameAnalytics", - "ml:dataFrameAnalytics", - ], + "path": "rootNav:ml.ml:dataFrameAnalytics.ml:dataFrameAnalytics", "sideNavStatus": "visible", "title": "Jobs", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:resultExplorer", @@ -350,20 +247,13 @@ Array [ "title": "Deeplink ml:resultExplorer", "url": "/mocked/ml:resultExplorer", }, - "href": undefined, + "href": "/mocked/ml:resultExplorer", "id": "ml:resultExplorer", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:dataFrameAnalytics", - "ml:resultExplorer", - ], + "path": "rootNav:ml.ml:dataFrameAnalytics.ml:resultExplorer", "sideNavStatus": "visible", "title": "Deeplink ml:resultExplorer", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:analyticsMap", @@ -371,15 +261,9 @@ Array [ "title": "Deeplink ml:analyticsMap", "url": "/mocked/ml:analyticsMap", }, - "href": undefined, + "href": "/mocked/ml:analyticsMap", "id": "ml:analyticsMap", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "ml:dataFrameAnalytics", - "ml:analyticsMap", - ], + "path": "rootNav:ml.ml:dataFrameAnalytics.ml:analyticsMap", "sideNavStatus": "visible", "title": "Deeplink ml:analyticsMap", }, @@ -391,14 +275,9 @@ Array [ "title": "Deeplink ml:dataFrameAnalytics", "url": "/mocked/ml:dataFrameAnalytics", }, - "href": undefined, + "href": "/mocked/ml:dataFrameAnalytics", "id": "ml:dataFrameAnalytics", - "isActive": false, - "isGroup": true, - "path": Array [ - "rootNav:ml", - "ml:dataFrameAnalytics", - ], + "path": "rootNav:ml.ml:dataFrameAnalytics", "renderAs": "accordion", "sideNavStatus": "visible", "title": "Data Frame Analytics", @@ -406,7 +285,6 @@ Array [ Object { "children": Array [ Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:nodesOverview", @@ -414,20 +292,13 @@ Array [ "title": "Deeplink ml:nodesOverview", "url": "/mocked/ml:nodesOverview", }, - "href": undefined, + "href": "/mocked/ml:nodesOverview", "id": "ml:nodesOverview", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "model_management", - "ml:nodesOverview", - ], + "path": "rootNav:ml.model_management.ml:nodesOverview", "sideNavStatus": "visible", "title": "Deeplink ml:nodesOverview", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:nodes", @@ -435,15 +306,9 @@ Array [ "title": "Deeplink ml:nodes", "url": "/mocked/ml:nodes", }, - "href": undefined, + "href": "/mocked/ml:nodes", "id": "ml:nodes", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "model_management", - "ml:nodes", - ], + "path": "rootNav:ml.model_management.ml:nodes", "sideNavStatus": "visible", "title": "Deeplink ml:nodes", }, @@ -451,12 +316,7 @@ Array [ "deepLink": undefined, "href": undefined, "id": "model_management", - "isActive": false, - "isGroup": true, - "path": Array [ - "rootNav:ml", - "model_management", - ], + "path": "rootNav:ml.model_management", "renderAs": "accordion", "sideNavStatus": "visible", "title": "Model Management", @@ -464,7 +324,6 @@ Array [ Object { "children": Array [ Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:fileUpload", @@ -472,20 +331,13 @@ Array [ "title": "Deeplink ml:fileUpload", "url": "/mocked/ml:fileUpload", }, - "href": undefined, + "href": "/mocked/ml:fileUpload", "id": "ml:fileUpload", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "data_visualizer", - "ml:fileUpload", - ], + "path": "rootNav:ml.data_visualizer.ml:fileUpload", "sideNavStatus": "visible", "title": "File", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:indexDataVisualizer", @@ -494,20 +346,13 @@ Array [ "url": "/mocked/ml:indexDataVisualizer", }, "getIsActive": [Function], - "href": undefined, + "href": "/mocked/ml:indexDataVisualizer", "id": "ml:indexDataVisualizer", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "data_visualizer", - "ml:indexDataVisualizer", - ], + "path": "rootNav:ml.data_visualizer.ml:indexDataVisualizer", "sideNavStatus": "visible", "title": "Data view", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:dataDrift", @@ -516,15 +361,9 @@ Array [ "url": "/mocked/ml:dataDrift", }, "getIsActive": [Function], - "href": undefined, + "href": "/mocked/ml:dataDrift", "id": "ml:dataDrift", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "data_visualizer", - "ml:dataDrift", - ], + "path": "rootNav:ml.data_visualizer.ml:dataDrift", "sideNavStatus": "visible", "title": "Data drift", }, @@ -532,12 +371,7 @@ Array [ "deepLink": undefined, "href": undefined, "id": "data_visualizer", - "isActive": false, - "isGroup": true, - "path": Array [ - "rootNav:ml", - "data_visualizer", - ], + "path": "rootNav:ml.data_visualizer", "renderAs": "accordion", "sideNavStatus": "visible", "title": "Data Visualizer", @@ -545,7 +379,6 @@ Array [ Object { "children": Array [ Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:logRateAnalysis", @@ -554,20 +387,13 @@ Array [ "url": "/mocked/ml:logRateAnalysis", }, "getIsActive": [Function], - "href": undefined, + "href": "/mocked/ml:logRateAnalysis", "id": "ml:logRateAnalysis", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "aiops_labs", - "ml:logRateAnalysis", - ], + "path": "rootNav:ml.aiops_labs.ml:logRateAnalysis", "sideNavStatus": "visible", "title": "Deeplink ml:logRateAnalysis", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:logPatternAnalysis", @@ -576,20 +402,13 @@ Array [ "url": "/mocked/ml:logPatternAnalysis", }, "getIsActive": [Function], - "href": undefined, + "href": "/mocked/ml:logPatternAnalysis", "id": "ml:logPatternAnalysis", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "aiops_labs", - "ml:logPatternAnalysis", - ], + "path": "rootNav:ml.aiops_labs.ml:logPatternAnalysis", "sideNavStatus": "visible", "title": "Deeplink ml:logPatternAnalysis", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/ml:changePointDetections", @@ -598,15 +417,9 @@ Array [ "url": "/mocked/ml:changePointDetections", }, "getIsActive": [Function], - "href": undefined, + "href": "/mocked/ml:changePointDetections", "id": "ml:changePointDetections", - "isActive": false, - "isGroup": false, - "path": Array [ - "rootNav:ml", - "aiops_labs", - "ml:changePointDetections", - ], + "path": "rootNav:ml.aiops_labs.ml:changePointDetections", "sideNavStatus": "visible", "title": "Deeplink ml:changePointDetections", }, @@ -614,12 +427,7 @@ Array [ "deepLink": undefined, "href": undefined, "id": "aiops_labs", - "isActive": false, - "isGroup": true, - "path": Array [ - "rootNav:ml", - "aiops_labs", - ], + "path": "rootNav:ml.aiops_labs", "renderAs": "accordion", "sideNavStatus": "visible", "title": "AIOps labs", @@ -629,17 +437,12 @@ Array [ "href": undefined, "icon": "machineLearningApp", "id": "rootNav:ml", - "isActive": false, - "isGroup": true, - "path": Array [ - "rootNav:ml", - ], + "path": "rootNav:ml", "sideNavStatus": "visible", "title": "Machine Learning", "type": "navGroup", }, Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/dev_tools", @@ -647,14 +450,10 @@ Array [ "title": "Deeplink dev_tools", "url": "/mocked/dev_tools", }, - "href": undefined, + "href": "/mocked/dev_tools", "icon": "editorCodeBlock", "id": "devTools", - "isActive": false, - "isGroup": false, - "path": Array [ - "devTools", - ], + "path": "devTools", "sideNavStatus": "visible", "title": "Developer tools", "type": "navItem", @@ -663,7 +462,6 @@ Array [ "breadcrumbStatus": "hidden", "children": Array [ Object { - "children": undefined, "deepLink": Object { "baseUrl": "/mocked", "href": "http://mocked/management", @@ -671,42 +469,25 @@ Array [ "title": "Deeplink management", "url": "/mocked/management", }, - "href": undefined, + "href": "/mocked/management", "id": "management", - "isActive": false, - "isGroup": false, - "path": Array [ - "project_settings_project_nav", - "management", - ], + "path": "project_settings_project_nav.management", "sideNavStatus": "visible", "title": "Management", }, Object { - "children": undefined, "deepLink": undefined, "href": "https://cloud.elastic.co/deployments/123456789/security/users", "id": "cloudLinkUserAndRoles", - "isActive": false, - "isGroup": false, - "path": Array [ - "project_settings_project_nav", - "cloudLinkUserAndRoles", - ], + "path": "project_settings_project_nav.cloudLinkUserAndRoles", "sideNavStatus": "visible", "title": "Mock Users & Roles", }, Object { - "children": undefined, "deepLink": undefined, "href": "https://cloud.elastic.co/account/billing", "id": "cloudLinkBilling", - "isActive": false, - "isGroup": false, - "path": Array [ - "project_settings_project_nav", - "cloudLinkBilling", - ], + "path": "project_settings_project_nav.cloudLinkBilling", "sideNavStatus": "visible", "title": "Mock Billing & Subscriptions", }, @@ -715,11 +496,7 @@ Array [ "href": undefined, "icon": "gear", "id": "project_settings_project_nav", - "isActive": false, - "isGroup": true, - "path": Array [ - "project_settings_project_nav", - ], + "path": "project_settings_project_nav", "sideNavStatus": "visible", "title": "Project settings", "type": "navGroup", diff --git a/packages/shared-ux/chrome/navigation/__jest__/active_node.test.tsx b/packages/shared-ux/chrome/navigation/__jest__/active_node.test.tsx index a0c35ace442e4..5a82d4ccd509b 100644 --- a/packages/shared-ux/chrome/navigation/__jest__/active_node.test.tsx +++ b/packages/shared-ux/chrome/navigation/__jest__/active_node.test.tsx @@ -8,36 +8,35 @@ import './setup_jest_mocks'; import React from 'react'; import { type RenderResult, act } from '@testing-library/react'; -import { type Observable, of, BehaviorSubject } from 'rxjs'; +import { of, BehaviorSubject } from 'rxjs'; import type { - ChromeNavLink, ChromeProjectNavigation, ChromeProjectNavigationNode, } from '@kbn/core-chrome-browser'; import { Navigation } from '../src/ui/components/navigation'; import type { RootNavigationItemDefinition } from '../src/ui/types'; - +import { NavigationServices } from '../types'; import { renderNavigation, errorHandler, TestType } from './utils'; describe('Active node', () => { test('should set the active node', async () => { - const navLinks$: Observable = of([ - { + const deepLinks$: NavigationServices['deepLinks$'] = of({ + item1: { id: 'item1', title: 'Item 1', baseUrl: '', url: '', href: '', }, - { + item2: { id: 'item2', title: 'Item 2', baseUrl: '', url: '', href: '', }, - ]); + }); let activeNodes$: BehaviorSubject; @@ -47,12 +46,12 @@ describe('Active node', () => { { id: 'group1', title: 'Group 1', - path: ['group1'], + path: 'group1', }, { id: 'item1', title: 'Item 1', - path: ['group1', 'item1'], + path: 'group1.item1', }, ], ]); @@ -75,12 +74,12 @@ describe('Active node', () => { { id: 'group1', title: 'Group 1', - path: ['group1'], + path: 'group1', }, { id: 'item2', title: 'Item 2', - path: ['group1', 'item2'], + path: 'group1.item2', }, ], ]); @@ -112,7 +111,7 @@ describe('Active node', () => { const renderResult = renderNavigation({ navTreeDef: { body: navigationBody }, - services: { navLinks$, activeNodes$: getActiveNodes$() }, + services: { deepLinks$, activeNodes$: getActiveNodes$() }, }); await runTests('treeDef', renderResult); @@ -131,7 +130,7 @@ describe('Active node', () => { ), - services: { navLinks$, activeNodes$: getActiveNodes$() }, + services: { deepLinks$, activeNodes$: getActiveNodes$() }, }); await runTests('uiComponents', renderResult); @@ -139,15 +138,15 @@ describe('Active node', () => { }); test('should override the URL location to set the active node', async () => { - const navLinks$: Observable = of([ - { + const deepLinks$: NavigationServices['deepLinks$'] = of({ + item1: { id: 'item1', title: 'Item 1', baseUrl: '', url: '', href: '', }, - ]); + }); let activeNodes$: BehaviorSubject; @@ -197,7 +196,7 @@ describe('Active node', () => { const renderResult = renderNavigation({ navTreeDef: { body: navigationBody }, - services: { navLinks$, activeNodes$: getActiveNodes$() }, + services: { deepLinks$, activeNodes$: getActiveNodes$() }, onProjectNavigationChange, }); @@ -223,7 +222,7 @@ describe('Active node', () => { ), onProjectNavigationChange, - services: { navLinks$, activeNodes$: getActiveNodes$() }, + services: { deepLinks$, activeNodes$: getActiveNodes$() }, }); await runTests('uiComponents', renderResult); diff --git a/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx b/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx index df8246df69d5e..2487df25c0e64 100644 --- a/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx +++ b/packages/shared-ux/chrome/navigation/__jest__/build_nav_tree.test.tsx @@ -8,13 +8,12 @@ import './setup_jest_mocks'; import React from 'react'; import { type RenderResult } from '@testing-library/react'; -import { type Observable, of } from 'rxjs'; +import { of } from 'rxjs'; import type { ChromeNavLink } from '@kbn/core-chrome-browser'; import { navLinksMock } from '../mocks/src/navlinks'; import { Navigation } from '../src/ui/components/navigation'; import type { RootNavigationItemDefinition } from '../src/ui/types'; - import { getMockFn, renderNavigation, @@ -23,6 +22,7 @@ import { type ProjectNavigationChangeListener, } from './utils'; import { getServicesMock } from '../mocks/src/jest'; +import { NavigationServices } from '../types'; const { cloudLinks: mockCloudLinks } = getServicesMock(); @@ -110,65 +110,38 @@ describe('builds navigation tree', () => { Object { "children": Array [ Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item1", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "item1", - ], + "path": "group1.item1", "sideNavStatus": "visible", "title": "Item 1", }, Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item2", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "item2", - ], + "path": "group1.item2", "sideNavStatus": "visible", "title": "Item 2", }, Object { "children": Array [ Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item1", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "group1A", - "item1", - ], + "path": "group1.group1A.item1", "sideNavStatus": "visible", "title": "Group 1A Item 1", }, Object { "children": Array [ Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item1", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "group1A", - "group1A_1", - "item1", - ], + "path": "group1.group1A.group1A_1.item1", "sideNavStatus": "visible", "title": "Group 1A_1 Item 1", }, @@ -176,38 +149,25 @@ describe('builds navigation tree', () => { "deepLink": undefined, "href": undefined, "id": "group1A_1", - "isActive": false, - "isGroup": true, - "path": Array [ - "group1", - "group1A", - "group1A_1", - ], + "path": "group1.group1A.group1A_1", "sideNavStatus": "visible", "title": "Group1A_1", }, ], "deepLink": undefined, + "defaultIsCollapsed": false, "href": undefined, "id": "group1A", - "isActive": true, - "isGroup": true, - "path": Array [ - "group1", - "group1A", - ], + "path": "group1.group1A", "sideNavStatus": "visible", "title": "Group1A", }, ], "deepLink": undefined, + "defaultIsCollapsed": false, "href": undefined, "id": "group1", - "isActive": true, - "isGroup": true, - "path": Array [ - "group1", - ], + "path": "group1", "sideNavStatus": "visible", "title": "", "type": "navGroup", @@ -246,65 +206,38 @@ describe('builds navigation tree', () => { Object { "children": Array [ Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item1", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "item1", - ], + "path": "group1.item1", "sideNavStatus": "visible", "title": "Item 1", }, Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item2", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "item2", - ], + "path": "group1.item2", "sideNavStatus": "visible", "title": "Item 2", }, Object { "children": Array [ Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item1", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "group1A", - "item1", - ], + "path": "group1.group1A.item1", "sideNavStatus": "visible", "title": "Group 1A Item 1", }, Object { "children": Array [ Object { - "children": undefined, "deepLink": undefined, "href": "https://foo", "id": "item1", - "isActive": false, - "isGroup": false, - "path": Array [ - "group1", - "group1A", - "group1A_1", - "item1", - ], + "path": "group1.group1A.group1A_1.item1", "sideNavStatus": "visible", "title": "Group 1A_1 Item 1", }, @@ -312,13 +245,7 @@ describe('builds navigation tree', () => { "deepLink": undefined, "href": undefined, "id": "group1A_1", - "isActive": false, - "isGroup": true, - "path": Array [ - "group1", - "group1A", - "group1A_1", - ], + "path": "group1.group1A.group1A_1", "sideNavStatus": "visible", "title": "Group1A_1", }, @@ -326,24 +253,16 @@ describe('builds navigation tree', () => { "deepLink": undefined, "href": undefined, "id": "group1A", - "isActive": false, - "isGroup": true, - "path": Array [ - "group1", - "group1A", - ], + "path": "group1.group1A", "sideNavStatus": "visible", "title": "Group1A", }, ], "deepLink": undefined, + "defaultIsCollapsed": false, "href": undefined, "id": "group1", - "isActive": true, - "isGroup": true, - "path": Array [ - "group1", - ], + "path": "group1", "sideNavStatus": "visible", "title": "", }, @@ -353,16 +272,19 @@ describe('builds navigation tree', () => { }); test('should read the title from deeplink, prop or React children', async () => { - const navLinks$: Observable = of([ - ...navLinksMock, - { + const deepLinks$: NavigationServices['deepLinks$'] = of({ + ...navLinksMock.reduce>((acc, navLink) => { + acc[navLink.id] = navLink; + return acc; + }, {}), + item1: { id: 'item1', title: 'Title from deeplink', baseUrl: '', url: '', href: '', }, - ]); + }); const onProjectNavigationChange = getMockFn(); @@ -425,7 +347,7 @@ describe('builds navigation tree', () => { const renderResult = renderNavigation({ navTreeDef: { body: navigationBody }, - services: { navLinks$ }, + services: { deepLinks$ }, onProjectNavigationChange, }); @@ -454,7 +376,7 @@ describe('builds navigation tree', () => { ), - services: { navLinks$ }, + services: { deepLinks$ }, onProjectNavigationChange, }); @@ -466,15 +388,15 @@ describe('builds navigation tree', () => { }); test('should not render the group if it does not have children AND no href or deeplink', async () => { - const navLinks$: Observable = of([ - { + const deepLinks$: NavigationServices['deepLinks$'] = of({ + item1: { id: 'item1', title: 'Title from deeplink', baseUrl: '', url: '', href: '', }, - ]); + }); const onProjectNavigationChange = getMockFn(); const runTests = (type: TestType, { queryByTestId }: RenderResult) => { @@ -523,7 +445,7 @@ describe('builds navigation tree', () => { const renderResult = renderNavigation({ navTreeDef: { body: navigationBody }, - services: { navLinks$ }, + services: { deepLinks$ }, onProjectNavigationChange, }); @@ -548,7 +470,7 @@ describe('builds navigation tree', () => { ), - services: { navLinks$ }, + services: { deepLinks$ }, onProjectNavigationChange, }); @@ -663,11 +585,7 @@ describe('builds navigation tree', () => { const renderResult = renderNavigation({ navigationElement: ( - - - - - + ), services: { recentlyAccessed$ }, diff --git a/packages/shared-ux/chrome/navigation/__jest__/links.test.tsx b/packages/shared-ux/chrome/navigation/__jest__/links.test.tsx index 56da3d4494c89..c52f56e3075d4 100644 --- a/packages/shared-ux/chrome/navigation/__jest__/links.test.tsx +++ b/packages/shared-ux/chrome/navigation/__jest__/links.test.tsx @@ -8,12 +8,11 @@ import './setup_jest_mocks'; import React from 'react'; import { type RenderResult } from '@testing-library/react'; -import { type Observable, of } from 'rxjs'; -import type { ChromeNavLink } from '@kbn/core-chrome-browser'; +import { of } from 'rxjs'; import { Navigation } from '../src/ui/components/navigation'; import type { RootNavigationItemDefinition } from '../src/ui/types'; - +import { NavigationServices } from '../types'; import { getMockFn, renderNavigation, @@ -27,15 +26,15 @@ describe('Links', () => { const onProjectNavigationChange = getMockFn(); const unknownLinkId = 'unknown'; - const navLinks$: Observable = of([ - { + const deepLinks$: NavigationServices['deepLinks$'] = of({ + item1: { id: 'item1', title: 'Title from deeplink', baseUrl: '', url: '', href: '', }, - ]); + }); const runTests = async (type: TestType, { findByTestId, queryByTestId }: RenderResult) => { try { @@ -84,7 +83,7 @@ describe('Links', () => { const renderResult = renderNavigation({ navTreeDef: { body: navigationBody }, onProjectNavigationChange, - services: { navLinks$ }, + services: { deepLinks$ }, }); await runTests('treeDef', renderResult); @@ -108,7 +107,7 @@ describe('Links', () => { ), onProjectNavigationChange, - services: { navLinks$ }, + services: { deepLinks$ }, }); await runTests('uiComponents', renderResult); diff --git a/packages/shared-ux/chrome/navigation/__jest__/panel.test.tsx b/packages/shared-ux/chrome/navigation/__jest__/panel.test.tsx index 40641eb31d2d2..e588ed384c112 100644 --- a/packages/shared-ux/chrome/navigation/__jest__/panel.test.tsx +++ b/packages/shared-ux/chrome/navigation/__jest__/panel.test.tsx @@ -13,7 +13,7 @@ import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; import { Navigation } from '../src/ui/components/navigation'; import type { RootNavigationItemDefinition } from '../src/ui/types'; - +import { PanelContentProvider } from '../src/ui'; import { renderNavigation, errorHandler, @@ -21,7 +21,6 @@ import { getMockFn, ProjectNavigationChangeListener, } from './utils'; -import { PanelContentProvider } from '../src/ui'; describe('Panel', () => { test('should render group as panel opener', async () => { @@ -187,7 +186,7 @@ describe('Panel', () => { const [path0 = []] = activeNodes; return (
    -

    {selectedNode.id}

    +

    {selectedNode.path}

      {path0.map((node) => (
    • {node.id}
    • @@ -207,12 +206,12 @@ describe('Panel', () => { { id: 'activeGroup1', title: 'Group 1', - path: ['activeGroup1'], + path: 'activeGroup1', }, { id: 'activeItem1', title: 'Item 1', - path: ['activeGroup1', 'activeItem1'], + path: 'activeGroup1.activeItem1', }, ], ]); diff --git a/packages/shared-ux/chrome/navigation/__jest__/project_navigation.test.tsx b/packages/shared-ux/chrome/navigation/__jest__/project_navigation.test.tsx index 7b47c466b838b..a707d1e84b192 100644 --- a/packages/shared-ux/chrome/navigation/__jest__/project_navigation.test.tsx +++ b/packages/shared-ux/chrome/navigation/__jest__/project_navigation.test.tsx @@ -6,12 +6,12 @@ * Side Public License, v 1. */ import './setup_jest_mocks'; -import { type Observable, of } from 'rxjs'; +import { of } from 'rxjs'; import type { ChromeNavLink } from '@kbn/core-chrome-browser'; import { navLinksMock } from '../mocks/src/navlinks'; +import { NavigationServices } from '../types'; import type { ProjectNavigationTreeDefinition } from '../src/ui/types'; - import { getMockFn, renderNavigation, type ProjectNavigationChangeListener } from './utils'; describe('Default navigation', () => { @@ -22,16 +22,19 @@ describe('Default navigation', () => { */ test('builds the full navigation tree when only the project is provided', async () => { const onProjectNavigationChange = getMockFn(); - const navLinks$: Observable = of([ - ...navLinksMock, - { + const deepLinks$: NavigationServices['deepLinks$'] = of({ + ...navLinksMock.reduce>((acc, navLink) => { + acc[navLink.id] = navLink; + return acc; + }, {}), + item2: { id: 'item2', title: 'Title from deeplink!', baseUrl: '', url: '', href: '', }, - ]); + }); const projectNavigationTree: ProjectNavigationTreeDefinition = [ { @@ -62,7 +65,7 @@ describe('Default navigation', () => { renderNavigation({ projectNavigationTree, onProjectNavigationChange, - services: { navLinks$ }, + services: { deepLinks$ }, }); expect(onProjectNavigationChange).toHaveBeenCalled(); diff --git a/packages/shared-ux/chrome/navigation/mocks/src/jest.ts b/packages/shared-ux/chrome/navigation/mocks/src/jest.ts index 9ae6c2b2a6952..750b3faada7b1 100644 --- a/packages/shared-ux/chrome/navigation/mocks/src/jest.ts +++ b/packages/shared-ux/chrome/navigation/mocks/src/jest.ts @@ -13,18 +13,25 @@ import { navLinksMock } from './navlinks'; const activeNodes: ChromeProjectNavigationNode[][] = []; +const defaultDeepLinks = { + ...navLinksMock.reduce>((acc, navLink) => { + acc[navLink.id] = navLink; + return acc; + }, {}), +}; + export const getServicesMock = ({ - navLinks = navLinksMock, -}: { navLinks?: ChromeNavLink[] } = {}): NavigationServices => { + deepLinks = defaultDeepLinks, +}: { deepLinks?: Readonly> } = {}): NavigationServices => { const navigateToUrl = jest.fn().mockResolvedValue(undefined); const basePath = { prepend: jest.fn((path: string) => `/base${path}`) }; const recentlyAccessed$ = new BehaviorSubject([]); - const navLinks$ = new BehaviorSubject(navLinks); + const deepLinks$ = new BehaviorSubject(deepLinks); return { basePath, recentlyAccessed$, - navLinks$, + deepLinks$, navIsOpen: true, navigateToUrl, onProjectNavigationChange: jest.fn(), diff --git a/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts b/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts index df1416ec0f793..7a7d0e5fbe3ea 100644 --- a/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts +++ b/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts @@ -14,7 +14,7 @@ import { NavigationServices } from '../../types'; type Arguments = NavigationServices; export type Params = Pick< Arguments, - 'navIsOpen' | 'recentlyAccessed$' | 'activeNodes$' | 'navLinks$' | 'onProjectNavigationChange' + 'navIsOpen' | 'recentlyAccessed$' | 'activeNodes$' | 'deepLinks$' | 'onProjectNavigationChange' >; export class StorybookMock extends AbstractStorybookMock<{}, NavigationServices> { @@ -41,7 +41,7 @@ export class StorybookMock extends AbstractStorybookMock<{}, NavigationServices> basePath: { prepend: (suffix: string) => `/basepath${suffix}` }, navigateToUrl, recentlyAccessed$: params.recentlyAccessed$ ?? new BehaviorSubject([]), - navLinks$: params.navLinks$ ?? new BehaviorSubject([]), + deepLinks$: params.deepLinks$ ?? new BehaviorSubject({}), onProjectNavigationChange: params.onProjectNavigationChange ?? (() => undefined), activeNodes$: params.activeNodes$ ?? new BehaviorSubject([]), isSideNavCollapsed: true, diff --git a/packages/shared-ux/chrome/navigation/src/cloud_links.tsx b/packages/shared-ux/chrome/navigation/src/cloud_links.tsx index ce9d9e5990aab..b900daa340b44 100644 --- a/packages/shared-ux/chrome/navigation/src/cloud_links.tsx +++ b/packages/shared-ux/chrome/navigation/src/cloud_links.tsx @@ -7,7 +7,6 @@ */ import { i18n } from '@kbn/i18n'; import type { CloudLinkId } from '@kbn/core-chrome-browser'; -import type { CloudStart } from '@kbn/cloud-plugin/public'; export interface CloudLink { title: string; @@ -18,7 +17,12 @@ export type CloudLinks = { [id in CloudLinkId]?: CloudLink; }; -export const getCloudLinks = (cloud: CloudStart): CloudLinks => { +export const getCloudLinks = (cloud: { + billingUrl?: string; + deploymentUrl?: string; + performanceUrl?: string; + usersAndRolesUrl?: string; +}): CloudLinks => { const { billingUrl, deploymentUrl, performanceUrl, usersAndRolesUrl } = cloud; const links: CloudLinks = {}; diff --git a/packages/shared-ux/chrome/navigation/src/navnode_utils.ts b/packages/shared-ux/chrome/navigation/src/navnode_utils.ts new file mode 100644 index 0000000000000..daabf3af54d9c --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/navnode_utils.ts @@ -0,0 +1,171 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { + AppDeepLinkId, + ChromeNavLink, + ChromeProjectNavigationNode, + CloudLinkId, + SideNavNodeStatus, +} from '@kbn/core-chrome-browser'; + +import type { CloudLinks } from './cloud_links'; +import type { NodeProps } from './ui/types'; +import { getNavigationNodeHref, getNavigationNodeId, isAbsoluteLink } from './utils'; + +/** + * We don't have currently a way to know if a user has access to a Cloud section. + * TODO: This function will have to be revisited once we have an API from Cloud to know the user + * permissions. + */ +function hasUserAccessToCloudLink(): boolean { + return true; +} + +function getNodeStatus( + { + link, + deepLink, + cloudLink, + sideNavStatus, + }: { + link?: string; + deepLink?: ChromeNavLink; + cloudLink?: CloudLinkId; + sideNavStatus?: SideNavNodeStatus; + }, + { cloudLinks }: { cloudLinks: CloudLinks } +): SideNavNodeStatus | 'remove' { + if (link && !deepLink) { + // If a link is provided, but no deepLink is found, don't render anything + return 'remove'; + } + + if (cloudLink) { + if (!cloudLinks[cloudLink]) { + // Invalid cloudLinkId or link url has not been set in kibana.yml + return 'remove'; + } + if (!hasUserAccessToCloudLink()) return 'remove'; + } + + if (deepLink && deepLink.hidden) return 'hidden'; + + return sideNavStatus ?? 'visible'; +} + +function getTitleForNode< + LinkId extends AppDeepLinkId = AppDeepLinkId, + Id extends string = string, + ChildrenId extends string = Id +>( + navNode: NodeProps, + { deepLink, cloudLinks }: { deepLink?: ChromeNavLink; cloudLinks: CloudLinks } +): string { + const { children } = navNode; + if (navNode.title) { + return navNode.title; + } + + if (typeof children === 'string') { + return children; + } + + if (deepLink?.title) { + return deepLink.title; + } + + if (navNode.cloudLink) { + return cloudLinks[navNode.cloudLink]?.title ?? ''; + } + + return ''; +} + +function validateNodeProps< + LinkId extends AppDeepLinkId = AppDeepLinkId, + Id extends string = string, + ChildrenId extends string = Id +>({ id, link, href, cloudLink, renderAs }: NodeProps) { + if (link && cloudLink) { + throw new Error( + `[Chrome navigation] Error in node [${id}]. Only one of "link" or "cloudLink" can be provided.` + ); + } + if (href && cloudLink) { + throw new Error( + `[Chrome navigation] Error in node [${id}]. Only one of "href" or "cloudLink" can be provided.` + ); + } + if (renderAs === 'panelOpener' && !link) { + throw new Error( + `[Chrome navigation] Error in node [${id}]. If renderAs is set to "panelOpener", a "link" must also be provided.` + ); + } + if (renderAs === 'item' && !link) { + throw new Error( + `[Chrome navigation] Error in node [${id}]. If renderAs is set to "item", a "link" must also be provided.` + ); + } +} + +export const initNavNode = < + LinkId extends AppDeepLinkId = AppDeepLinkId, + Id extends string = string, + ChildrenId extends string = Id +>( + node: NodeProps, + { cloudLinks, deepLinks }: { cloudLinks: CloudLinks; deepLinks: Record } +): ChromeProjectNavigationNode | null => { + validateNodeProps(node); + + const { + cloudLink, + link, + parentNodePath, + rootIndex = 0, + treeDepth = 0, + index = 0, + children, + ...navNodeFromProps + } = node; + const deepLink = link !== undefined ? deepLinks[link] : undefined; + const sideNavStatus = getNodeStatus( + { + link, + deepLink, + cloudLink, + sideNavStatus: navNodeFromProps.sideNavStatus, + }, + { cloudLinks } + ); + if (sideNavStatus === 'remove') { + return null; + } + + const id = getNavigationNodeId(node, () => `node-${rootIndex}-${treeDepth}-${index}`) as Id; + const title = getTitleForNode(node, { deepLink, cloudLinks }); + const href = cloudLink ? cloudLinks[cloudLink]?.href : node.href; + const path = parentNodePath ? `${parentNodePath}.${id}` : id; + + if (href && !isAbsoluteLink(href)) { + throw new Error(`href must be an absolute URL. Node id [${id}].`); + } + + const navNode: ChromeProjectNavigationNode = { + ...navNodeFromProps, + id, + href: getNavigationNodeHref({ href, deepLink }), + path, + title, + deepLink, + sideNavStatus, + }; + + return navNode; +}; diff --git a/packages/shared-ux/chrome/navigation/src/services.tsx b/packages/shared-ux/chrome/navigation/src/services.tsx index f77a288160a3d..54e45ede100e4 100644 --- a/packages/shared-ux/chrome/navigation/src/services.tsx +++ b/packages/shared-ux/chrome/navigation/src/services.tsx @@ -8,6 +8,9 @@ import React, { FC, useContext, useMemo } from 'react'; import useObservable from 'react-use/lib/useObservable'; +import { map } from 'rxjs'; +import type { ChromeNavLink } from '@kbn/core-chrome-browser'; + import { NavigationKibanaDependencies, NavigationServices } from '../types'; import { CloudLink, CloudLinks, getCloudLinks } from './cloud_links'; @@ -61,17 +64,31 @@ export const NavigationKibanaProvider: FC = ({ const { chrome, http } = core; const { basePath } = http; const { navigateToUrl } = core.application; + const { billingUrl, deploymentUrl, performanceUrl, usersAndRolesUrl } = cloud; - const cloudLinks: CloudLinks = useMemo( - () => (cloud ? parseCloudURLs(getCloudLinks(cloud)) : {}), - [cloud] - ); + const cloudLinks: CloudLinks = useMemo(() => { + return parseCloudURLs( + getCloudLinks({ billingUrl, deploymentUrl, performanceUrl, usersAndRolesUrl }) + ); + }, [billingUrl, deploymentUrl, performanceUrl, usersAndRolesUrl]); const isSideNavCollapsed = useObservable(chrome.getIsSideNavCollapsed$(), true); + const navLinks$ = useMemo(() => chrome.navLinks.getNavLinks$(), [chrome.navLinks]); + const deepLinks$ = useMemo(() => { + return navLinks$.pipe( + map((navLinks) => { + return navLinks.reduce((acc, navLink) => { + acc[navLink.id] = navLink; + return acc; + }, {} as Record); + }) + ); + }, [navLinks$]); + const value: NavigationServices = { basePath, recentlyAccessed$: chrome.recentlyAccessed.get$(), - navLinks$: chrome.navLinks.getNavLinks$(), + deepLinks$, navigateToUrl, navIsOpen: true, onProjectNavigationChange: serverless.setNavigation, diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation.tsx index 8f74abee6a110..d56495b810f4a 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation.tsx @@ -8,19 +8,18 @@ import React, { createContext, - useState, useCallback, ReactNode, useMemo, - useEffect, useContext, useRef, + Children, } from 'react'; import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; -import useDebounce from 'react-use/lib/useDebounce'; import useObservable from 'react-use/lib/useObservable'; import { useNavigation as useNavigationServices } from '../../services'; +import { getChildType } from '../../utils'; import { RegisterFunction, UnRegisterFunction } from '../types'; import { NavigationFooter } from './navigation_footer'; import { NavigationGroup } from './navigation_group'; @@ -31,17 +30,12 @@ import { PanelProvider, type ContentProvider } from './panel'; interface Context { register: RegisterFunction; - updateFooterChildren: (children: ReactNode) => void; unstyled: boolean; activeNodes: ChromeProjectNavigationNode[][]; } const NavigationContext = createContext({ - register: () => ({ - unregister: () => {}, - path: [], - }), - updateFooterChildren: () => {}, + register: () => () => {}, unstyled: false, activeNodes: [], }); @@ -77,83 +71,105 @@ export function Navigation({ const idx = useRef(0); const activeNodes = useObservable(activeNodes$, []); - const [navigationItems, setNavigationItems] = useState< - Record - >({}); - const [debouncedNavigationItems, setDebouncedNavigationItems] = useState< - Record - >({}); - const [footerChildren, setFooterChildren] = useState(null); - - const unregister: UnRegisterFunction = useCallback((id: string) => { - setNavigationItems((prevItems) => { - const updatedItems = { ...prevItems }; - delete updatedItems[id]; - return updatedItems; + const navigationItemsRef = useRef>({}); + + const onNavigationItemsChange = useCallback(() => { + const navigationTree = Object.values(navigationItemsRef.current).sort((a, b) => { + const aOrder = orderChildrenRef.current[a.id]; + const bOrder = orderChildrenRef.current[b.id]; + return aOrder - bOrder; }); - }, []); + + // This will update the navigation tree in the Chrome service (calling the serverless.setNavigation()) + onProjectNavigationChange({ navigationTree }); + }, [onProjectNavigationChange]); + + const unregister = useCallback( + (id: string) => { + const updatedItems = { ...navigationItemsRef.current }; + delete updatedItems[id]; + navigationItemsRef.current = updatedItems; + + onNavigationItemsChange(); + }, + [onNavigationItemsChange] + ); const register = useCallback( - (navNode) => { + (navNode, order): UnRegisterFunction => { if (orderChildrenRef.current[navNode.id] === undefined) { - orderChildrenRef.current[navNode.id] = idx.current++; + orderChildrenRef.current[navNode.id] = order ?? idx.current++; } - setNavigationItems((prevItems) => { - return { - ...prevItems, - [navNode.id]: navNode, - }; - }); + const updatedRef = { ...navigationItemsRef.current, [navNode.id]: navNode }; + navigationItemsRef.current = updatedRef; + + onNavigationItemsChange(); - return { - unregister, - path: [navNode.id], - }; + return () => unregister(navNode.id); }, - [unregister] + [unregister, onNavigationItemsChange] ); const contextValue = useMemo( () => ({ register, - updateFooterChildren: setFooterChildren, unstyled, activeNodes, }), [register, unstyled, activeNodes] ); - useDebounce( - () => { - setDebouncedNavigationItems(navigationItems); - }, - 100, - [navigationItems] - ); + const childrenParsed = useMemo(() => { + let footerChildren: ReactNode; + let rootIndex = 0; + + const parseChildren = (_children: ReactNode, wrapperComponent = '') => { + const parsed: ReactNode[] = []; + Children.forEach(_children, (child, i) => { + if (!React.isValidElement(child)) { + return; + } + + const childType = getChildType(child); + if (childType === 'unknown' && unstyled === false) { + throw new Error( + `${wrapperComponent} only accepts , and as children. Received ${child.type}` + ); + } + + if (childType === 'footer') { + if (footerChildren) { + throw new Error('Only one is allowed'); + } + footerChildren = parseChildren(child.props.children, ''); + return; + } + + // We add a "rootIndex" prop to each child to keep track of the order of the children + // and correctly set the order of nodes in the navigation tree independently of when a + // node register itself (it could be after a deepLink is being activated). + parsed.push({ ...child, props: { ...child.props, rootIndex } }); + rootIndex += 1; + }); - useEffect(() => { - const navigationTree = Object.values(debouncedNavigationItems).sort((a, b) => { - const aOrder = orderChildrenRef.current[a.id]; - const bOrder = orderChildrenRef.current[b.id]; - return aOrder - bOrder; - }); + return parsed; + }; - // This will update the navigation tree in the Chrome service (calling the serverless.setNavigation()) - onProjectNavigationChange({ - navigationTree, - }); - }, [debouncedNavigationItems, onProjectNavigationChange]); + const bodyChildren: ReactNode[] = parseChildren(children); + + return { body: bodyChildren, footer: footerChildren }; + }, [children, unstyled]); return ( - {children} + {childrenParsed.body} diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_footer.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_footer.tsx index d4b78c1e93053..083e8e66ee55a 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_footer.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_footer.tsx @@ -6,23 +6,14 @@ * Side Public License, v 1. */ -import React, { useEffect } from 'react'; -import { useNavigation } from './navigation'; +import { type FC } from 'react'; export interface Props { - children?: React.ReactNode; + children?: JSX.Element[]; } -function NavigationFooterComp({ children }: Props) { - const { updateFooterChildren } = useNavigation(); - - useEffect(() => { - if (children) { - updateFooterChildren(children); - } - }, [children, updateFooterChildren]); - +// Note: this component is only used to detect which children are part of the body and which +// are part of the footer. See the "childrenParsed" value of the component. +export const NavigationFooter: FC = () => { return null; -} - -export const NavigationFooter = React.memo(NavigationFooterComp); +}; diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx index 2f3ecbd381b45..11beb966963a1 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_group.tsx @@ -6,31 +6,98 @@ * Side Public License, v 1. */ -import React, { createContext, useCallback, useMemo, useContext } from 'react'; -import type { AppDeepLinkId, ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; +import React, { useMemo, Children, ReactNode, useEffect, useRef } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import deepEqual from 'react-fast-compare'; +import type { + AppDeepLinkId, + ChromeProjectNavigationNode, + ChromeNavLink, +} from '@kbn/core-chrome-browser'; import { useNavigation as useNavigationServices } from '../../services'; -import { useInitNavNode } from '../hooks'; -import type { NodeProps, NodePropsEnhanced, RegisterFunction } from '../types'; +import type { NodeProps } from '../types'; import { NavigationSectionUI } from './navigation_section_ui'; import { useNavigation } from './navigation'; import { NavigationBucket, type Props as NavigationBucketProps } from './navigation_bucket'; +import { generateUniqueNodeId, getChildType } from '../../utils'; +import { initNavNode } from '../../navnode_utils'; +import { CloudLinks } from '../../cloud_links'; + +/** + * Handler to convert the JSX children of the NavigationGroup to the ChromeProjectNavigationNode + * interface. We do that by parsing the children with the React.Children func, read their prop + * and initiate the node objects. + */ +const jsxChildrenToNavigationNode = ( + { + parentNodePath, + jsxChildren, + rootIndex, + treeDepth, + }: { parentNodePath: string; jsxChildren?: ReactNode; rootIndex: number; treeDepth: number }, + { cloudLinks, deepLinks }: { cloudLinks: CloudLinks; deepLinks: Record } +): ChromeProjectNavigationNode[] | undefined => { + if (!jsxChildren) return undefined; + + const navigationNodes: ChromeProjectNavigationNode[] = []; + + Children.forEach(jsxChildren, (child, index) => { + if (!React.isValidElement(child)) { + return; + } + const title = + typeof child.props.children === 'string' ? child.props.children : child.props.title; + const childNode = initNavNode( + { ...child.props, title, rootIndex, treeDepth, index, parentNodePath }, + { cloudLinks, deepLinks } + ); -interface Context { - register: RegisterFunction; -} + if (!childNode) return; + + const childType = getChildType(child); + + if (childType !== 'group') { + if (childType === 'item') { + if (child.props.children && typeof child.props.children !== 'string') { + // Render the node item + childNode.renderItem = () => child.props.children; + } + navigationNodes.push(childNode); + } else { + // This is a custom JSX node, render it "as is" in the nav. + navigationNodes.push({ + id: generateUniqueNodeId(), + title: '', + path: '', + renderItem: () => child, + }); + } + return; + } -export const NavigationGroupContext = createContext(undefined); + if (child.props?.children) { + navigationNodes.push({ + ...childNode, + // Recursively add all the children of the group + children: jsxChildrenToNavigationNode( + { + parentNodePath: childNode.path, + jsxChildren: child.props.children, + rootIndex, + treeDepth: treeDepth + 1, + }, + { cloudLinks, deepLinks } + ), + }); + return; + } -export function useNavigationGroup( - throwIfNotFound: T = true as T -): T extends true ? Context : Context | undefined { - const context = useContext(NavigationGroupContext); - if (!context && throwIfNotFound) { - throw new Error('useNavigationGroup must be used within a NavigationGroup provider'); - } - return context as T extends true ? Context : Context | undefined; -} + navigationNodes.push(childNode); + }); + + return navigationNodes.length > 0 ? navigationNodes : undefined; +}; export interface Props< LinkId extends AppDeepLinkId = AppDeepLinkId, @@ -45,82 +112,60 @@ function NavigationGroupInternalComp< Id extends string = string, ChildrenId extends string = Id >(props: Props) { - const { cloudLinks } = useNavigationServices(); - const navigationContext = useNavigation(); - - const { children, node } = useMemo(() => { - const { children: _children, defaultIsCollapsed, ...rest } = props; - const nodeEnhanced: Omit, 'children'> = { - ...rest, - isActive: defaultIsCollapsed !== undefined ? defaultIsCollapsed === false : undefined, - isGroup: true, - }; - return { - children: _children, - node: nodeEnhanced, - }; - }, [props]); - - const { navNode, registerChildNode, path, childrenNodes } = useInitNavNode(node, { cloudLinks }); + const { cloudLinks, deepLinks$ } = useNavigationServices(); + const { register } = useNavigation(); + const deepLinks = useObservable(deepLinks$, {}); + const { rootIndex = 0 } = props; - // We add to the nav node the children that have mounted and registered themselves. - // Those children render in the UI inside the NavigationSectionUI -> EuiCollapsibleNavItem -> items - const navNodeWithChildren = useMemo(() => { - if (!navNode) return null; + const navNodeRef = useRef(); + const childrenNodesRef = useRef(); - const hasChildren = Object.keys(childrenNodes).length > 0; - const withChildren: ChromeProjectNavigationNode = { - ...navNode, - children: hasChildren ? Object.values(childrenNodes) : undefined, - }; + const navNode = useMemo(() => { + const _navNode = initNavNode(props, { cloudLinks, deepLinks }); - return withChildren; - }, [navNode, childrenNodes]); + if (!_navNode) return null; - const unstyled = props.unstyled ?? navigationContext.unstyled; + const childrenNodes = jsxChildrenToNavigationNode( + { parentNodePath: _navNode.path, jsxChildren: props.children, rootIndex, treeDepth: 1 }, + { cloudLinks, deepLinks } + ); - const renderContent = useCallback(() => { - if (!path || !navNodeWithChildren) { - return null; + const childrenChanged = deepEqual(childrenNodes, childrenNodesRef.current) === false; + if (childrenChanged) { + childrenNodesRef.current = childrenNodes; } - if (navNodeWithChildren.sideNavStatus === 'hidden') return null; + const nextValue = { + ..._navNode, + children: childrenNodesRef.current, + }; - if (unstyled) { - // No UI for unstyled groups - return children; + const hasChanged = deepEqual(nextValue, navNodeRef.current) === false; + if (hasChanged) { + navNodeRef.current = nextValue; } - // We will only render the component for root groups. The nested group - // are handled by the EuiCollapsibleNavItem component through its "items" prop. - const isRootLevel = path && path.length === 1; + if (navNodeRef.current === undefined) { + // Adding this check for TS purpose, it should never be undefined. + throw new Error('Navnode ref is undefined.'); + } - return ( - <> - {isRootLevel && } - {/* We render the children so they mount and can **register** themselves but - visually they don't appear here in the DOM. They are rendered inside the - "items" prop (see ) */} - {children} - - ); - }, [navNodeWithChildren, path, children, unstyled]); + return navNodeRef.current; + }, [props, cloudLinks, deepLinks, rootIndex]); - const contextValue = useMemo(() => { - return { - register: registerChildNode, - }; - }, [registerChildNode]); + /** Register when mounting and whenever the internal nav node changes */ + useEffect(() => { + if (navNode) { + return register(navNode, rootIndex); + } + return undefined; + }, [register, navNode, rootIndex]); - if (!navNode) { + if (!navNode || navNode.sideNavStatus === 'hidden') { return null; } - return ( - - {renderContent()} - - ); + return ; } function NavigationGroupComp< diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item.tsx index dae8cef6f4eee..068f12d7ccd95 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item.tsx @@ -6,16 +6,18 @@ * Side Public License, v 1. */ -import React, { Fragment, useEffect, useMemo } from 'react'; +import React, { Fragment, useEffect, useMemo, useRef } from 'react'; import type { AppDeepLinkId, ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; import { EuiCollapsibleNavItem } from '@elastic/eui'; import classNames from 'classnames'; +import deepEqual from 'react-fast-compare'; +import useObservable from 'react-use/lib/useObservable'; import { useNavigation as useNavigationServices } from '../../services'; -import { useInitNavNode } from '../hooks'; -import type { NodeProps, NodePropsEnhanced } from '../types'; +import type { NodeProps } from '../types'; import { useNavigation } from './navigation'; -import { getNavigationNodeHref } from '../../utils'; +import { isActiveFromUrl } from '../../utils'; +import { initNavNode } from '../../navnode_utils'; export interface Props< LinkId extends AppDeepLinkId = AppDeepLinkId, @@ -30,31 +32,55 @@ function NavigationItemComp< Id extends string = string, ChildrenId extends string = Id >(props: Props) { - const { cloudLinks, navigateToUrl } = useNavigationServices(); - const navigationContext = useNavigation(); - const navNodeRef = React.useRef(null); + const { cloudLinks, navigateToUrl, deepLinks$ } = useNavigationServices(); + const { unstyled: unstyledFromContext, register, activeNodes } = useNavigation(); + const deepLinks = useObservable(deepLinks$, {}); + const navNodeRef = useRef(); + const { rootIndex, appendHorizontalRule } = props; const { children, node } = useMemo(() => { const { children: _children, ...rest } = props; - const nodeEnhanced: Omit, 'children'> = { - ...rest, - isGroup: false, - }; + if (typeof _children === 'string') { - nodeEnhanced.title = nodeEnhanced.title ?? _children; + rest.title = rest.title ?? _children; } + return { children: _children, - node: nodeEnhanced, + node: rest, }; }, [props]); - const unstyled = props.unstyled ?? navigationContext.unstyled; + const unstyled = props.unstyled ?? unstyledFromContext; + + const navNode = useMemo(() => { + const _navNode = initNavNode(node, { cloudLinks, deepLinks }); + if (!_navNode) return null; + + const hasChanged = deepEqual(_navNode, navNodeRef.current) === false; + if (hasChanged) { + navNodeRef.current = _navNode; + } + + if (navNodeRef.current === undefined) { + // Adding this check for TS purpose, it should never be undefined. + throw new Error('Navnode ref is undefined.'); + } - const { navNode } = useInitNavNode(node, { cloudLinks }); + return navNodeRef.current; + }, [node, cloudLinks, deepLinks]); + + if (navNode && appendHorizontalRule) { + throw new Error( + `[Chrome navigation] Error in node [${navNode.id}]. "appendHorizontalRule" can only be added for group with children.` + ); + } useEffect(() => { - navNodeRef.current = navNode; - }, [navNode]); + if (navNode) { + return register(navNode, rootIndex); + } + return undefined; + }, [register, navNode, rootIndex]); if (!navNode) { return null; @@ -71,40 +97,34 @@ function NavigationItemComp< return {navNode.title}; } - const isRootLevel = navNode.path.length === 1; - - if (isRootLevel) { - const href = getNavigationNodeHref(navNode); - const dataTestSubj = classNames(`nav-item`, { - [`nav-item-deepLinkId-${navNode.deepLink?.id}`]: !!navNode.deepLink, - [`nav-item-isActive`]: navNode.isActive, - }); - - return ( - { - e.preventDefault(); - e.stopPropagation(); - if (href) { - navigateToUrl(href); - } - }, - }} - /> - ); - } + const isActive = isActiveFromUrl(navNode.path, activeNodes); + + const { href } = navNode; + const dataTestSubj = classNames(`nav-item`, { + [`nav-item-deepLinkId-${navNode.deepLink?.id}`]: !!navNode.deepLink, + [`nav-item-isActive`]: isActive, + }); - // We don't render anything in the UI for non root item as those register themselves on the parent (Group) - // updating its "childrenNodes" state which are then converted to "items" for the EuiCollapsibleNavItem component. - return null; + return ( + { + e.preventDefault(); + e.stopPropagation(); + if (href) { + navigateToUrl(href); + } + }, + }} + /> + ); } export const NavigationItem = React.memo(NavigationItemComp) as typeof NavigationItemComp; diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx index eb12759eb09d8..8e4475a979a06 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_item_open_panel.tsx @@ -23,9 +23,9 @@ import { } from '@elastic/eui'; import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; import type { NavigateToUrlFn } from '../../../types/internal'; -import { nodePathToString } from '../../utils'; import { useNavigation as useServices } from '../../services'; import { usePanel } from './panel'; +import { isActiveFromUrl } from '../../utils'; const getStyles = (euiTheme: EuiThemeComputed<{}>) => css` * { @@ -47,17 +47,19 @@ const getStyles = (euiTheme: EuiThemeComputed<{}>) => css` interface Props { item: ChromeProjectNavigationNode; navigateToUrl: NavigateToUrlFn; + activeNodes: ChromeProjectNavigationNode[][]; } -export const NavigationItemOpenPanel: FC = ({ item, navigateToUrl }: Props) => { +export const NavigationItemOpenPanel: FC = ({ item, navigateToUrl, activeNodes }: Props) => { const { euiTheme } = useEuiTheme(); const { open: openPanel, close: closePanel, selectedNode } = usePanel(); const { isSideNavCollapsed } = useServices(); - const { title, deepLink, isActive, children } = item; - const id = nodePathToString(item); + const { title, deepLink, children } = item; + const { id, path } = item; const href = deepLink?.url ?? item.href; const isNotMobile = useIsWithinMinBreakpoint('s'); const isIconVisible = isNotMobile && !isSideNavCollapsed && !!children && children.length > 0; + const isActive = isActiveFromUrl(item.path, activeNodes); const itemClassNames = classNames( 'sideNavItem', @@ -65,12 +67,12 @@ export const NavigationItemOpenPanel: FC = ({ item, navigateToUrl }: Prop getStyles(euiTheme) ); - const dataTestSubj = classNames(`nav-item`, `nav-item-${id}`, { + const dataTestSubj = classNames(`nav-item`, `nav-item-${path}`, { [`nav-item-deepLinkId-${deepLink?.id}`]: !!deepLink, [`nav-item-id-${id}`]: id, [`nav-item-isActive`]: isActive, }); - const buttonDataTestSubj = classNames(`panelOpener`, `panelOpener-${id}`, { + const buttonDataTestSubj = classNames(`panelOpener`, `panelOpener-${path}`, { [`panelOpener-deepLinkId-${deepLink?.id}`]: !!deepLink, }); @@ -113,7 +115,7 @@ export const NavigationItemOpenPanel: FC = ({ item, navigateToUrl }: Prop {isIconVisible && ( Boolean(navNod const itemIsVisible = (item: ChromeProjectNavigationNode) => { if (item.sideNavStatus === 'hidden') return false; + if (item.renderItem) return true; + if (nodeHasLink(item)) { return true; } @@ -61,8 +66,8 @@ const getRenderAs = (navNode: ChromeProjectNavigationNode): RenderAs => { }; const getTestSubj = (navNode: ChromeProjectNavigationNode, isActive = false): string => { - const { id, deepLink } = navNode; - return classnames(`nav-item`, `nav-item-${id}`, { + const { id, path, deepLink } = navNode; + return classnames(`nav-item`, `nav-item-${path}`, { [`nav-item-deepLinkId-${deepLink?.id}`]: !!deepLink, [`nav-item-id-${id}`]: id, [`nav-item-isActive`]: isActive, @@ -79,9 +84,7 @@ const filterChildren = ( const serializeNavNode = (navNode: ChromeProjectNavigationNode) => { const serialized: ChromeProjectNavigationNode = { ...navNode, - id: nodePathToString(navNode), children: filterChildren(navNode.children), - href: getNavigationNodeHref(navNode), }; serialized.renderAs = getRenderAs(serialized); @@ -130,7 +133,7 @@ const renderBlockTitle: ( const renderGroup = ( navGroup: ChromeProjectNavigationNode, - groupItems: Array, + groupItems: Array, { spaceBefore = DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS }: { spaceBefore?: EuiThemeSize | null } = {} ): Required['items'] => { let itemPrepend: EuiCollapsibleNavItemProps | EuiCollapsibleNavSubItemProps | null = null; @@ -163,26 +166,30 @@ const nodeToEuiCollapsibleNavProps = ( closePanel, isSideNavCollapsed, treeDepth, - itemsState, + itemsAccordionState, + activeNodes, }: { navigateToUrl: NavigateToUrlFn; openPanel: PanelContext['open']; closePanel: PanelContext['close']; isSideNavCollapsed: boolean; treeDepth: number; - itemsState: AccordionItemsState; + itemsAccordionState: AccordionItemsState; + activeNodes: ChromeProjectNavigationNode[][]; } ): { - items: Array; + items: Array; isVisible: boolean; } => { const { navNode, isItem, hasChildren, hasLink } = serializeNavNode(_navNode); + const isActive = isActiveFromUrl(navNode.path, activeNodes); - const { id, title, href, icon, renderAs, isActive, spaceBefore: _spaceBefore } = navNode; + const { id, path, title, href, icon, renderAs, spaceBefore: _spaceBefore } = navNode; const isExternal = Boolean(href) && isAbsoluteLink(href!); const isAccordion = hasChildren && !isItem; - const isAccordionExpanded = (itemsState[id]?.isCollapsed ?? DEFAULT_IS_COLLAPSED) === false; + const isAccordionExpanded = + (itemsAccordionState[path]?.isCollapsed ?? DEFAULT_IS_COLLAPSED) === false; const isSelected = isAccordion && isAccordionExpanded ? false : isActive; const dataTestSubj = getTestSubj(navNode, isSelected); @@ -195,9 +202,15 @@ const nodeToEuiCollapsibleNavProps = ( } if (renderAs === 'panelOpener') { - const items: EuiCollapsibleNavSubItemProps[] = [ + const items: EuiCollapsibleNavSubItemPropsEnhanced[] = [ { - renderItem: () => , + renderItem: () => ( + + ), }, ]; if (spaceBefore) { @@ -227,7 +240,8 @@ const nodeToEuiCollapsibleNavProps = ( closePanel, isSideNavCollapsed, treeDepth: treeDepth + 1, - itemsState, + itemsAccordionState, + activeNodes, }) ) .filter(({ isVisible }) => isVisible) @@ -264,9 +278,21 @@ const nodeToEuiCollapsibleNavProps = ( // Render as an accordion or a link (handled by EUI) depending if // "items" is undefined or not. If it is undefined --> a link, otherwise an // accordion is rendered. - const items: Array = [ + if (navNode.renderItem) { + return { + items: [ + { + renderItem: navNode.renderItem, + }, + ], + isVisible: true, + }; + } + + const items: Array = [ { id, + path, title, isSelected, linkProps, @@ -317,19 +343,22 @@ interface Props { navNode: ChromeProjectNavigationNode; } -export const NavigationSectionUI: FC = ({ navNode }) => { +export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) => { + const { activeNodes } = useNavigation(); const { navigateToUrl, isSideNavCollapsed } = useServices(); + + const { navNode } = useMemo(() => serializeNavNode(_navNode), [_navNode]); const { open: openPanel, close: closePanel } = usePanel(); const navNodesById = useMemo(() => { const byId = { - [nodePathToString(navNode)]: navNode, + [navNode.path]: navNode, }; const parse = (navNodes?: ChromeProjectNavigationNode[]) => { if (!navNodes) return; navNodes.forEach((childNode) => { - byId[nodePathToString(childNode)] = childNode; + byId[childNode.path] = childNode; parse(childNode.children); }); }; @@ -338,13 +367,21 @@ export const NavigationSectionUI: FC = ({ navNode }) => { return byId; }, [navNode]); - const [itemsState, setItemsState] = useState(() => { + const [itemsAccordionState, setItemsAccordionState] = useState(() => { return Object.entries(navNodesById).reduce((acc, [_id, node]) => { if (node.children) { + let isCollapsed = DEFAULT_IS_COLLAPSED; + let doCollapseFromActiveState = true; + + if (node.defaultIsCollapsed !== undefined) { + isCollapsed = node.defaultIsCollapsed; + doCollapseFromActiveState = false; + } + acc[_id] = { - isCollapsed: !node.isActive ?? DEFAULT_IS_COLLAPSED, + isCollapsed, isCollapsible: node.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE, - doCollapseFromActiveState: true, + doCollapseFromActiveState, }; } return acc; @@ -354,7 +391,8 @@ export const NavigationSectionUI: FC = ({ navNode }) => { const [subItems, setSubItems] = useState(); const toggleAccordion = useCallback((id: string) => { - setItemsState((prev) => { + setItemsAccordionState((prev) => { + // if (prev[id]?.isCollapsed === undefined) return prev; const prevValue = prev[id]?.isCollapsed ?? DEFAULT_IS_COLLAPSED; return { ...prev, @@ -367,13 +405,15 @@ export const NavigationSectionUI: FC = ({ navNode }) => { }); }, []); - const setAccordionProps = useCallback( + const getAccordionProps = useCallback( ( id: string, _accordionProps?: Partial ): Partial | undefined => { - const isCollapsed = itemsState[id]?.isCollapsed ?? DEFAULT_IS_COLLAPSED; - const isCollapsible = itemsState[id]?.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE; + const isCollapsed = itemsAccordionState[id]?.isCollapsed; + const isCollapsible = itemsAccordionState[id]?.isCollapsible; + + if (isCollapsed === undefined) return _accordionProps; // No state set yet let forceState: EuiAccordionProps['forceState'] = isCollapsed ? 'closed' : 'open'; if (!isCollapsible) forceState = 'open'; // Allways open if the accordion is not collapsible @@ -394,7 +434,7 @@ export const NavigationSectionUI: FC = ({ navNode }) => { return updated; }, - [itemsState, toggleAccordion] + [itemsAccordionState, toggleAccordion] ); const { items, isVisible } = useMemo(() => { @@ -404,9 +444,18 @@ export const NavigationSectionUI: FC = ({ navNode }) => { closePanel, isSideNavCollapsed, treeDepth: 0, - itemsState, + itemsAccordionState, + activeNodes, }); - }, [closePanel, isSideNavCollapsed, navNode, navigateToUrl, openPanel, itemsState]); + }, [ + navNode, + navigateToUrl, + openPanel, + closePanel, + isSideNavCollapsed, + itemsAccordionState, + activeNodes, + ]); const [props] = items; const { items: accordionItems } = props; @@ -416,47 +465,74 @@ export const NavigationSectionUI: FC = ({ navNode }) => { } /** - * Effect to set our internal state of each of the accordions (isCollapsed) based on the - * "isActive" state of the navNode. + * Effect to set the internal state of each of the accordions (isCollapsed) based on the + * "isActive" state of the navNode or if its path matches the URL location */ useEffect(() => { - setItemsState((prev) => { - return Object.entries(navNodesById).reduce((acc, [_id, node]) => { - if (node.children && (!prev[_id] || prev[_id].doCollapseFromActiveState)) { - acc[_id] = { - isCollapsed: !node.isActive ?? DEFAULT_IS_COLLAPSED, - isCollapsible: node.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE, - doCollapseFromActiveState: true, - }; - } - return acc; - }, prev); + setItemsAccordionState((prev) => { + return Object.entries(navNodesById).reduce( + (acc, [_id, node]) => { + const prevState = prev[_id]; + + if ( + node.children && + node.renderAs !== 'item' && + (!prevState || prevState.doCollapseFromActiveState === true) + ) { + let nextIsActive = false; + let doCollapseFromActiveState = true; + + if (!prevState && node.defaultIsCollapsed !== undefined) { + nextIsActive = !node.defaultIsCollapsed; + doCollapseFromActiveState = false; + } else { + if (prevState?.doCollapseFromActiveState !== false) { + nextIsActive = isActiveFromUrl(node.path, activeNodes); + } else if (nextIsActive === undefined) { + nextIsActive = !DEFAULT_IS_COLLAPSED; + } + } + + acc[_id] = { + ...prevState, + isCollapsed: !nextIsActive, + isCollapsible: node.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE, + doCollapseFromActiveState, + }; + } + return acc; + }, + { ...prev } + ); }); - }, [navNodesById]); + }, [navNodesById, activeNodes]); useEffect(() => { // Serializer to add recursively the accordionProps to each of the items // that will control its "open"/"closed" state + handler to toggle the state. const serializeAccordionItems = ( - _items?: EuiCollapsibleNavSubItemProps[] + _items?: EuiCollapsibleNavSubItemPropsEnhanced[] ): EuiCollapsibleNavSubItemProps[] | undefined => { if (!_items) return; - return _items.map((item: EuiCollapsibleNavSubItemProps) => { + return _items.map((item) => { if (item.renderItem) { return item; } const parsed: EuiCollapsibleNavSubItemProps = { ...item, items: serializeAccordionItems(item.items), - accordionProps: setAccordionProps(item.id!, item.accordionProps), + accordionProps: + item.items !== undefined + ? getAccordionProps(item.path ?? item.id!, item.accordionProps) + : undefined, }; return parsed; }); }; setSubItems(serializeAccordionItems(accordionItems)); - }, [accordionItems, setAccordionProps]); + }, [accordionItems, getAccordionProps]); if (!isVisible) { return null; @@ -467,7 +543,7 @@ export const NavigationSectionUI: FC = ({ navNode }) => { {...props} className={className} items={subItems} - accordionProps={setAccordionProps(navNode.id)} + accordionProps={getAccordionProps(navNode.path)} /> ); -}; +}); diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/panel/context.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/panel/context.tsx index f9720a38a6655..7eee3515c49c3 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/panel/context.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/panel/context.tsx @@ -9,7 +9,6 @@ import React, { type FC, useCallback, useContext, useMemo, useState, ReactNode } from 'react'; import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; -import { nodePathToString } from '../../../utils'; import { DefaultContent } from './default_content'; import { ContentProvider, PanelNavNode } from './types'; @@ -54,7 +53,7 @@ export const PanelProvider: FC = ({ children, contentProvider, activeNode return null; } - const provided = contentProvider?.(nodePathToString(selectedNode)); + const provided = contentProvider?.(selectedNode.path); if (!provided) { return ; diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx index a678bad3aeaee..e3a45c7602257 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/panel/default_content.tsx @@ -39,7 +39,7 @@ function serializeChildren(node: PanelNavNode): ChromeProjectNavigationNode[] | { id: 'root', title: '', - path: [...node.path, 'root'], + path: `${node.path}.root`, children: [...node.children], }, ]; diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx index ca118249d123b..ff79824176268 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/panel/navigation_panel.tsx @@ -38,7 +38,9 @@ export const NavigationPanel: FC = () => { ({ target }: Event) => { // Only close if we are not clicking on the currently selected nav node if ( - !(target as HTMLButtonElement).dataset.testSubj?.includes(`panelOpener-${selectedNode?.id}`) + !(target as HTMLButtonElement).dataset.testSubj?.includes( + `panelOpener-${selectedNode?.path}` + ) ) { close(); } diff --git a/packages/shared-ux/chrome/navigation/src/ui/default_navigation.tsx b/packages/shared-ux/chrome/navigation/src/ui/default_navigation.tsx index f423ba98d04a7..e7d20a812d58f 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/default_navigation.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/default_navigation.tsx @@ -8,9 +8,8 @@ import React, { FC, useCallback, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import type { AppDeepLinkId, NodeDefinition } from '@kbn/core-chrome-browser'; +import type { NodeDefinition } from '@kbn/core-chrome-browser'; -import { getNavigationNodeId } from '../utils'; import { Navigation } from './components'; import type { GroupDefinition, @@ -116,55 +115,12 @@ const getDefaultNavigationTree = ( }; }; -/** - * Serialize a navigation node. Currently this handler only adds an autogenerated id if it's missing - * - * @param item The navigation node - * @returns The navigation node serialized - */ -function serializeNode< - T extends { - id?: string; - link?: LinkId; - children?: Array<{ id?: string; link?: LinkId }>; - }, - LinkId extends AppDeepLinkId = AppDeepLinkId ->(item: T, depth: number, index: number): T & { id: string } { - const id = getNavigationNodeId(item, () => `node-${depth}-${index}`); - const children = item.children?.map((_item, i) => serializeNode(_item, depth + 1, i)); - - return { - ...item, - id, - children, - }; -} - -const serializeNavigationTree = (navTree: NavigationTreeDefinition): NavigationTreeDefinition => { - const serialized: NavigationTreeDefinition = { ...navTree }; - - const serialize = (item: RootNavigationItemDefinition, index: number) => { - if (item.type === 'recentlyAccessed') return item; - return serializeNode(item, 0, index); - }; - - if (navTree.body) { - serialized.body = navTree.body.map(serialize); - } - - if (navTree.footer) { - serialized.footer = navTree.footer.map(serialize); - } - - return serialized; -}; - interface Props { dataTestSubj?: string; panelContentProvider?: ContentProvider; } -export const DefaultNavigation: FC = ({ +const DefaultNavigationComp: FC = ({ projectNavigationTree, navigationTree, dataTestSubj, @@ -174,14 +130,6 @@ export const DefaultNavigation: FC = ({ throw new Error('One of navigationTree or projectNavigationTree must be defined'); } - const navigationDefinition = useMemo(() => { - const definition = !navigationTree - ? getDefaultNavigationTree(projectNavigationTree!) - : navigationTree; - - return serializeNavigationTree(definition); - }, [navigationTree, projectNavigationTree]); - const renderNodes = useCallback( (nodes: Array = []) => { return nodes.map((navNode, i) => { @@ -194,28 +142,35 @@ export const DefaultNavigation: FC = ({ } if (isGroupDefinition(navNode)) { + // Recursively build the tree return ( - - {/* Recursively build the tree */} + {renderNodes(navNode.children)} ); } - return ; + return ; }); }, [] ); + const definitionToJSX = useMemo(() => { + const definition = !navigationTree + ? getDefaultNavigationTree(projectNavigationTree!) + : navigationTree; + + const { body, footer } = definition; + return { body: renderNodes(body), footer: Boolean(footer) ? renderNodes(footer) : null }; + }, [navigationTree, projectNavigationTree, renderNodes]); + return ( - <> - {renderNodes(navigationDefinition.body)} - {navigationDefinition.footer && ( - {renderNodes(navigationDefinition.footer)} - )} - + {definitionToJSX.body} + {definitionToJSX.footer && {definitionToJSX.footer}} ); }; + +export const DefaultNavigation = React.memo(DefaultNavigationComp) as typeof DefaultNavigationComp; diff --git a/packages/shared-ux/chrome/navigation/src/ui/hooks/use_init_navnode.ts b/packages/shared-ux/chrome/navigation/src/ui/hooks/use_init_navnode.ts deleted file mode 100644 index f8d56bc785269..0000000000000 --- a/packages/shared-ux/chrome/navigation/src/ui/hooks/use_init_navnode.ts +++ /dev/null @@ -1,356 +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 { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import useObservable from 'react-use/lib/useObservable'; -import type { - AppDeepLinkId, - ChromeNavLink, - ChromeProjectNavigationNode, - CloudLinkId, - SideNavNodeStatus, -} from '@kbn/core-chrome-browser'; -import { CloudLinks } from '../../cloud_links'; - -import { useNavigation as useNavigationServices } from '../../services'; -import { getNavigationNodeId, isAbsoluteLink } from '../../utils'; -import { useNavigation } from '../components/navigation'; -import { NodePropsEnhanced, RegisterFunction, UnRegisterFunction } from '../types'; -import { useRegisterTreeNode } from './use_register_tree_node'; - -/** - * We don't have currently a way to know if a user has access to a Cloud section. - * TODO: This function will have to be revisited once we have an API from Cloud to know the user - * permissions. - */ -function hasUserAccessToCloudLink(): boolean { - return true; -} - -function getNodeStatus( - { - link, - deepLink, - cloudLink, - sideNavStatus, - }: { - link?: string; - deepLink?: ChromeNavLink; - cloudLink?: CloudLinkId; - sideNavStatus?: SideNavNodeStatus; - }, - { cloudLinks }: { cloudLinks: CloudLinks } -): SideNavNodeStatus | 'remove' { - if (link && !deepLink) { - // If a link is provided, but no deepLink is found, don't render anything - return 'remove'; - } - - if (cloudLink) { - if (!cloudLinks[cloudLink]) { - // Invalid cloudLinkId or link url has not been set in kibana.yml - return 'remove'; - } - if (!hasUserAccessToCloudLink()) return 'remove'; - } - - if (deepLink && deepLink.hidden) return 'hidden'; - - return sideNavStatus ?? 'visible'; -} - -function getTitleForNode< - LinkId extends AppDeepLinkId = AppDeepLinkId, - Id extends string = string, - ChildrenId extends string = Id ->( - navNode: NodePropsEnhanced, - { deepLink, cloudLinks }: { deepLink?: ChromeNavLink; cloudLinks: CloudLinks } -): string { - const { children } = navNode; - if (navNode.title) { - return navNode.title; - } - - if (typeof children === 'string') { - return children; - } - - if (deepLink?.title) { - return deepLink.title; - } - - if (navNode.cloudLink) { - return cloudLinks[navNode.cloudLink]?.title ?? ''; - } - - return ''; -} - -function validateNodeProps< - LinkId extends AppDeepLinkId = AppDeepLinkId, - Id extends string = string, - ChildrenId extends string = Id ->({ - id, - link, - href, - cloudLink, - renderAs, - appendHorizontalRule, - isGroup, -}: Omit, 'children'>) { - if (link && cloudLink) { - throw new Error( - `[Chrome navigation] Error in node [${id}]. Only one of "link" or "cloudLink" can be provided.` - ); - } - if (href && cloudLink) { - throw new Error( - `[Chrome navigation] Error in node [${id}]. Only one of "href" or "cloudLink" can be provided.` - ); - } - if (renderAs === 'panelOpener' && !link) { - throw new Error( - `[Chrome navigation] Error in node [${id}]. If renderAs is set to "panelOpener", a "link" must also be provided.` - ); - } - if (renderAs === 'item' && !link) { - throw new Error( - `[Chrome navigation] Error in node [${id}]. If renderAs is set to "item", a "link" must also be provided.` - ); - } - if (appendHorizontalRule && !isGroup) { - throw new Error( - `[Chrome navigation] Error in node [${id}]. "appendHorizontalRule" can only be added for group with children.` - ); - } -} - -function createInternalNavNode< - LinkId extends AppDeepLinkId = AppDeepLinkId, - Id extends string = string, - ChildrenId extends string = Id ->( - id: string, - _navNode: NodePropsEnhanced, - deepLinks: Readonly, - path: string[] | null, - isActive: boolean, - { cloudLinks }: { cloudLinks: CloudLinks } -): ChromeProjectNavigationNode | null { - validateNodeProps(_navNode); - - const { children, link, cloudLink, ...navNode } = _navNode; - const deepLink = deepLinks.find((dl) => dl.id === link); - const sideNavStatus = getNodeStatus( - { - link, - deepLink, - cloudLink, - sideNavStatus: navNode.sideNavStatus, - }, - { cloudLinks } - ); - const title = getTitleForNode(_navNode, { deepLink, cloudLinks }); - const href = cloudLink ? cloudLinks[cloudLink]?.href : _navNode.href; - - if (href && !isAbsoluteLink(href)) { - throw new Error(`href must be an absolute URL. Node id [${id}].`); - } - - if (sideNavStatus === 'remove') { - return null; - } - - return { - ...navNode, - id, - path: path ?? [], - title: title ?? '', - deepLink, - href, - isActive, - sideNavStatus, - }; -} - -function isSamePath(pathA: string[] | null, pathB: string[] | null) { - if (pathA === null || pathB === null) { - return false; - } - const pathAToString = pathA.join('.'); - const pathBToString = pathB.join('.'); - return pathAToString === pathBToString; -} - -export const useInitNavNode = < - LinkId extends AppDeepLinkId = AppDeepLinkId, - Id extends string = string, - ChildrenId extends string = Id ->( - node: Omit, 'children'>, - { cloudLinks }: { cloudLinks: CloudLinks } -) => { - const { isActive: isActiveControlled } = node; - - /** - * Map of children nodes - */ - const [childrenNodes, setChildrenNodes] = useState>( - {} - ); - - const isMounted = useRef(false); - - /** - * Reference to the unregister function - */ - const unregisterRef = useRef(); - - /** - * Map to keep track of the order of the children when they mount. - * This allows us to keep in sync the nav tree sent to the Chrome service - * with the order of the DOM elements - */ - const orderChildrenRef = useRef>({}); - - /** - * Index to keep track of the order of the children when they mount. - */ - const idx = useRef(0); - - /** - * The current node path, including all of its parents. We'll use it to match it against - * the list of active routes based on current URL location (passed by the Chrome service) - */ - const [nodePath, setNodePath] = useState(null); - const [isActiveState, setIsActive] = useState(false); - const isActive = isActiveControlled ?? isActiveState; - - const { navLinks$ } = useNavigationServices(); - const deepLinks = useObservable(navLinks$, []); - const { register: registerNodeOnParent } = useRegisterTreeNode(); - const { activeNodes } = useNavigation(); - - const id = getNavigationNodeId(node); - - const internalNavNode = useMemo( - () => createInternalNavNode(id, node, deepLinks, nodePath, isActive, { cloudLinks }), - [node, id, deepLinks, nodePath, isActive, cloudLinks] - ); - - // Register the node on the parent whenever its properties change or whenever - // a child node is registered. - const register = useCallback(() => { - if (!internalNavNode) { - return; - } - - const children = Object.values(childrenNodes).sort((a, b) => { - const aOrder = orderChildrenRef.current[a.id]; - const bOrder = orderChildrenRef.current[b.id]; - return aOrder - bOrder; - }); - - const { unregister, path } = registerNodeOnParent({ - ...internalNavNode, - children: children.length ? children : undefined, - }); - - setNodePath((prev) => { - if (!isSamePath(prev, path)) { - return path; - } - return prev; - }); - - unregisterRef.current = unregister; - }, [internalNavNode, childrenNodes, registerNodeOnParent]); - - // Un-register from the parent. This will happen when the node is unmounted or if the deeplink - // is not active anymore. - const unregister = useCallback(() => { - if (unregisterRef.current) { - unregisterRef.current(id); - unregisterRef.current = undefined; - } - }, [id]); - - const registerChildNode = useCallback( - (childNode) => { - if (orderChildrenRef.current[childNode.id] === undefined) { - orderChildrenRef.current[childNode.id] = idx.current++; - } - - const childPath = nodePath ? [...nodePath, childNode.id] : []; - - setChildrenNodes((prev) => { - return { - ...prev, - [childNode.id]: { - ...childNode, - path: childPath, - }, - }; - }); - - return { - unregister: (childId: string) => { - setChildrenNodes((prev) => { - const updatedItems = { ...prev }; - delete updatedItems[childId]; - return updatedItems; - }); - }, - path: childPath, - }; - }, - [nodePath] - ); - - useEffect(() => { - const updatedIsActive = activeNodes.reduce((acc, nodesBranch) => { - return acc === true ? acc : nodesBranch.some((_node) => isSamePath(_node.path, nodePath)); - }, false); - - setIsActive(updatedIsActive); - }, [activeNodes, nodePath]); - - /** Register when mounting and whenever the internal nav node changes */ - useEffect(() => { - if (!isMounted.current) { - return; - } - - if (internalNavNode) { - register(); - } else { - unregister(); - } - }, [unregister, register, internalNavNode]); - - /** Unregister when unmounting */ - useEffect(() => { - isMounted.current = true; - return () => { - isMounted.current = false; - unregister(); - }; - }, [unregister]); - - return useMemo( - () => ({ - navNode: internalNavNode, - path: nodePath, - registerChildNode, - childrenNodes, - }), - [internalNavNode, registerChildNode, nodePath, childrenNodes] - ); -}; diff --git a/packages/shared-ux/chrome/navigation/src/ui/hooks/use_register_tree_node.ts b/packages/shared-ux/chrome/navigation/src/ui/hooks/use_register_tree_node.ts deleted file mode 100644 index 5ad690b2de2e1..0000000000000 --- a/packages/shared-ux/chrome/navigation/src/ui/hooks/use_register_tree_node.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { useMemo } from 'react'; - -import { useNavigation } from '../components/navigation'; -import { useNavigationGroup } from '../components/navigation_group'; - -/** - * Helper hook that will proxy the correct "register" handler. - * It first tries to the closest parent group, if not found it will use the root register. - */ -export const useRegisterTreeNode = () => { - const root = useNavigation(); - const group = useNavigationGroup(false); - const register = group ? group.register : root.register; - - return useMemo( - () => ({ - register, - }), - [register] - ); -}; diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx index be749a5cac9bb..def69d3c9df52 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx @@ -7,26 +7,22 @@ */ import { action } from '@storybook/addon-actions'; -import { useState as useStateStorybook } from '@storybook/addons'; import { ComponentMeta } from '@storybook/react'; import React, { EventHandler, FC, MouseEvent, useState, useEffect } from 'react'; -import { BehaviorSubject, of } from 'rxjs'; +import { of } from 'rxjs'; import { EuiButton, EuiCollapsibleNavBeta, EuiCollapsibleNavBetaProps, - EuiFlexGroup, - EuiFlexItem, EuiHeader, EuiHeaderSection, EuiLink, EuiPageTemplate, EuiText, - EuiTitle, } from '@elastic/eui'; -import type { ChromeNavLink, ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; +import type { ChromeNavLink } from '@kbn/core-chrome-browser'; import { NavigationStorybookMock, navLinksMock } from '../../mocks'; import mdx from '../../README.mdx'; import type { NavigationServices } from '../../types'; @@ -34,7 +30,7 @@ import { NavigationProvider } from '../services'; import { Navigation } from './components'; import { DefaultNavigation } from './default_navigation'; import { getPresets } from './nav_tree_presets'; -import type { GroupDefinition, ProjectNavigationDefinition } from './types'; +import type { ProjectNavigationDefinition } from './types'; import { ContentProvider } from './components/panel'; const storybookMock = new NavigationStorybookMock(); @@ -127,6 +123,13 @@ const deepLinks: ChromeNavLink[] = [ createDeepLink('group:settings.tracing'), ]; +const deepLinks$ = of({ + ...[...navLinksMock, ...deepLinks].reduce>((acc, navLink) => { + acc[navLink.id] = navLink; + return acc; + }, {}), +}); + const simpleNavigationDefinition: ProjectNavigationDefinition = { projectNavigationTree: [ { @@ -182,7 +185,7 @@ const simpleNavigationDefinition: ProjectNavigationDefinition = { export const SimpleObjectDefinition = (args: NavigationServices) => { const services = storybookMock.getServices({ ...args, - navLinks$: of([...navLinksMock, ...deepLinks]), + deepLinks$, onProjectNavigationChange: (updated) => { action('Update chrome navigation')(JSON.stringify(updated, null, 2)); }, @@ -330,7 +333,7 @@ const groupExamplesDefinition: ProjectNavigationDefinition = { export const GroupsExamples = (args: NavigationServices) => { const services = storybookMock.getServices({ ...args, - navLinks$: of([...navLinksMock, ...deepLinks]), + deepLinks$, onProjectNavigationChange: (updated) => { action('Update chrome navigation')(JSON.stringify(updated, null, 2)); }, @@ -342,9 +345,11 @@ export const GroupsExamples = (args: NavigationServices) => { return ( - - - + {({ isCollapsed }) => ( + + + + )} ); }; @@ -401,6 +406,7 @@ const navigationDefinition: ProjectNavigationDefinition = { { id: 'group:settings-2', title: 'Settings as nav Item', + link: 'item1', renderAs: 'item', // Render just like any other item, even if it has children children: [ { @@ -520,6 +526,7 @@ const navigationDefinition: ProjectNavigationDefinition = { id: 'test_all_hidden', title: 'Test group render as Item', renderAs: 'item', + link: 'item1', children: [ { id: 'test.item1', @@ -576,7 +583,7 @@ const navigationDefinition: ProjectNavigationDefinition = { export const ComplexObjectDefinition = (args: NavigationServices) => { const services = storybookMock.getServices({ ...args, - navLinks$: of([...navLinksMock, ...deepLinks]), + deepLinks$, onProjectNavigationChange: (updated) => { action('Update chrome navigation')(JSON.stringify(updated, null, 2)); }, @@ -891,6 +898,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { { title: 'Group renders as "item" (2)', id: 'group2.renderAsItem', + link: 'item1', renderAs: 'item', children: [ { @@ -945,6 +953,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { children: [ { id: 'group2-B', + link: 'item1', title: 'Group renders as "item" (3)', renderAs: 'item', // This group renders as a normal item children: [ @@ -978,6 +987,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { }, { title: 'Yet another group as item', + link: 'item1', renderAs: 'item', children: [ { @@ -1076,7 +1086,7 @@ const navigationDefinitionWithPanel: ProjectNavigationDefinition = { export const ObjectDefinitionWithPanel = (args: NavigationServices) => { const services = storybookMock.getServices({ ...args, - navLinks$: of([...navLinksMock, ...deepLinks]), + deepLinks$, onProjectNavigationChange: (updated) => { action('Update chrome navigation')(JSON.stringify(updated, null, 2)); }, @@ -1100,10 +1110,69 @@ export const ObjectDefinitionWithPanel = (args: NavigationServices) => { ); }; +export const WithUIComponentsTiny = (args: NavigationServices) => { + const services = storybookMock.getServices({ + ...args, + deepLinks$, + onProjectNavigationChange: (updated) => { + action('Update chrome navigation')(JSON.stringify(updated, null, 2)); + }, + recentlyAccessed$: of([ + { label: 'This is an example', link: '/app/example/39859', id: '39850' }, + { label: 'Another example', link: '/app/example/5235', id: '5235' }, + ]), + }); + + return ( + + {({ isCollapsed }) => ( + + + + + id="item1" link="item1" /> + + + id="item2" link="item1" title="YEAH!!" icon="launch" /> + + + + + + + + + + + + + + + )} + + ); +}; + export const WithUIComponents = (args: NavigationServices) => { const services = storybookMock.getServices({ ...args, - navLinks$: of([...navLinksMock, ...deepLinks]), + deepLinks$, onProjectNavigationChange: (updated) => { action('Update chrome navigation')(JSON.stringify(updated, null, 2)); }, @@ -1127,7 +1196,7 @@ export const WithUIComponents = (args: NavigationServices) => { defaultIsCollapsed={false} > id="item1" link="item1" /> - + {/* {(navNode) => { return (
      @@ -1135,7 +1204,7 @@ export const WithUIComponents = (args: NavigationServices) => {
      ); }} -
      +
      */}
      Title in ReactNode @@ -1224,7 +1293,7 @@ export const WithUIComponents = (args: NavigationServices) => { export const MinimalUI = (args: NavigationServices) => { const services = storybookMock.getServices({ ...args, - navLinks$: of([...navLinksMock, ...deepLinks]), + deepLinks$, onProjectNavigationChange: (updated) => { action('Update chrome navigation')(JSON.stringify(updated, null, 2)); }, @@ -1272,230 +1341,6 @@ export const MinimalUI = (args: NavigationServices) => { ); }; -export const CreativeUI = (args: NavigationServices) => { - const services = storybookMock.getServices({ - ...args, - navLinks$: of([...navLinksMock, ...deepLinks]), - onProjectNavigationChange: (updated) => { - action('Update chrome navigation')(JSON.stringify(updated, null, 2)); - }, - recentlyAccessed$: of([ - { label: 'This is an example', link: '/app/example/39859', id: '39850' }, - { label: 'Another example', link: '/app/example/5235', id: '5235' }, - ]), - }); - - return ( - - - - - - - - -

      Hello!

      -
      - - - - -

      - As you can see there is really no limit in what UI you can create! -
      -

      -

      - Have fun! -

      -
      - - -
      -
      -
      -
      -
      -
      - ); -}; - -export const UpdatingState = (args: NavigationServices) => { - const simpleGroupDef: GroupDefinition = { - type: 'navGroup', - id: 'observability_project_nav', - title: 'Observability', - icon: 'logoObservability', - children: [ - { - id: 'aiops', - title: 'AIOps', - icon: 'branch', - children: [ - { - title: 'Anomaly detection', - id: 'ml:anomalyDetection', - link: 'ml:anomalyDetection', - }, - { - title: 'Log Rate Analysis', - id: 'ml:logRateAnalysis', - link: 'ml:logRateAnalysis', - }, - { - title: 'Change Point Detections', - link: 'ml:changePointDetections', - id: 'ml:changePointDetections', - }, - { - title: 'Job Notifications', - link: 'ml:notifications', - id: 'ml:notifications', - }, - ], - }, - { - id: 'project_settings_project_nav', - title: 'Project settings', - icon: 'gear', - children: [ - { id: 'management', link: 'management' }, - { id: 'integrations', link: 'integrations' }, - { id: 'fleet', link: 'fleet' }, - ], - }, - ], - }; - const firstSection = simpleGroupDef.children![0]; - const firstSectionFirstChild = firstSection.children![0]; - const secondSection = simpleGroupDef.children![1]; - const secondSectionFirstChild = secondSection.children![0]; - - const activeNodeSets: ChromeProjectNavigationNode[][][] = [ - [ - [ - { - ...simpleGroupDef, - path: [simpleGroupDef.id], - } as unknown as ChromeProjectNavigationNode, - { - ...firstSection, - path: [simpleGroupDef.id, firstSection.id], - } as unknown as ChromeProjectNavigationNode, - { - ...firstSectionFirstChild, - path: [simpleGroupDef.id, firstSection.id, firstSectionFirstChild.id], - } as unknown as ChromeProjectNavigationNode, - ], - ], - [ - [ - { - ...simpleGroupDef, - path: [simpleGroupDef.id], - } as unknown as ChromeProjectNavigationNode, - { - ...secondSection, - path: [simpleGroupDef.id, secondSection.id], - } as unknown as ChromeProjectNavigationNode, - { - ...secondSectionFirstChild, - path: [simpleGroupDef.id, secondSection.id, secondSectionFirstChild.id], - } as unknown as ChromeProjectNavigationNode, - ], - ], - ]; - - // use state to track which element of activeNodeSets is active - const [activeNodeIndex, setActiveNodeIndex] = useStateStorybook(0); - const changeActiveNode = () => { - const value = (activeNodeIndex + 1) % 2; // toggle between 0 and 1 - setActiveNodeIndex(value); - }; - - const activeNodes$ = new BehaviorSubject([]); - activeNodes$.next(activeNodeSets[activeNodeIndex]); - - const services = storybookMock.getServices({ - ...args, - activeNodes$, - navLinks$: of([...navLinksMock, ...deepLinks]), - onProjectNavigationChange: (updated) => { - action('Update chrome navigation')(JSON.stringify(updated, null, 2)); - }, - }); - - return ( - - - - - - ); -}; - export default { title: 'Chrome/Navigation', description: 'Navigation container to render items for cross-app linking', diff --git a/packages/shared-ux/chrome/navigation/src/ui/types.ts b/packages/shared-ux/chrome/navigation/src/ui/types.ts index 9051cc3747bf0..768155ced3050 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/types.ts +++ b/packages/shared-ux/chrome/navigation/src/ui/types.ts @@ -30,26 +30,15 @@ export interface NodeProps< * Children of the node. For Navigation.Item (only) it allows a function to be set. * This function will receive the ChromeProjectNavigationNode object */ - children?: ((navNode: ChromeProjectNavigationNode) => ReactNode) | ReactNode; -} - -/** - * @internal - * - * Internally we enhance the Props passed to the Navigation.Item component. - */ -export interface NodePropsEnhanced< - LinkId extends AppDeepLinkId = AppDeepLinkId, - Id extends string = string, - ChildrenId extends string = Id -> extends NodeProps { - /** - * Forces the node to be active. This is used to force a collapisble nav group to be open - * even if the URL does not match any of the nodes in the group. - */ - isActive?: boolean; - /** Flag to indicate if the navigation node is a group or not */ - isGroup: boolean; + children?: ReactNode; + /** @internal - Prop internally controlled, don't use it. */ + parentNodePath?: string; + /** @internal - Prop internally controlled, don't use it. */ + rootIndex?: number; + /** @internal - Prop internally controlled, don't use it. */ + treeDepth?: number; + /** @internal - Prop internally controlled, don't use it. */ + index?: number; } /** The preset that can be pass to the NavigationBucket component */ @@ -181,16 +170,14 @@ export interface ProjectNavigationDefinition< * * Function to unregister a navigation node from its parent. */ -export type UnRegisterFunction = (id: string) => void; +export type UnRegisterFunction = () => void; /** * @internal * * A function to register a navigation node on its parent. */ -export type RegisterFunction = (navNode: ChromeProjectNavigationNode) => { - /** The function to unregister the node. */ - unregister: UnRegisterFunction; - /** The full path of the node in the navigation tree. */ - path: string[]; -}; +export type RegisterFunction = ( + navNode: ChromeProjectNavigationNode, + order?: number +) => UnRegisterFunction; diff --git a/packages/shared-ux/chrome/navigation/src/utils.ts b/packages/shared-ux/chrome/navigation/src/utils.ts index 8322fe797590b..efbf3c0e2a42e 100644 --- a/packages/shared-ux/chrome/navigation/src/utils.ts +++ b/packages/shared-ux/chrome/navigation/src/utils.ts @@ -6,11 +6,16 @@ * Side Public License, v 1. */ +import React, { type ReactNode } from 'react'; import type { ChromeProjectNavigationNode, NodeDefinition } from '@kbn/core-chrome-browser'; +import { NavigationFooter } from './ui/components/navigation_footer'; +import { NavigationGroup } from './ui/components/navigation_group'; +import { NavigationItem } from './ui/components/navigation_item'; +import { RecentlyAccessed } from './ui/components/recently_accessed'; let uniqueId = 0; -function generateUniqueNodeId() { +export function generateUniqueNodeId() { const id = `node${uniqueId++}`; return id; } @@ -19,15 +24,6 @@ export function isAbsoluteLink(link: string) { return link.startsWith('http://') || link.startsWith('https://'); } -export function nodePathToString( - node?: T -): T extends { path?: string[]; id: string } ? string : undefined { - if (!node) return undefined as T extends { path?: string[]; id: string } ? string : undefined; - return (node.path ? node.path.join('.') : node.id) as T extends { path?: string[]; id: string } - ? string - : undefined; -} - export function isGroupNode({ children }: Pick) { return children !== undefined; } @@ -50,3 +46,37 @@ export function getNavigationNodeHref({ }: Pick): string | undefined { return deepLink?.url ?? href; } + +function isSamePath(pathA: string | null, pathB: string | null) { + if (pathA === null || pathB === null) { + return false; + } + return pathA === pathB; +} + +export function isActiveFromUrl(nodePath: string, activeNodes: ChromeProjectNavigationNode[][]) { + return activeNodes.reduce((acc, nodesBranch) => { + return acc === true ? acc : nodesBranch.some((branch) => isSamePath(branch.path, nodePath)); + }, false); +} + +type ChildType = 'item' | 'group' | 'recentlyAccessed' | 'footer' | 'unknown'; + +export const getChildType = (child: ReactNode): ChildType => { + if (!React.isValidElement(child)) { + return 'unknown'; + } + + switch (child.type) { + case NavigationItem: + return 'item'; + case NavigationGroup: + return 'group'; + case RecentlyAccessed: + return 'recentlyAccessed'; + case NavigationFooter: + return 'footer'; + default: + return 'unknown'; + } +}; diff --git a/packages/shared-ux/chrome/navigation/types/index.ts b/packages/shared-ux/chrome/navigation/types/index.ts index e162e395362a9..43ff4083ba414 100644 --- a/packages/shared-ux/chrome/navigation/types/index.ts +++ b/packages/shared-ux/chrome/navigation/types/index.ts @@ -24,7 +24,7 @@ import type { CloudLinks } from '../src/cloud_links'; export interface NavigationServices { basePath: BasePathService; recentlyAccessed$: Observable; - navLinks$: Observable>; + deepLinks$: Observable>>; navIsOpen: boolean; navigateToUrl: NavigateToUrlFn; onProjectNavigationChange: (chromeProjectNavigation: ChromeProjectNavigation) => void; diff --git a/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.component.tsx b/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.component.tsx index 96e80af246511..3705b5885f1ab 100644 --- a/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.component.tsx +++ b/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.component.tsx @@ -29,6 +29,7 @@ export const RedirectAppLinks: FC = ({ children, navigateToUrl, currentAppId, + ...containerProps }) => { const containerRef = useRef(null); @@ -50,6 +51,7 @@ export const RedirectAppLinks: FC = ({ ref={containerRef} css={redirectAppLinksStyles} data-test-subj="kbnRedirectAppLink" + {...containerProps} > {children}
      diff --git a/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx b/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx index 9a069881b2128..da227ab023cbb 100644 --- a/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx +++ b/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.container.tsx @@ -7,6 +7,7 @@ */ import React, { FC } from 'react'; +import type { RedirectAppLinksComponentProps } from '@kbn/shared-ux-link-redirect-app-types'; import { useServices } from './services'; import { RedirectAppLinks as Component } from './redirect_app_links.component'; @@ -22,6 +23,11 @@ import { RedirectAppLinks as Component } from './redirect_app_links.component'; * * ``` */ -export const RedirectAppLinks: FC<{}> = ({ children }) => ( - {children} +export const RedirectAppLinks: FC> = ({ + children, + ...props +}) => ( + + {children} + ); diff --git a/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.tsx b/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.tsx index 2909dcdbda17d..89d8a61531e9b 100644 --- a/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.tsx +++ b/packages/shared-ux/link/redirect_app/impl/src/redirect_app_links.tsx @@ -25,10 +25,11 @@ const isKibanaContract = (services: any): services is RedirectAppLinksKibanaDepe * with which consumers can wrap their components or solutions. */ export const RedirectAppLinks: FC = ({ children, ...props }) => { - const container = {children}; - if (isKibanaContract(props)) { - const { coreStart } = props; + const { coreStart, ...containerProps } = props; + const container = ( + {children} + ); return ( {container} @@ -36,7 +37,10 @@ export const RedirectAppLinks: FC = ({ children, ...props ); } - const { navigateToUrl, currentAppId } = props; + const { navigateToUrl, currentAppId, ...containerProps } = props; + const container = ( + {children} + ); return ( {container} diff --git a/packages/shared-ux/link/redirect_app/types/index.d.ts b/packages/shared-ux/link/redirect_app/types/index.d.ts index 186e86af89435..01899edea65d3 100644 --- a/packages/shared-ux/link/redirect_app/types/index.d.ts +++ b/packages/shared-ux/link/redirect_app/types/index.d.ts @@ -32,7 +32,11 @@ export interface RedirectAppLinksKibanaDependencies { } /** Props for the `RedirectAppLinks` component. */ -export type RedirectAppLinksProps = RedirectAppLinksServices | RedirectAppLinksKibanaDependencies; +export type RedirectAppLinksProps = ( + | RedirectAppLinksServices + | RedirectAppLinksKibanaDependencies +) & + DetailedHTMLProps, HTMLDivElement>; /** Props for the `RedirectAppLinksComponent`. */ export interface RedirectAppLinksComponentProps diff --git a/preinstall_check.js b/preinstall_check.js index d6d0cdf1ffb49..59a4cfd2aa4a7 100644 --- a/preinstall_check.js +++ b/preinstall_check.js @@ -10,7 +10,7 @@ const isUsingNpm = process.env.npm_config_git !== undefined; if (isUsingNpm) { - throw `Use Yarn instead of npm, see Kibana's contributing guidelines`; + throw new Error(`Use Yarn instead of npm, see Kibana's contributing guidelines`); } // The value of the `npm_config_argv` env for each command: diff --git a/renovate.json b/renovate.json index e4c1e0672c782..63ca5d0ba8a97 100644 --- a/renovate.json +++ b/renovate.json @@ -462,7 +462,8 @@ "Team:Operations", "release_note:skip" ], - "enabled": true + "enabled": true, + "allowedVersions": "<7.0" }, { "groupName": "react-query", @@ -647,4 +648,4 @@ "enabled": true } ] -} +} \ No newline at end of file diff --git a/scripts/es.js b/scripts/es.js index 1fcd221c97904..1cee27b7685b5 100644 --- a/scripts/es.js +++ b/scripts/es.js @@ -20,6 +20,7 @@ kbnEs 'source-path': resolve(__dirname, '../../elasticsearch'), 'base-path': resolve(__dirname, '../.es'), ssl: false, + kibanaUrl: 'https://localhost:5601/', }) .catch(function (e) { console.error(e); diff --git a/src/cli/serve/serve.js b/src/cli/serve/serve.js index 911eecd45a9fb..75a18378f56b3 100644 --- a/src/cli/serve/serve.js +++ b/src/cli/serve/serve.js @@ -109,6 +109,38 @@ export function applyConfigOverrides(rawConfig, opts, extraCliOptions) { if (opts.dev) { if (opts.serverless) { setServerlessKibanaDevServiceAccountIfPossible(get, set, opts); + + // Load mock identity provider plugin and configure realm if supported (ES only supports SAML when run with SSL) + if (opts.ssl && canRequire('@kbn/mock-idp-plugin/common')) { + // Ensure the plugin is loaded in dynamically to exclude from production build + const { + MOCK_IDP_PLUGIN_PATH, + MOCK_IDP_REALM_NAME, + } = require('@kbn/mock-idp-plugin/common'); + + if (has('server.basePath')) { + console.log( + `Custom base path is not supported when running in Serverless, it will be removed.` + ); + _.unset(rawConfig, 'server.basePath'); + } + + set('plugins.paths', _.compact([].concat(get('plugins.paths'), MOCK_IDP_PLUGIN_PATH))); + set(`xpack.security.authc.providers.saml.${MOCK_IDP_REALM_NAME}`, { + order: Number.MAX_SAFE_INTEGER, + realm: MOCK_IDP_REALM_NAME, + icon: 'user', + description: 'Continue as Test User', + hint: 'Allows testing serverless user roles', + }); + // Add basic realm since defaults won't be applied when a provider has been configured + if (!has('xpack.security.authc.providers.basic')) { + set('xpack.security.authc.providers.basic.basic', { + order: 0, + enabled: true, + }); + } + } } if (!has('elasticsearch.serviceAccountToken') && opts.devCredentials !== false) { @@ -274,7 +306,9 @@ export default function (program) { // We can tell users they only have to run with `yarn start --run-examples` to get those // local links to work. Similar to what we do for "View in Console" links in our // elastic.co links. - basePath: opts.runExamples ? false : !!opts.basePath, + // We also want to run without base path when running in serverless mode so that Elasticsearch can + // connect to Kibana's mock identity provider. + basePath: opts.runExamples || isServerlessMode ? false : !!opts.basePath, optimize: !!opts.optimize, disableOptimizer: !opts.optimizer, oss: !!opts.oss, diff --git a/src/cli/tsconfig.json b/src/cli/tsconfig.json index ebbbc19f75c79..3b3c0854975d3 100644 --- a/src/cli/tsconfig.json +++ b/src/cli/tsconfig.json @@ -17,6 +17,7 @@ "@kbn/config", "@kbn/dev-utils", "@kbn/apm-config-loader", + "@kbn/mock-idp-plugin", ], "exclude": [ "target/**/*", diff --git a/src/core/server/integration_tests/elasticsearch/error_logging.test.ts b/src/core/server/integration_tests/elasticsearch/error_logging.test.ts index 8cd4f5ae41134..f8deaa41ee862 100644 --- a/src/core/server/integration_tests/elasticsearch/error_logging.test.ts +++ b/src/core/server/integration_tests/elasticsearch/error_logging.test.ts @@ -86,6 +86,7 @@ describe('Error logging', () => { name: 'ResponseError', process: { pid: expect.any(Number), + uptime: expect.any(Number), }, }); } diff --git a/src/core/server/integration_tests/http/http_server.test.ts b/src/core/server/integration_tests/http/http_server.test.ts index da10b231b7a22..b901f7f85cb6c 100644 --- a/src/core/server/integration_tests/http/http_server.test.ts +++ b/src/core/server/integration_tests/http/http_server.test.ts @@ -52,7 +52,7 @@ describe('Http server', () => { beforeEach(async () => { shutdownTimeout = config.shutdownTimeout.asMilliseconds(); - const { registerRouter, server: innerServer } = await server.setup(config); + const { registerRouter, server: innerServer } = await server.setup({ config$: of(config) }); innerServerListener = innerServer.listener; const router = new Router('', logger, enhanceWithContext, { diff --git a/src/core/server/integration_tests/http/router.test.ts b/src/core/server/integration_tests/http/router.test.ts index 1e5b284134515..f66cab0a07f5e 100644 --- a/src/core/server/integration_tests/http/router.test.ts +++ b/src/core/server/integration_tests/http/router.test.ts @@ -408,7 +408,7 @@ describe('Options', () => { }); describe('idleSocket', () => { - it.skip('should timeout if payload sending has too long of an idle period', async () => { + it('should timeout if payload sending has too long of an idle period', async () => { const { server: innerServer, createRouter } = await server.setup(setupDeps); const router = createRouter('/'); @@ -420,7 +420,7 @@ describe('Options', () => { body: { accepts: ['application/json'], }, - timeout: { idleSocket: 10 }, + timeout: { idleSocket: 5 }, }, }, async (context, req, res) => { diff --git a/src/core/server/integration_tests/http/set_tls_config.test.ts b/src/core/server/integration_tests/http/set_tls_config.test.ts new file mode 100644 index 0000000000000..6c198d820670f --- /dev/null +++ b/src/core/server/integration_tests/http/set_tls_config.test.ts @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 supertest from 'supertest'; +import { KBN_CERT_PATH, KBN_KEY_PATH, ES_KEY_PATH, ES_CERT_PATH } from '@kbn/dev-utils'; +import { + createServer, + getListenerOptions, + getServerOptions, + setTlsConfig, +} from '@kbn/server-http-tools'; +import { + HttpConfig, + config as httpConfig, + cspConfig, + externalUrlConfig, +} from '@kbn/core-http-server-internal'; +import { flattenCertificateChain, fetchPeerCertificate, isServerTLS } from './tls_utils'; + +describe('setTlsConfig', () => { + const CSP_CONFIG = cspConfig.schema.validate({}); + const EXTERNAL_URL_CONFIG = externalUrlConfig.schema.validate({}); + + beforeAll(() => { + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + }); + + it('replaces the TLS configuration on the HAPI server', async () => { + const rawHttpConfig = httpConfig.schema.validate({ + name: 'kibana', + host: '127.0.0.1', + port: 10002, + ssl: { + enabled: true, + certificate: KBN_CERT_PATH, + key: KBN_KEY_PATH, + cipherSuites: ['TLS_AES_256_GCM_SHA384'], + redirectHttpFromPort: 10003, + }, + shutdownTimeout: '1s', + }); + const firstConfig = new HttpConfig(rawHttpConfig, CSP_CONFIG, EXTERNAL_URL_CONFIG); + + const serverOptions = getServerOptions(firstConfig); + const listenerOptions = getListenerOptions(firstConfig); + const server = createServer(serverOptions, listenerOptions); + + server.route({ + method: 'GET', + path: '/', + handler: (request, toolkit) => { + return toolkit.response('ok'); + }, + }); + + await server.start(); + + const listener = server.listener; + + // force TS to understand what we're working with. + if (!isServerTLS(listener)) { + throw new Error('Server should be a TLS server'); + } + + const certificate = await fetchPeerCertificate(firstConfig.host, firstConfig.port); + const certificateChain = flattenCertificateChain(certificate); + + expect(isServerTLS(listener)).toEqual(true); + expect(certificateChain.length).toEqual(1); + expect(certificateChain[0].subject.CN).toEqual('kibana'); + + await supertest(listener).get('/').expect(200); + + const secondRawConfig = httpConfig.schema.validate({ + name: 'kibana', + host: '127.0.0.1', + port: 10002, + ssl: { + enabled: true, + certificate: ES_CERT_PATH, + key: ES_KEY_PATH, + cipherSuites: ['TLS_AES_256_GCM_SHA384'], + redirectHttpFromPort: 10003, + }, + shutdownTimeout: '1s', + }); + + const secondConfig = new HttpConfig(secondRawConfig, CSP_CONFIG, EXTERNAL_URL_CONFIG); + + setTlsConfig(server, secondConfig.ssl); + + const secondCertificate = await fetchPeerCertificate(firstConfig.host, firstConfig.port); + const secondCertificateChain = flattenCertificateChain(secondCertificate); + + expect(secondCertificateChain.length).toEqual(1); + expect(secondCertificateChain[0].subject.CN).toEqual('elasticsearch'); + + await supertest(listener).get('/').expect(200); + + await server.stop(); + }); +}); diff --git a/src/core/server/integration_tests/http/tls_config_reload.test.ts b/src/core/server/integration_tests/http/tls_config_reload.test.ts new file mode 100644 index 0000000000000..b0c8f6abf5e5c --- /dev/null +++ b/src/core/server/integration_tests/http/tls_config_reload.test.ts @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import supertest from 'supertest'; +import { duration } from 'moment'; +import { BehaviorSubject, of } from 'rxjs'; +import { KBN_CERT_PATH, KBN_KEY_PATH, ES_KEY_PATH, ES_CERT_PATH } from '@kbn/dev-utils'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; +import { Router } from '@kbn/core-http-router-server-internal'; +import { + HttpServer, + HttpConfig, + config as httpConfig, + cspConfig, + externalUrlConfig, +} from '@kbn/core-http-server-internal'; +import { isServerTLS, flattenCertificateChain, fetchPeerCertificate } from './tls_utils'; + +const CSP_CONFIG = cspConfig.schema.validate({}); +const EXTERNAL_URL_CONFIG = externalUrlConfig.schema.validate({}); +const enhanceWithContext = (fn: (...args: any[]) => any) => fn.bind(null, {}); + +describe('HttpServer - TLS config', () => { + let server: HttpServer; + let logger: ReturnType; + + beforeAll(() => { + process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; + }); + + beforeEach(() => { + const loggingService = loggingSystemMock.create(); + logger = loggingSystemMock.createLogger(); + server = new HttpServer(loggingService, 'tests', of(duration('1s'))); + }); + + it('supports dynamic reloading of the TLS configuration', async () => { + const rawHttpConfig = httpConfig.schema.validate({ + name: 'kibana', + host: '127.0.0.1', + port: 10002, + ssl: { + enabled: true, + certificate: KBN_CERT_PATH, + key: KBN_KEY_PATH, + cipherSuites: ['TLS_AES_256_GCM_SHA384'], + redirectHttpFromPort: 10003, + }, + shutdownTimeout: '1s', + }); + const firstConfig = new HttpConfig(rawHttpConfig, CSP_CONFIG, EXTERNAL_URL_CONFIG); + + const config$ = new BehaviorSubject(firstConfig); + + const { server: innerServer, registerRouter } = await server.setup({ config$ }); + const listener = innerServer.listener; + + const router = new Router('', logger, enhanceWithContext, { + isDev: false, + versionedRouteResolution: 'oldest', + }); + router.get( + { + path: '/', + validate: false, + }, + async (ctx, req, res) => { + return res.ok({ + body: 'ok', + }); + } + ); + registerRouter(router); + + await server.start(); + + // force TS to understand what we're working with. + if (!isServerTLS(listener)) { + throw new Error('Server should be a TLS server'); + } + + const certificate = await fetchPeerCertificate(firstConfig.host, firstConfig.port); + const certificateChain = flattenCertificateChain(certificate); + + expect(certificateChain.length).toEqual(1); + expect(certificateChain[0].subject.CN).toEqual('kibana'); + + await supertest(listener).get('/').expect(200); + + const secondRawConfig = httpConfig.schema.validate({ + name: 'kibana', + host: '127.0.0.1', + port: 10002, + ssl: { + enabled: true, + certificate: ES_CERT_PATH, + key: ES_KEY_PATH, + cipherSuites: ['TLS_AES_256_GCM_SHA384'], + redirectHttpFromPort: 10003, + }, + shutdownTimeout: '1s', + }); + + const secondConfig = new HttpConfig(secondRawConfig, CSP_CONFIG, EXTERNAL_URL_CONFIG); + config$.next(secondConfig); + + const secondCertificate = await fetchPeerCertificate(firstConfig.host, firstConfig.port); + const secondCertificateChain = flattenCertificateChain(secondCertificate); + + expect(secondCertificateChain.length).toEqual(1); + expect(secondCertificateChain[0].subject.CN).toEqual('elasticsearch'); + + await supertest(listener).get('/').expect(200); + + await server.stop(); + }); +}); diff --git a/src/core/server/integration_tests/http/tls_utils.ts b/src/core/server/integration_tests/http/tls_utils.ts new file mode 100644 index 0000000000000..e565a61ae5dc6 --- /dev/null +++ b/src/core/server/integration_tests/http/tls_utils.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Server as NodeHttpServer } from 'http'; +import { Server as NodeTlsServer } from 'https'; +import tls from 'tls'; + +export function isServerTLS(server: NodeHttpServer): server is NodeTlsServer { + return 'setSecureContext' in server; +} + +export const fetchPeerCertificate = (host: string, port: number) => { + return new Promise((resolve, reject) => { + const socket = tls.connect({ host, port: Number(port), rejectUnauthorized: false }); + socket.once('secureConnect', () => { + const cert = socket.getPeerCertificate(true); + socket.destroy(); + resolve(cert); + }); + socket.once('error', reject); + }); +}; + +export const flattenCertificateChain = ( + cert: tls.DetailedPeerCertificate, + accumulator: tls.DetailedPeerCertificate[] = [] +) => { + accumulator.push(cert); + if (cert.issuerCertificate && cert.fingerprint256 !== cert.issuerCertificate.fingerprint256) { + flattenCertificateChain(cert.issuerCertificate, accumulator); + } + return accumulator; +}; diff --git a/src/core/tsconfig.json b/src/core/tsconfig.json index 88cac51321322..78219114a51df 100644 --- a/src/core/tsconfig.json +++ b/src/core/tsconfig.json @@ -155,6 +155,8 @@ "@kbn/core-test-helpers-model-versions", "@kbn/core-plugins-contracts-browser", "@kbn/core-plugins-contracts-server", + "@kbn/dev-utils", + "@kbn/server-http-tools", ], "exclude": [ "target/**/*", diff --git a/src/dev/build/lib/config.ts b/src/dev/build/lib/config.ts index a33540ce00c5f..a27592e3f6427 100644 --- a/src/dev/build/lib/config.ts +++ b/src/dev/build/lib/config.ts @@ -251,6 +251,6 @@ export class Config { } getDistPluginsFromRepo() { - return getPackages(this.repoRoot).filter(this.pluginFilter); + return getPackages(this.repoRoot).filter((p) => !p.isDevOnly() && this.pluginFilter(p)); } } diff --git a/src/dev/build/tasks/package_json/create_package_json_tasks.ts b/src/dev/build/tasks/package_json/create_package_json_tasks.ts index d5f4ee94e049b..fae14c14e3db5 100644 --- a/src/dev/build/tasks/package_json/create_package_json_tasks.ts +++ b/src/dev/build/tasks/package_json/create_package_json_tasks.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { PluginPackage } from '@kbn/repo-packages'; import { findUsedDependencies } from './find_used_dependencies'; import { read, write, Task } from '../../lib'; @@ -13,7 +14,7 @@ export const CreatePackageJson: Task = { description: 'Creating build-ready version of package.json', async run(config, log, build) { - const plugins = config.getDistPluginsFromRepo(); + const plugins = config.getDistPluginsFromRepo() as PluginPackage[]; const distPkgIds = new Set(config.getDistPackagesFromRepo().map((p) => p.id)); const pkg = config.getKibanaPkg(); diff --git a/src/dev/storybook/aliases.ts b/src/dev/storybook/aliases.ts index a43fd71d0004e..88d8c04b42337 100644 --- a/src/dev/storybook/aliases.ts +++ b/src/dev/storybook/aliases.ts @@ -15,13 +15,13 @@ export const storybookAliases = { canvas: 'x-pack/plugins/canvas/storybook', cases: 'packages/kbn-cases-components/.storybook', cell_actions: 'packages/kbn-cell-actions/.storybook', - ci_composite: '.ci/.storybook', cloud_chat: 'x-pack/plugins/cloud_integrations/cloud_chat/.storybook', coloring: 'packages/kbn-coloring/.storybook', language_documentation_popover: 'packages/kbn-language-documentation-popover/.storybook', chart_icons: 'packages/kbn-chart-icons/.storybook', content_management_examples: 'examples/content_management_examples/.storybook', controls: 'src/plugins/controls/storybook', + custom_icons: 'packages/kbn-custom-icons/.storybook', custom_integrations: 'src/plugins/custom_integrations/storybook', dashboard_enhanced: 'x-pack/plugins/dashboard_enhanced/.storybook', dashboard: 'src/plugins/dashboard/.storybook', diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/types.ts b/src/plugins/chart_expressions/expression_partition_vis/public/types.ts index 0beca2e79de8d..7b139df576d6e 100755 --- a/src/plugins/chart_expressions/expression_partition_vis/public/types.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/types.ts @@ -47,6 +47,7 @@ export interface MultiFilterEvent { export interface CellValueAction { id: string; + type?: string; iconType: string; displayName: string; execute: (data: CellValueContext['data']) => void; diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/utils/get_legend_actions.tsx b/src/plugins/chart_expressions/expression_partition_vis/public/utils/get_legend_actions.tsx index 778c2003de4f1..b734e1b07a0c0 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/utils/get_legend_actions.tsx +++ b/src/plugins/chart_expressions/expression_partition_vis/public/utils/get_legend_actions.tsx @@ -14,10 +14,15 @@ import { LegendAction, SeriesIdentifier, useLegendAction } from '@elastic/charts import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { Datatable } from '@kbn/expressions-plugin/public'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import { FILTER_CELL_ACTION_TYPE } from '@kbn/cell-actions/constants'; import { PartitionVisParams } from '../../common/types'; -import { ColumnCellValueActions, FilterEvent } from '../types'; +import { CellValueAction, ColumnCellValueActions, FilterEvent } from '../types'; import { getSeriesValueColumnIndex, getFilterPopoverTitle } from './filter_helpers'; +const hasFilterCellAction = (actions: CellValueAction[]) => { + return actions.some(({ type }) => type === FILTER_CELL_ACTION_TYPE); +}; + export const getLegendActions = ( canFilter: ( data: FilterEvent | null, @@ -58,9 +63,10 @@ export const getLegendActions = ( pieSeries.key ); - const panelItems: EuiContextMenuPanelDescriptor['items'] = []; + const compatibleCellActions = columnCellValueActions[columnIndex] ?? []; - if (isFilterable && filterData) { + const panelItems: EuiContextMenuPanelDescriptor['items'] = []; + if (!hasFilterCellAction(compatibleCellActions) && isFilterable && filterData) { panelItems.push( { name: i18n.translate('expressionPartitionVis.legend.filterForValueButtonAriaLabel', { @@ -87,20 +93,18 @@ export const getLegendActions = ( ); } - if (columnCellValueActions[columnIndex]) { - const columnMeta = visData.columns[columnIndex].meta; - columnCellValueActions[columnIndex].forEach((action) => { - panelItems.push({ - name: action.displayName, - 'data-test-subj': `legend-${title}-${action.id}`, - icon: , - onClick: () => { - action.execute([{ columnMeta, value: pieSeries.key }]); - setPopoverOpen(false); - }, - }); + const columnMeta = visData.columns[columnIndex].meta; + compatibleCellActions.forEach((action) => { + panelItems.push({ + name: action.displayName, + 'data-test-subj': `legend-${title}-${action.id}`, + icon: , + onClick: () => { + action.execute([{ columnMeta, value: pieSeries.key }]); + setPopoverOpen(false); + }, }); - } + }); if (panelItems.length === 0) { return null; diff --git a/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json b/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json index bfb4774a1676e..59b7893879ced 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json +++ b/src/plugins/chart_expressions/expression_partition_vis/tsconfig.json @@ -29,6 +29,7 @@ "@kbn/analytics", "@kbn/chart-icons", "@kbn/chart-expressions-common", + "@kbn/cell-actions", ], "exclude": [ "target/**/*", diff --git a/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis.test.ts b/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis.test.ts index 78eb7c54ebf8a..eae70ea54f0c9 100644 --- a/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis.test.ts +++ b/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis.test.ts @@ -10,7 +10,6 @@ import { layeredXyVisFunction } from '.'; import { createMockExecutionContext } from '@kbn/expressions-plugin/common/mocks'; import { sampleArgs, sampleExtendedLayer } from '../__mocks__'; import { XY_VIS } from '../constants'; -import { shouldShowLegendActionDefault } from '../helpers/visualization'; describe('layeredXyVis', () => { test('it renders with the specified data and args', async () => { @@ -31,7 +30,6 @@ describe('layeredXyVis', () => { syncTooltips: false, syncCursor: true, canNavigateToLens: false, - shouldShowLegendAction: shouldShowLegendActionDefault, }, }); }); diff --git a/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis_fn.ts b/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis_fn.ts index 5a1a79ef984fc..cf1325f09bf22 100644 --- a/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis_fn.ts +++ b/src/plugins/chart_expressions/expression_xy/common/expression_functions/layered_xy_vis_fn.ts @@ -18,7 +18,6 @@ import { validateAxes, } from './validate'; import { appendLayerIds, getDataLayers } from '../helpers'; -import { shouldShowLegendActionDefault } from '../helpers/visualization'; export const layeredXyVisFn: LayeredXyVisFn['fn'] = async (data, args, handlers) => { const layers = appendLayerIds(args.layers ?? [], 'layers'); @@ -67,7 +66,6 @@ export const layeredXyVisFn: LayeredXyVisFn['fn'] = async (data, args, handlers) syncTooltips: handlers?.isSyncTooltipsEnabled?.() ?? false, syncCursor: handlers?.isSyncCursorEnabled?.() ?? true, overrides: handlers.variables?.overrides as XYRender['value']['overrides'], - shouldShowLegendAction: handlers?.shouldShowLegendAction ?? shouldShowLegendActionDefault, }, }; }; diff --git a/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis.test.ts b/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis.test.ts index e0c825597d328..9a71ec92d7a51 100644 --- a/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis.test.ts +++ b/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis.test.ts @@ -10,7 +10,6 @@ import { xyVisFunction } from '.'; import { createMockExecutionContext } from '@kbn/expressions-plugin/common/mocks'; import { sampleArgs, sampleLayer } from '../__mocks__'; import { XY_VIS } from '../constants'; -import { shouldShowLegendActionDefault } from '../helpers/visualization'; describe('xyVis', () => { test('it renders with the specified data and args', async () => { @@ -43,7 +42,6 @@ describe('xyVis', () => { syncColors: false, syncTooltips: false, syncCursor: true, - shouldShowLegendAction: shouldShowLegendActionDefault, }, }); }); @@ -354,7 +352,6 @@ describe('xyVis', () => { syncColors: false, syncTooltips: false, syncCursor: true, - shouldShowLegendAction: shouldShowLegendActionDefault, }, }); }); @@ -404,7 +401,6 @@ describe('xyVis', () => { syncTooltips: false, syncCursor: true, overrides, - shouldShowLegendAction: shouldShowLegendActionDefault, }, }); }); diff --git a/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis_fn.ts b/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis_fn.ts index 1eb4357e57c84..03df575b3c653 100644 --- a/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis_fn.ts +++ b/src/plugins/chart_expressions/expression_xy/common/expression_functions/xy_vis_fn.ts @@ -30,7 +30,6 @@ import { validateAxes, } from './validate'; import { logDatatable } from '../utils'; -import { shouldShowLegendActionDefault } from '../helpers/visualization'; const createDataLayer = (args: XYArgs, table: Datatable): DataLayerConfigResult => { const accessors = getAccessors(args, table); @@ -140,7 +139,6 @@ export const xyVisFn: XyVisFn['fn'] = async (data, args, handlers) => { syncTooltips: handlers?.isSyncTooltipsEnabled?.() ?? false, syncCursor: handlers?.isSyncCursorEnabled?.() ?? true, overrides: handlers.variables?.overrides as XYRender['value']['overrides'], - shouldShowLegendAction: handlers?.shouldShowLegendAction ?? shouldShowLegendActionDefault, }, }; }; diff --git a/src/plugins/chart_expressions/expression_xy/common/helpers/visualization.ts b/src/plugins/chart_expressions/expression_xy/common/helpers/visualization.ts index 8f740c2578d7e..66d4c11a9f7ae 100644 --- a/src/plugins/chart_expressions/expression_xy/common/helpers/visualization.ts +++ b/src/plugins/chart_expressions/expression_xy/common/helpers/visualization.ts @@ -19,5 +19,3 @@ export function isTimeChart(layers: CommonXYDataLayerConfigResult[]) { (!l.xScaleType || l.xScaleType === XScaleTypes.TIME) ); } - -export const shouldShowLegendActionDefault = () => true; diff --git a/src/plugins/chart_expressions/expression_xy/public/components/legend_action.test.tsx b/src/plugins/chart_expressions/expression_xy/public/components/legend_action.test.tsx index 47e36adab06f8..1398fc64357cb 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/legend_action.test.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/components/legend_action.test.tsx @@ -203,8 +203,7 @@ describe('getLegendAction', function () { formattedColumns: {}, }, }, - {}, - () => true + {} ); let wrapper: ReactWrapper; diff --git a/src/plugins/chart_expressions/expression_xy/public/components/legend_action.tsx b/src/plugins/chart_expressions/expression_xy/public/components/legend_action.tsx index 2ae2c21b8c0d8..f5b00f696d04f 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/legend_action.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/components/legend_action.tsx @@ -28,7 +28,6 @@ export const getLegendAction = ( fieldFormats: LayersFieldFormats, formattedDatatables: DatatablesWithFormatInfo, titles: LayersAccessorsTitles, - shouldShowLegendAction?: (actionId: string) => boolean, singleTable?: boolean ): LegendAction => React.memo(({ series: [xySeries] }) => { @@ -110,7 +109,6 @@ export const getLegendAction = ( } onFilter={filterHandler} legendCellValueActions={legendCellValueActions} - shouldShowLegendAction={shouldShowLegendAction} /> ); }); diff --git a/src/plugins/chart_expressions/expression_xy/public/components/legend_action_popover.tsx b/src/plugins/chart_expressions/expression_xy/public/components/legend_action_popover.tsx index aa2db4c4eb47c..268a7051bd4c3 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/legend_action_popover.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/components/legend_action_popover.tsx @@ -8,16 +8,14 @@ import React, { useState, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; -import { - EuiContextMenuPanelDescriptor, - EuiIcon, - EuiPopover, - EuiContextMenu, - EuiContextMenuPanelItemDescriptor, -} from '@elastic/eui'; +import { FILTER_CELL_ACTION_TYPE } from '@kbn/cell-actions/constants'; +import { EuiContextMenuPanelDescriptor, EuiIcon, EuiPopover, EuiContextMenu } from '@elastic/eui'; import { useLegendAction } from '@elastic/charts'; import type { CellValueAction } from '../types'; -import { shouldShowLegendActionDefault } from '../../common/helpers/visualization'; + +const hasFilterCellAction = (actions: CellValueAction[]) => { + return actions.some(({ type }) => type === FILTER_CELL_ACTION_TYPE); +}; export type LegendCellValueActions = Array< Omit & { execute: () => void } @@ -36,20 +34,18 @@ export interface LegendActionPopoverProps { * Compatible actions to be added to the popover actions */ legendCellValueActions?: LegendCellValueActions; - shouldShowLegendAction?: (actionId: string) => boolean; } export const LegendActionPopover: React.FunctionComponent = ({ label, onFilter, legendCellValueActions = [], - shouldShowLegendAction = shouldShowLegendActionDefault, }) => { const [popoverOpen, setPopoverOpen] = useState(false); const [ref, onClose] = useLegendAction(); const panels: EuiContextMenuPanelDescriptor[] = useMemo(() => { - const defaultActions = [ + const defaultFilterActions = [ { id: 'filterIn', displayName: i18n.translate('expressionXY.legend.filterForValueButtonAriaLabel', { @@ -76,22 +72,21 @@ export const LegendActionPopover: React.FunctionComponent((acc, action) => { - if (shouldShowLegendAction(action.id)) { - acc.push({ - name: action.displayName, - 'data-test-subj': `legend-${label}-${action.id}`, - icon: , - onClick: () => { - action.execute(); - setPopoverOpen(false); - }, - }); - } - return acc; - }, []); + const allActions = [ + ...(!hasFilterCellAction(legendCellValueActions) ? defaultFilterActions : []), + ...legendCellValueActions, + ]; + + const legendCellValueActionPanelItems = allActions.map((action) => ({ + name: action.displayName, + 'data-test-subj': `legend-${label}-${action.id}`, + icon: , + onClick: () => { + action.execute(); + setPopoverOpen(false); + }, + })); + return [ { id: 'main', @@ -99,7 +94,7 @@ export const LegendActionPopover: React.FunctionComponent & { renderComplete: () => void; uiState?: PersistedState; timeFormat: string; - shouldShowLegendAction?: (actionId: string) => boolean; }; function nonNullable(v: T): v is NonNullable { @@ -208,7 +207,6 @@ export function XYChart({ uiState, timeFormat, overrides, - shouldShowLegendAction, }: XYChartRenderProps) { const { legend, @@ -841,7 +839,6 @@ export function XYChart({ fieldFormats, formattedDatatables, titles, - shouldShowLegendAction, singleTable ) : undefined diff --git a/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx b/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx index 401af740375b2..c2561191deb9a 100644 --- a/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/expression_renderers/xy_chart_renderer.tsx @@ -277,7 +277,6 @@ export const getXyChartRenderer = ({ syncCursor={config.syncCursor} uiState={handlers.uiState as PersistedState} renderComplete={renderComplete} - shouldShowLegendAction={handlers.shouldShowLegendAction} />
    diff --git a/src/plugins/chart_expressions/expression_xy/public/types.ts b/src/plugins/chart_expressions/expression_xy/public/types.ts index 733dba9400bf2..14aa84768efea 100755 --- a/src/plugins/chart_expressions/expression_xy/public/types.ts +++ b/src/plugins/chart_expressions/expression_xy/public/types.ts @@ -120,6 +120,7 @@ export interface VisualizationType { export interface CellValueAction { id: string; + type?: string; iconType: string; displayName: string; execute: (data: CellValueContext['data']) => void; diff --git a/src/plugins/chart_expressions/expression_xy/tsconfig.json b/src/plugins/chart_expressions/expression_xy/tsconfig.json index 901b7eb0568c6..a0e7e207f92c0 100644 --- a/src/plugins/chart_expressions/expression_xy/tsconfig.json +++ b/src/plugins/chart_expressions/expression_xy/tsconfig.json @@ -34,6 +34,7 @@ "@kbn/event-annotation-common", "@kbn/visualization-ui-components", "@kbn/es-query", + "@kbn/cell-actions", ], "exclude": [ "target/**/*", diff --git a/src/plugins/console/public/lib/autocomplete/body_completer.js b/src/plugins/console/public/lib/autocomplete/body_completer.js index 9759eb9b629da..d9355db85f4d8 100644 --- a/src/plugins/console/public/lib/autocomplete/body_completer.js +++ b/src/plugins/console/public/lib/autocomplete/body_completer.js @@ -266,7 +266,7 @@ function compileCondition(description, compiledObject) { return new RegExp(description.lines_regex, 'm').test(lines); }, compiledObject); } else { - throw 'unknown condition type - got: ' + JSON.stringify(description); + throw new Error(`unknown condition type - got: ${JSON.stringify(description)}`); } } diff --git a/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx b/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx index ea1bea52c83de..1ff789ab61201 100644 --- a/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx +++ b/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx @@ -41,6 +41,7 @@ import { useDashboardOutcomeValidation } from './hooks/use_dashboard_outcome_val import { loadDashboardHistoryLocationState } from './locator/load_dashboard_history_location_state'; import type { DashboardCreationOptions } from '../dashboard_container/embeddable/dashboard_container_factory'; import { DashboardTopNav } from '../dashboard_top_nav'; +import { DashboardTabTitleSetter } from './tab_title_setter/dashboard_tab_title_setter'; export interface DashboardAppProps { history: History; @@ -200,15 +201,17 @@ export function DashboardApp({ {!showNoDataPage && ( <> {dashboardAPI && ( - + <> + + + )} {getLegacyConflictWarning?.()} - { + const { + chrome: { docTitle: chromeDocTitle }, + } = pluginServices.getServices(); + const title = dashboardContainer.select((state) => state.explicitInput.title); + const lastSavedId = dashboardContainer.select((state) => state.componentState.lastSavedId); + + /** + * Set chrome tab title when dashboard's title changes + */ + useEffect(() => { + /** We do not want the tab title to include the "Editing" prefix, so always send in view mode */ + chromeDocTitle.change(getDashboardTitle(title, ViewMode.VIEW, !lastSavedId)); + }, [title, chromeDocTitle, lastSavedId]); + + return null; +}; diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx index 0190bbaefa00b..6afdf1429663b 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/dashboard_editing_toolbar.tsx @@ -54,12 +54,14 @@ export function DashboardEditingToolbar({ isDisabled }: { isDisabled?: boolean } trackUiMetric(METRIC_TYPE.CLICK, `${visType.name}:create`); } - if ('aliasPath' in visType) { - appId = visType.aliasApp; - path = visType.aliasPath; - } else { + if (!('alias' in visType)) { + // this visualization is not an alias appId = 'visualize'; path = `#/create?type=${encodeURIComponent(visType.name)}`; + } else if (visType.alias && 'path' in visType.alias) { + // this visualization **is** an alias, and it has an app to redirect to for creation + appId = visType.alias.app; + path = visType.alias.path; } } else { appId = 'visualize'; diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/editor_menu.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/editor_menu.tsx index d2b6470650caa..18f26704221ab 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/editor_menu.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/editor_menu.tsx @@ -104,10 +104,11 @@ export const EditorMenu = ({ createNewVisType, createNewEmbeddable, isDisabled } const promotedVisTypes = getSortedVisTypesByGroup(VisGroups.PROMOTED); const aggsBasedVisTypes = getSortedVisTypesByGroup(VisGroups.AGGBASED); const toolVisTypes = getSortedVisTypesByGroup(VisGroups.TOOLS); - const visTypeAliases = getVisTypeAliases().sort( - ({ promotion: a = false }: VisTypeAlias, { promotion: b = false }: VisTypeAlias) => + const visTypeAliases = getVisTypeAliases() + .sort(({ promotion: a = false }: VisTypeAlias, { promotion: b = false }: VisTypeAlias) => a === b ? 0 : a ? -1 : 1 - ); + ) + .filter(({ disableCreate }: VisTypeAlias) => !disableCreate); const factories = unwrappedEmbeddableFactories.filter( ({ isEditable, factory: { type, canCreateNew, isContainerType } }) => diff --git a/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx b/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx index 8767b5abe3567..de7d79d456b9f 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx @@ -10,21 +10,21 @@ import React, { useCallback, useMemo } from 'react'; import useObservable from 'react-use/lib/useObservable'; import { - EuiText, - EuiImage, EuiButton, - EuiFlexItem, - EuiFlexGroup, EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiImage, EuiPageTemplate, + EuiText, } from '@elastic/eui'; import { METRIC_TYPE } from '@kbn/analytics'; import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { DASHBOARD_UI_METRIC_ID } from '../../../dashboard_constants'; import { pluginServices } from '../../../services/plugin_services'; -import { emptyScreenStrings } from '../../_dashboard_container_strings'; import { useDashboardContainer } from '../../embeddable/dashboard_container'; -import { DASHBOARD_UI_METRIC_ID } from '../../../dashboard_constants'; +import { emptyScreenStrings } from '../../_dashboard_container_strings'; export function DashboardEmptyScreen() { const { @@ -53,7 +53,7 @@ export function DashboardEmptyScreen() { const originatingApp = embeddableAppContext?.currentAppId; const goToLens = useCallback(() => { - if (!lensAlias || !lensAlias.aliasPath) return; + if (!lensAlias || !lensAlias.alias) return; const trackUiMetric = usageCollection.reportUiCounter?.bind( usageCollection, DASHBOARD_UI_METRIC_ID @@ -62,8 +62,8 @@ export function DashboardEmptyScreen() { if (trackUiMetric) { trackUiMetric(METRIC_TYPE.CLICK, `${lensAlias.name}:create`); } - getStateTransfer().navigateToEditor(lensAlias.aliasApp, { - path: lensAlias.aliasPath, + getStateTransfer().navigateToEditor(lensAlias.alias.app, { + path: lensAlias.alias.path, state: { originatingApp, originatingPath, diff --git a/src/plugins/data/common/search/expressions/esql.ts b/src/plugins/data/common/search/expressions/esql.ts index ec30a92bae996..ee434c4d05cfb 100644 --- a/src/plugins/data/common/search/expressions/esql.ts +++ b/src/plugins/data/common/search/expressions/esql.ts @@ -67,10 +67,6 @@ function normalizeType(type: string): DatatableColumnType { } } -function sanitize(value: string) { - return value.replace(/[\(\)]/g, '_'); -} - function extractTypeAndReason(attributes: any): { type?: string; reason?: string } { if (['type', 'reason'].every((prop) => prop in attributes)) { return attributes; @@ -249,8 +245,8 @@ export const getEsqlFn = ({ getStartDependencies }: EsqlFnArguments) => { map(({ rawResponse: body, warning }) => { const columns = body.columns?.map(({ name, type }) => ({ - id: sanitize(name), - name: sanitize(name), + id: name, + name, meta: { type: normalizeType(type) }, })) ?? []; const columnNames = columns.map(({ name }) => name); diff --git a/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx b/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx index 71ff8ce38636c..7ce1c9ccbc66d 100644 --- a/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx +++ b/src/plugins/data_view_management/public/components/edit_index_pattern/edit_index_pattern.tsx @@ -30,6 +30,7 @@ import { } from '@kbn/saved-objects-management-plugin/public'; import { pickBy } from 'lodash'; import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/public'; +import type * as CSS from 'csstype'; import { IndexPatternManagmentContext } from '../../types'; import { Tabs } from './tabs'; import { IndexHeader } from './index_header'; @@ -37,8 +38,9 @@ import { getTags } from '../utils'; import { removeDataView, RemoveDataViewProps } from './remove_data_view'; import { APP_STATE_STORAGE_KEY } from './edit_index_pattern_state_container'; -const codeStyle = { +const codeStyle: CSS.Properties = { marginLeft: '8px', + overflowWrap: 'anywhere', }; export interface EditIndexPatternProps extends RouteComponentProps { diff --git a/src/plugins/data_views/docs/openapi/bundled.json b/src/plugins/data_views/docs/openapi/bundled.json index d661e0a7cbaad..e4f7e9856e2bd 100644 --- a/src/plugins/data_views/docs/openapi/bundled.json +++ b/src/plugins/data_views/docs/openapi/bundled.json @@ -740,7 +740,8 @@ "apiKeyAuth": { "type": "apiKey", "in": "header", - "name": "ApiKey" + "name": "Authorization", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" } }, "examples": { diff --git a/src/plugins/data_views/docs/openapi/bundled.yaml b/src/plugins/data_views/docs/openapi/bundled.yaml index c6e52614b66e9..65ffd986ade7d 100644 --- a/src/plugins/data_views/docs/openapi/bundled.yaml +++ b/src/plugins/data_views/docs/openapi/bundled.yaml @@ -474,7 +474,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' examples: get_data_views_response: summary: The get all data views API returns a list of data views. diff --git a/src/plugins/data_views/docs/openapi/entrypoint.yaml b/src/plugins/data_views/docs/openapi/entrypoint.yaml index 991d0e32154ae..697fd554dae8c 100644 --- a/src/plugins/data_views/docs/openapi/entrypoint.yaml +++ b/src/plugins/data_views/docs/openapi/entrypoint.yaml @@ -52,7 +52,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' security: - basicAuth: [] - apiKeyAuth: [] diff --git a/src/plugins/discover/public/application/doc/components/doc.tsx b/src/plugins/discover/public/application/doc/components/doc.tsx index 5bf79863ecfbe..c604abcdd74df 100644 --- a/src/plugins/discover/public/application/doc/components/doc.tsx +++ b/src/plugins/discover/public/application/doc/components/doc.tsx @@ -119,7 +119,7 @@ export function Doc(props: DocProps) { {reqState === ElasticRequestState.Found && hit !== null && dataView && (
    - +
    )} diff --git a/src/plugins/expressions/common/execution/types.ts b/src/plugins/expressions/common/execution/types.ts index eed9628444cc7..dddc503285942 100644 --- a/src/plugins/expressions/common/execution/types.ts +++ b/src/plugins/expressions/common/execution/types.ts @@ -84,8 +84,6 @@ export interface ExecutionContext< * Logs datatable. */ logDatatable?(name: string, datatable: Datatable): void; - - shouldShowLegendAction?: (actionId: string) => boolean; } /** diff --git a/src/plugins/expressions/common/expression_renderers/types.ts b/src/plugins/expressions/common/expression_renderers/types.ts index e75e0af849ed3..7dae307aa6c01 100644 --- a/src/plugins/expressions/common/expression_renderers/types.ts +++ b/src/plugins/expressions/common/expression_renderers/types.ts @@ -105,5 +105,4 @@ export interface IInterpreterRenderHandlers { uiState?: unknown; getExecutionContext(): KibanaExecutionContext | undefined; - shouldShowLegendAction?: (actionId: string) => boolean; } diff --git a/src/plugins/expressions/public/loader.ts b/src/plugins/expressions/public/loader.ts index c3d7b1fb9920d..f10b8db1f1287 100644 --- a/src/plugins/expressions/public/loader.ts +++ b/src/plugins/expressions/public/loader.ts @@ -63,7 +63,6 @@ export class ExpressionLoader { hasCompatibleActions: params?.hasCompatibleActions, getCompatibleCellValueActions: params?.getCompatibleCellValueActions, executionContext: params?.executionContext, - shouldShowLegendAction: params?.shouldShowLegendAction, }); this.render$ = this.renderHandler.render$; this.update$ = this.renderHandler.update$; diff --git a/src/plugins/expressions/public/react_expression_renderer/react_expression_renderer.tsx b/src/plugins/expressions/public/react_expression_renderer/react_expression_renderer.tsx index 7c299e1bc7240..1d479bd9b4c1c 100644 --- a/src/plugins/expressions/public/react_expression_renderer/react_expression_renderer.tsx +++ b/src/plugins/expressions/public/react_expression_renderer/react_expression_renderer.tsx @@ -24,7 +24,6 @@ export interface ReactExpressionRendererProps error?: ExpressionRenderError | null ) => React.ReactElement | React.ReactElement[]; padding?: 'xs' | 's' | 'm' | 'l' | 'xl'; - shouldShowLegendAction?: (actionId: string) => boolean; } export type ReactExpressionRendererType = React.ComponentType; diff --git a/src/plugins/expressions/public/render.ts b/src/plugins/expressions/public/render.ts index 6bb9c4d0836ba..a7b919625b8d6 100644 --- a/src/plugins/expressions/public/render.ts +++ b/src/plugins/expressions/public/render.ts @@ -36,7 +36,6 @@ export interface ExpressionRenderHandlerParams { hasCompatibleActions?: (event: ExpressionRendererEvent) => Promise; getCompatibleCellValueActions?: (data: object[]) => Promise; executionContext?: KibanaExecutionContext; - shouldShowLegendAction?: (actionId: string) => boolean; } type UpdateValue = IInterpreterRenderUpdateParams; @@ -67,7 +66,6 @@ export class ExpressionRenderHandler { hasCompatibleActions = async () => false, getCompatibleCellValueActions = async () => [], executionContext, - shouldShowLegendAction, }: ExpressionRenderHandlerParams = {} ) { this.element = element; @@ -120,9 +118,6 @@ export class ExpressionRenderHandler { }, hasCompatibleActions, getCompatibleCellValueActions, - shouldShowLegendAction: (actionId: string) => { - return shouldShowLegendAction?.(actionId) ?? true; - }, }; } diff --git a/src/plugins/expressions/public/types/index.ts b/src/plugins/expressions/public/types/index.ts index a96c0629ce8a3..870b44e9bc02c 100644 --- a/src/plugins/expressions/public/types/index.ts +++ b/src/plugins/expressions/public/types/index.ts @@ -67,7 +67,6 @@ export interface IExpressionLoaderParams { * By default, it equals 1000. */ throttle?: number; - shouldShowLegendAction?: (actionId: string) => boolean; } export interface ExpressionRenderError extends Error { diff --git a/src/plugins/links/common/persistable_state/references.ts b/src/plugins/links/common/persistable_state/references.ts index 1410cdc53d234..3c527465a2868 100644 --- a/src/plugins/links/common/persistable_state/references.ts +++ b/src/plugins/links/common/persistable_state/references.ts @@ -7,6 +7,7 @@ */ import { Reference } from '@kbn/content-management-utils'; +import { omit } from 'lodash'; import { DASHBOARD_LINK_TYPE, LinksAttributes } from '../content_management'; export function extractReferences({ @@ -22,23 +23,24 @@ export function extractReferences({ const { links } = attributes; const extractedReferences: Reference[] = []; - links.forEach((link) => { + + const newLinks = links.map((link) => { if (link.type === DASHBOARD_LINK_TYPE && link.destination) { const refName = `link_${link.id}_dashboard`; - link.destinationRefName = refName; extractedReferences.push({ name: refName, type: 'dashboard', id: link.destination, }); - delete link.destination; + return { ...omit(link, 'destination'), destinationRefName: refName }; } + return link; }); return { attributes: { ...attributes, - links, + links: newLinks, }, references: references.concat(extractedReferences), }; diff --git a/src/plugins/links/kibana.jsonc b/src/plugins/links/kibana.jsonc index 5f0796d55b43a..a058db8a03ce2 100644 --- a/src/plugins/links/kibana.jsonc +++ b/src/plugins/links/kibana.jsonc @@ -12,11 +12,12 @@ "dashboard", "embeddable", "kibanaReact", + "kibanaUtils", "presentationUtil", "uiActionsEnhanced", - "kibanaUtils" + "visualizations" ], - "optionalPlugins": ["triggersActionsUi"], + "optionalPlugins": ["triggersActionsUi", "usageCollection"], "requiredBundles": ["savedObjects"] } } diff --git a/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx b/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx index 5ff2bacaf49fe..30977b593238a 100644 --- a/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx +++ b/src/plugins/links/public/components/dashboard_link/dashboard_link_component.tsx @@ -7,24 +7,31 @@ */ import classNames from 'classnames'; -import useAsync from 'react-use/lib/useAsync'; import React, { useEffect, useMemo, useState } from 'react'; +import useAsync from 'react-use/lib/useAsync'; import useObservable from 'react-use/lib/useObservable'; -import { - DashboardDrilldownOptions, - DEFAULT_DASHBOARD_DRILLDOWN_OPTIONS, -} from '@kbn/presentation-util-plugin/public'; import { EuiButtonEmpty, EuiListGroupItem } from '@elastic/eui'; -import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; +import { METRIC_TYPE } from '@kbn/analytics'; import { DashboardLocatorParams, getDashboardLocatorParamsFromEmbeddable, } from '@kbn/dashboard-plugin/public'; +import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; +import { + DashboardDrilldownOptions, + DEFAULT_DASHBOARD_DRILLDOWN_OPTIONS, +} from '@kbn/presentation-util-plugin/public'; -import { LINKS_VERTICAL_LAYOUT, LinksLayoutType, Link } from '../../../common/content_management'; +import { + DASHBOARD_LINK_TYPE, + Link, + LinksLayoutType, + LINKS_VERTICAL_LAYOUT, +} from '../../../common/content_management'; +import { trackUiMetric } from '../../services/kibana_services'; +import { useLinks } from '../links_hooks'; import { DashboardLinkStrings } from './dashboard_link_strings'; -import { useLinks } from '../../embeddable/links_embeddable'; import { fetchDashboard } from './dashboard_link_tools'; export const DashboardLinkComponent = ({ @@ -97,9 +104,9 @@ export const DashboardLinkComponent = ({ /** * Dashboard-to-dashboard navigation */ - const { loading: loadingOnClickProps, value: onClickProps } = useAsync(async () => { + const onClickProps = useMemo(() => { /** If the link points to the current dashboard, then there should be no `onClick` or `href` prop */ - if (link.destination === parentDashboardId) return; + if (!link.destination || link.destination === parentDashboardId) return; const linkOptions = { ...DEFAULT_DASHBOARD_DRILLDOWN_OPTIONS, @@ -118,6 +125,8 @@ export const DashboardLinkComponent = ({ return { href, onClick: async (event: React.MouseEvent) => { + trackUiMetric?.(METRIC_TYPE.CLICK, `${DASHBOARD_LINK_TYPE}:click`); + /** * If the link is being opened via a modified click, then we should use the default `href` navigation behaviour * by passing all the dashboard state via the URL - this will keep behaviour consistent across all browsers. @@ -132,26 +141,19 @@ export const DashboardLinkComponent = ({ if (linkOptions.openInNewTab) { window.open(href, '_blank'); } else { - locator.navigate(params); + await locator.navigate(params); } }, }; - }, [link]); + }, [link, dashboardContainer.locator, linksEmbeddable, parentDashboardId]); useEffect(() => { - if (loadingDestinationDashboard || loadingOnClickProps) { + if (loadingDestinationDashboard) { onLoading(); } else { onRender(); } - }, [ - link, - linksEmbeddable, - loadingDestinationDashboard, - loadingOnClickProps, - onLoading, - onRender, - ]); + }, [link, linksEmbeddable, loadingDestinationDashboard, onLoading, onRender]); const id = `dashboardLink--${link.id}`; @@ -178,7 +180,7 @@ export const DashboardLinkComponent = ({ }} iconType={error ? 'warning' : undefined} iconProps={{ className: 'dashboardLinkIcon' }} - isDisabled={Boolean(error) || loadingOnClickProps} + isDisabled={Boolean(error)} className={classNames('linksPanelLink', { linkCurrent: link.destination === parentDashboardId, dashboardLinkError: Boolean(error), diff --git a/src/plugins/links/public/components/editor/links_editor.tsx b/src/plugins/links/public/components/editor/links_editor.tsx index 0fb22efaf8507..12e48e5aa463f 100644 --- a/src/plugins/links/public/components/editor/links_editor.tsx +++ b/src/plugins/links/public/components/editor/links_editor.tsx @@ -7,41 +7,42 @@ */ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import useMountedState from 'react-use/lib/useMountedState'; import { - EuiForm, EuiBadge, - EuiTitle, EuiButton, - EuiSwitch, - EuiFormRow, - EuiToolTip, - EuiFlexItem, - EuiFlexGroup, - EuiDroppable, - EuiDraggable, - EuiFlyoutBody, EuiButtonEmpty, EuiButtonGroup, - EuiFlyoutFooter, - EuiFlyoutHeader, + EuiButtonGroupOptionProps, EuiDragDropContext, euiDragDropReorder, - EuiButtonGroupOptionProps, + EuiDraggable, + EuiDroppable, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiForm, + EuiFormRow, + EuiSwitch, + EuiTitle, + EuiToolTip, } from '@elastic/eui'; import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; -import { LinksLayoutInfo } from '../../embeddable/types'; import { Link, LinksLayoutType, LINKS_HORIZONTAL_LAYOUT, LINKS_VERTICAL_LAYOUT, } from '../../../common/content_management'; +import { memoizedGetOrderedLinkList } from '../../editor/links_editor_tools'; +import { openLinkEditorFlyout } from '../../editor/open_link_editor_flyout'; +import { LinksLayoutInfo } from '../../embeddable/types'; import { coreServices } from '../../services/kibana_services'; import { LinksStrings } from '../links_strings'; -import { openLinkEditorFlyout } from '../../editor/open_link_editor_flyout'; -import { memoizedGetOrderedLinkList } from '../../editor/links_editor_tools'; import { LinksEditorEmptyPrompt } from './links_editor_empty_prompt'; import { LinksEditorSingleLink } from './links_editor_single_link'; @@ -80,6 +81,7 @@ const LinksEditor = ({ isByReference: boolean; }) => { const toasts = coreServices.notifications.toasts; + const isMounted = useMountedState(); const editLinkFlyoutRef = useRef(null); const [currentLayout, setCurrentLayout] = useState( @@ -294,7 +296,9 @@ const LinksEditor = ({ }); }) .finally(() => { - setIsSaving(false); + if (isMounted()) { + setIsSaving(false); + } }); } else { onAddToDashboard(orderedLinks, currentLayout); diff --git a/src/plugins/links/public/components/external_link/external_link_component.tsx b/src/plugins/links/public/components/external_link/external_link_component.tsx index ac409cfbac4cf..4af95c83cc325 100644 --- a/src/plugins/links/public/components/external_link/external_link_component.tsx +++ b/src/plugins/links/public/components/external_link/external_link_component.tsx @@ -9,15 +9,21 @@ import React, { useMemo, useState } from 'react'; import useMount from 'react-use/lib/useMount'; +import { EuiListGroupItem } from '@elastic/eui'; +import { METRIC_TYPE } from '@kbn/analytics'; import { - UrlDrilldownOptions, DEFAULT_URL_DRILLDOWN_OPTIONS, + UrlDrilldownOptions, } from '@kbn/ui-actions-enhanced-plugin/public'; -import { EuiListGroupItem } from '@elastic/eui'; +import { + EXTERNAL_LINK_TYPE, + Link, + LinksLayoutType, + LINKS_VERTICAL_LAYOUT, +} from '../../../common/content_management'; +import { coreServices, trackUiMetric } from '../../services/kibana_services'; import { validateUrl } from './external_link_tools'; -import { coreServices } from '../../services/kibana_services'; -import { Link, LinksLayoutType, LINKS_VERTICAL_LAYOUT } from '../../../common/content_management'; export const ExternalLinkComponent = ({ link, @@ -78,6 +84,8 @@ export const ExternalLinkComponent = ({ onClick={async (event) => { if (!destination) return; + trackUiMetric?.(METRIC_TYPE.CLICK, `${EXTERNAL_LINK_TYPE}:click`); + /** Only use `navigateToUrl` if we **aren't** opening in a new window/tab; otherwise, just use default href handling */ const modifiedClick = event.ctrlKey || event.metaKey || event.shiftKey; if (!modifiedClick) { diff --git a/src/plugins/links/public/components/links_component.tsx b/src/plugins/links/public/components/links_component.tsx index c72c0db04fd57..0da40365abad0 100644 --- a/src/plugins/links/public/components/links_component.tsx +++ b/src/plugins/links/public/components/links_component.tsx @@ -6,29 +6,28 @@ * Side Public License, v 1. */ +import { EuiListGroup, EuiPanel } from '@elastic/eui'; import React, { useEffect, useMemo } from 'react'; import useMap from 'react-use/lib/useMap'; -import { EuiListGroup, EuiPanel } from '@elastic/eui'; -import { useLinks } from '../embeddable/links_embeddable'; -import { ExternalLinkComponent } from './external_link/external_link_component'; -import { DashboardLinkComponent } from './dashboard_link/dashboard_link_component'; -import { memoizedGetOrderedLinkList } from '../editor/links_editor_tools'; import { DASHBOARD_LINK_TYPE, LINKS_HORIZONTAL_LAYOUT, LINKS_VERTICAL_LAYOUT, } from '../../common/content_management'; +import { memoizedGetOrderedLinkList } from '../editor/links_editor_tools'; +import { DashboardLinkComponent } from './dashboard_link/dashboard_link_component'; +import { ExternalLinkComponent } from './external_link/external_link_component'; import './links_component.scss'; +import { useLinks, useLinksAttributes } from './links_hooks'; export const LinksComponent = () => { const linksEmbeddable = useLinks(); - const links = linksEmbeddable.select((state) => state.componentState.links); - const layout = linksEmbeddable.select((state) => state.componentState.layout); + const linksAttributes = useLinksAttributes(); const [linksLoading, { set: setLinkIsLoading }] = useMap( Object.fromEntries( - (links ?? []).map((link) => { + (linksAttributes?.links ?? []).map((link) => { return [link.id, true]; }) ) @@ -43,12 +42,12 @@ export const LinksComponent = () => { }, [linksLoading, linksEmbeddable]); const orderedLinks = useMemo(() => { - if (!links) return []; - return memoizedGetOrderedLinkList(links); - }, [links]); + if (!linksAttributes?.links) return []; + return memoizedGetOrderedLinkList(linksAttributes?.links); + }, [linksAttributes]); const linkItems: { [id: string]: { id: string; content: JSX.Element } } = useMemo(() => { - return (links ?? []).reduce((prev, currentLink) => { + return (linksAttributes?.links ?? []).reduce((prev, currentLink) => { return { ...prev, [currentLink.id]: { @@ -58,7 +57,7 @@ export const LinksComponent = () => { setLinkIsLoading(currentLink.id, true)} onRender={() => setLinkIsLoading(currentLink.id, false)} /> @@ -66,26 +65,26 @@ export const LinksComponent = () => { setLinkIsLoading(currentLink.id, false)} /> ), }, }; }, {}); - }, [links, layout, setLinkIsLoading]); + }, [linksAttributes?.links, linksAttributes?.layout, setLinkIsLoading]); return ( {orderedLinks.map((link) => linkItems[link.id].content)} diff --git a/src/plugins/links/public/components/links_hooks.tsx b/src/plugins/links/public/components/links_hooks.tsx new file mode 100644 index 0000000000000..aa33c9d0f3ac1 --- /dev/null +++ b/src/plugins/links/public/components/links_hooks.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { useContext, useEffect, useState } from 'react'; + +import { LinksAttributes } from '../../common/content_management'; +import { LinksContext, LinksEmbeddable } from '../embeddable/links_embeddable'; + +export const useLinks = (): LinksEmbeddable => { + const linksEmbeddable = useContext(LinksContext); + if (linksEmbeddable == null) { + throw new Error('useLinks must be used inside LinksContext.'); + } + return linksEmbeddable!; +}; + +export const useLinksAttributes = (): LinksAttributes | undefined => { + const linksEmbeddable = useLinks(); + const [attributes, setAttributes] = useState( + linksEmbeddable.attributes + ); + + useEffect(() => { + const attributesSubscription = linksEmbeddable.attributes$.subscribe((newAttributes) => { + setAttributes(newAttributes); + }); + return () => { + attributesSubscription.unsubscribe(); + }; + }, [linksEmbeddable.attributes$]); + + return attributes; +}; diff --git a/src/plugins/links/public/content_management/links_content_management_client.ts b/src/plugins/links/public/content_management/links_content_management_client.ts index 777fd8731d691..586b5aff5efb8 100644 --- a/src/plugins/links/public/content_management/links_content_management_client.ts +++ b/src/plugins/links/public/content_management/links_content_management_client.ts @@ -7,8 +7,9 @@ */ import type { SearchQuery } from '@kbn/content-management-plugin/common'; +import { SerializableAttributes, VisualizationClient } from '@kbn/visualizations-plugin/public'; +import { CONTENT_ID as contentTypeId, CONTENT_ID } from '../../common'; import type { LinksCrudTypes } from '../../common/content_management'; -import { CONTENT_ID as contentTypeId } from '../../common'; import { contentManagement } from '../services/kibana_services'; const get = async (id: string) => { @@ -65,3 +66,9 @@ export const linksClient = { delete: deleteLinks, search, }; + +export function getLinksClient< + Attr extends SerializableAttributes = SerializableAttributes +>(): VisualizationClient { + return linksClient as unknown as VisualizationClient; +} diff --git a/src/plugins/links/public/editor/open_editor_flyout.tsx b/src/plugins/links/public/editor/open_editor_flyout.tsx index 1c722a484eb1d..d47b178d5ff97 100644 --- a/src/plugins/links/public/editor/open_editor_flyout.tsx +++ b/src/plugins/links/public/editor/open_editor_flyout.tsx @@ -7,18 +7,20 @@ */ import React from 'react'; +import { skip, take } from 'rxjs/operators'; -import { withSuspense } from '@kbn/shared-ux-utility'; -import { toMountPoint } from '@kbn/react-kibana-mount'; import { EuiLoadingSpinner, EuiPanel } from '@elastic/eui'; -import { tracksOverlays } from '@kbn/embeddable-plugin/public'; import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; +import { tracksOverlays } from '@kbn/embeddable-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import { withSuspense } from '@kbn/shared-ux-utility'; -import { LinksInput, LinksByReferenceInput, LinksEditorFlyoutReturn } from '../embeddable/types'; -import { coreServices } from '../services/kibana_services'; -import { runSaveToLibrary } from '../content_management/save_to_library'; +import { OverlayRef } from '@kbn/core-mount-utils-browser'; import { Link, LinksLayoutType } from '../../common/content_management'; +import { runSaveToLibrary } from '../content_management/save_to_library'; +import { LinksByReferenceInput, LinksEditorFlyoutReturn, LinksInput } from '../embeddable/types'; import { getLinksAttributeService } from '../services/attribute_service'; +import { coreServices } from '../services/kibana_services'; const LazyLinksEditor = React.lazy(() => import('../components/editor/links_editor')); @@ -40,7 +42,8 @@ export async function openEditorFlyout( const { attributes } = await attributeService.unwrapAttributes(initialInput); const isByReference = attributeService.inputIsRefType(initialInput); const initialLinks = attributes?.links; - const overlayTracker = tracksOverlays(parentDashboard) ? parentDashboard : undefined; + const overlayTracker = + parentDashboard && tracksOverlays(parentDashboard) ? parentDashboard : undefined; if (!initialLinks) { /** @@ -55,6 +58,22 @@ export async function openEditorFlyout( } return new Promise((resolve, reject) => { + const closeEditorFlyout = (editorFlyout: OverlayRef) => { + if (overlayTracker) { + overlayTracker.clearOverlays(); + } else { + editorFlyout.close(); + } + }; + + /** + * Close the flyout whenever the app changes - this handles cases for when the flyout is open outside of the + * Dashboard app (`overlayTracker` is not available) + */ + coreServices.application.currentAppId$.pipe(skip(1), take(1)).subscribe(() => { + if (!overlayTracker) editorFlyout.close(); + }); + const onSaveToLibrary = async (newLinks: Link[], newLayout: LinksLayoutType) => { const newAttributes = { ...attributes, @@ -74,7 +93,7 @@ export async function openEditorFlyout( attributes: newAttributes, }); parentDashboard?.reload(); - if (overlayTracker) overlayTracker.clearOverlays(); + closeEditorFlyout(editorFlyout); }; const onAddToDashboard = (newLinks: Link[], newLayout: LinksLayoutType) => { @@ -94,12 +113,12 @@ export async function openEditorFlyout( attributes: newAttributes, }); parentDashboard?.reload(); - if (overlayTracker) overlayTracker.clearOverlays(); + closeEditorFlyout(editorFlyout); }; const onCancel = () => { reject(); - if (overlayTracker) overlayTracker.clearOverlays(); + closeEditorFlyout(editorFlyout); }; const editorFlyout = coreServices.overlays.openFlyout( @@ -125,6 +144,8 @@ export async function openEditorFlyout( } ); - if (overlayTracker) overlayTracker.openOverlay(editorFlyout); + if (overlayTracker) { + overlayTracker.openOverlay(editorFlyout); + } }); } diff --git a/src/plugins/links/public/embeddable/links_embeddable.tsx b/src/plugins/links/public/embeddable/links_embeddable.tsx index 032b0099ed451..d803b9df9e8c5 100644 --- a/src/plugins/links/public/embeddable/links_embeddable.tsx +++ b/src/plugins/links/public/embeddable/links_embeddable.tsx @@ -6,37 +6,25 @@ * Side Public License, v 1. */ -import React, { createContext, useContext } from 'react'; -import { unmountComponentAtNode } from 'react-dom'; -import { Subscription, distinctUntilChanged, skip, switchMap } from 'rxjs'; import deepEqual from 'fast-deep-equal'; +import React, { createContext } from 'react'; +import { unmountComponentAtNode } from 'react-dom'; +import { distinctUntilChanged, skip, Subject, Subscription, switchMap } from 'rxjs'; +import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; import { AttributeService, Embeddable, ReferenceOrValueEmbeddable, SavedObjectEmbeddableInput, } from '@kbn/embeddable-plugin/public'; -import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; -import { ReduxEmbeddableTools, ReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; -import { linksReducers } from './links_reducers'; -import { LinksByReferenceInput, LinksByValueInput, LinksReduxState } from './types'; -import { LinksComponent } from '../components/links_component'; -import { LinksInput, LinksOutput } from './types'; -import { LinksAttributes } from '../../common/content_management'; import { CONTENT_ID } from '../../common'; +import { LinksAttributes } from '../../common/content_management'; +import { LinksComponent } from '../components/links_component'; +import { LinksByReferenceInput, LinksByValueInput, LinksInput, LinksOutput } from './types'; export const LinksContext = createContext(null); -export const useLinks = (): LinksEmbeddable => { - const linksEmbeddable = useContext(LinksContext); - if (linksEmbeddable == null) { - throw new Error('useLinks must be used inside LinksContext.'); - } - return linksEmbeddable!; -}; - -type LinksReduxEmbeddableTools = ReduxEmbeddableTools; export interface LinksConfig { editable: boolean; @@ -53,20 +41,10 @@ export class LinksEmbeddable private isDestroyed?: boolean; private subscriptions: Subscription = new Subscription(); - // state management - /** - * TODO: Keep track of the necessary state without the redux embeddable tools; it's kind of overkill here. - * Related issue: https://github.com/elastic/kibana/issues/167577 - */ - public select: LinksReduxEmbeddableTools['select']; - public getState: LinksReduxEmbeddableTools['getState']; - public dispatch: LinksReduxEmbeddableTools['dispatch']; - public onStateChange: LinksReduxEmbeddableTools['onStateChange']; - - private cleanupStateTools: () => void; + public attributes?: LinksAttributes; + public attributes$ = new Subject(); constructor( - reduxToolsPackage: ReduxToolsPackage, config: LinksConfig, initialInput: LinksInput, private attributeService: AttributeService, @@ -81,29 +59,11 @@ export class LinksEmbeddable parent ); - /** Build redux embeddable tools */ - const reduxEmbeddableTools = reduxToolsPackage.createReduxEmbeddableTools< - LinksReduxState, - typeof linksReducers - >({ - embeddable: this, - reducers: linksReducers, - initialComponentState: { - title: '', - }, - }); - - this.select = reduxEmbeddableTools.select; - this.getState = reduxEmbeddableTools.getState; - this.dispatch = reduxEmbeddableTools.dispatch; - this.cleanupStateTools = reduxEmbeddableTools.cleanup; - this.onStateChange = reduxEmbeddableTools.onStateChange; - this.initializeSavedLinks() .then(() => this.setInitializationFinished()) .catch((e: Error) => this.onFatalError(e)); - // By-value panels should update the componentState when input changes + // By-value panels should update the links attributes when input changes this.subscriptions.add( this.getInput$() .pipe( @@ -113,25 +73,28 @@ export class LinksEmbeddable ) .subscribe() ); + + // Keep attributes in sync with subject value so it can be used in output + this.subscriptions.add( + this.attributes$.pipe(distinctUntilChanged(deepEqual)).subscribe((attributes) => { + this.attributes = attributes; + }) + ); } private async initializeSavedLinks() { const { attributes } = await this.attributeService.unwrapAttributes(this.getInput()); - if (this.isDestroyed) return; - - this.dispatch.setAttributes(attributes); - + this.attributes$.next(attributes); await this.initializeOutput(); } private async initializeOutput() { - const attributes = this.getState().componentState; const { title, description } = this.getInput(); this.updateOutput({ - defaultTitle: attributes.title, - defaultDescription: attributes.description, - title: title ?? attributes.title, - description: description ?? attributes.description, + defaultTitle: this.attributes?.title, + defaultDescription: this.attributes?.description, + title: title ?? this.attributes?.title, + description: description ?? this.attributes?.description, }); } @@ -162,7 +125,7 @@ export class LinksEmbeddable public async reload() { if (this.isDestroyed) return; - // By-reference embeddable panels are reloaded when changed, so update the componentState + // By-reference embeddable panels are reloaded when changed, so update the attributes this.initializeSavedLinks(); if (this.domNode) { this.render(this.domNode); @@ -173,7 +136,6 @@ export class LinksEmbeddable this.isDestroyed = true; super.destroy(); this.subscriptions.unsubscribe(); - this.cleanupStateTools(); if (this.domNode) { unmountComponentAtNode(this.domNode); } diff --git a/src/plugins/links/public/embeddable/links_embeddable_factory.ts b/src/plugins/links/public/embeddable/links_embeddable_factory.ts index e0502d34a742c..e1446aff316af 100644 --- a/src/plugins/links/public/embeddable/links_embeddable_factory.ts +++ b/src/plugins/links/public/embeddable/links_embeddable_factory.ts @@ -6,34 +6,33 @@ * Side Public License, v 1. */ +import { DASHBOARD_GRID_COLUMN_COUNT } from '@kbn/dashboard-plugin/public'; +import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; +import { IProvidesPanelPlacementSettings } from '@kbn/dashboard-plugin/public/dashboard_container/component/panel_placement/types'; +import { EmbeddableStateWithType } from '@kbn/embeddable-plugin/common'; import { EmbeddableFactory, EmbeddableFactoryDefinition, ErrorEmbeddable, } from '@kbn/embeddable-plugin/public'; import { - MigrateFunctionsObject, GetMigrationFunctionObjectFn, + MigrateFunctionsObject, } from '@kbn/kibana-utils-plugin/common'; -import { EmbeddableStateWithType } from '@kbn/embeddable-plugin/common'; -import { DASHBOARD_GRID_COLUMN_COUNT } from '@kbn/dashboard-plugin/public'; import { UiActionsPresentableGrouping } from '@kbn/ui-actions-plugin/public'; -import { lazyLoadReduxToolsPackage } from '@kbn/presentation-util-plugin/public'; -import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; -import { IProvidesPanelPlacementSettings } from '@kbn/dashboard-plugin/public/dashboard_container/component/panel_placement/types'; +import { APP_ICON, APP_NAME, CONTENT_ID } from '../../common'; +import { LinksAttributes } from '../../common/content_management'; +import { extract, inject } from '../../common/embeddable'; +import { LinksStrings } from '../components/links_strings'; +import { getLinksAttributeService } from '../services/attribute_service'; import { coreServices, presentationUtil, untilPluginStartServicesReady, } from '../services/kibana_services'; -import { extract, inject } from '../../common/embeddable'; import type { LinksEmbeddable } from './links_embeddable'; -import { LinksStrings } from '../components/links_strings'; -import { APP_ICON, APP_NAME, CONTENT_ID } from '../../common'; -import { LinksAttributes } from '../../common/content_management'; -import { getLinksAttributeService } from '../services/attribute_service'; -import { LinksInput, LinksByReferenceInput, LinksEditorFlyoutReturn } from './types'; +import { LinksByReferenceInput, LinksEditorFlyoutReturn, LinksInput } from './types'; export type LinksFactory = EmbeddableFactory; @@ -111,12 +110,10 @@ export class LinksFactoryDefinition public async create(initialInput: LinksInput, parent: DashboardContainer) { await untilPluginStartServicesReady(); - const reduxEmbeddablePackage = await lazyLoadReduxToolsPackage(); const { LinksEmbeddable } = await import('./links_embeddable'); const editable = await this.isEditable(); return new LinksEmbeddable( - reduxEmbeddablePackage, { editable }, { ...getDefaultLinksInput(), ...initialInput }, getLinksAttributeService(), @@ -128,8 +125,6 @@ export class LinksFactoryDefinition initialInput: LinksInput, parent?: DashboardContainer ): Promise { - if (!parent) return { newInput: {} }; - const { openEditorFlyout } = await import('../editor/open_editor_flyout'); const { newInput, attributes } = await openEditorFlyout( diff --git a/src/plugins/links/public/embeddable/links_reducers.ts b/src/plugins/links/public/embeddable/links_reducers.ts deleted file mode 100644 index 659b19058adbb..0000000000000 --- a/src/plugins/links/public/embeddable/links_reducers.ts +++ /dev/null @@ -1,27 +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 { WritableDraft } from 'immer/dist/types/types-external'; - -import { PayloadAction } from '@reduxjs/toolkit'; - -import { LinksReduxState } from './types'; -import { LinksAttributes } from '../../common/content_management'; - -export const linksReducers = { - setLoading: (state: WritableDraft, action: PayloadAction) => { - state.output.loading = action.payload; - }, - - setAttributes: ( - state: WritableDraft, - action: PayloadAction - ) => { - state.componentState = { ...action.payload }; - }, -}; diff --git a/src/plugins/links/public/plugin.ts b/src/plugins/links/public/plugin.ts index 7927de88b80e7..f72f45d4c6a22 100644 --- a/src/plugins/links/public/plugin.ts +++ b/src/plugins/links/public/plugin.ts @@ -6,22 +6,29 @@ * Side Public License, v 1. */ -import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import { ContentManagementPublicSetup, ContentManagementPublicStart, } from '@kbn/content-management-plugin/public'; +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import { DashboardStart } from '@kbn/dashboard-plugin/public'; +import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; import { EmbeddableSetup, EmbeddableStart } from '@kbn/embeddable-plugin/public'; import { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; +import { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; +import { VisualizationsSetup } from '@kbn/visualizations-plugin/public'; -import { APP_NAME } from '../common'; +import { APP_ICON, APP_NAME, CONTENT_ID, LATEST_VERSION } from '../common'; +import { LinksCrudTypes } from '../common/content_management'; +import { LinksStrings } from './components/links_strings'; +import { getLinksClient } from './content_management/links_content_management_client'; import { LinksFactoryDefinition } from './embeddable'; -import { CONTENT_ID, LATEST_VERSION } from '../common'; +import { LinksByReferenceInput } from './embeddable/types'; import { setKibanaServices } from './services/kibana_services'; export interface LinksSetupDependencies { embeddable: EmbeddableSetup; + visualizations: VisualizationsSetup; contentManagement: ContentManagementPublicSetup; } @@ -30,6 +37,7 @@ export interface LinksStartDependencies { dashboard: DashboardStart; presentationUtil: PresentationUtilPluginStart; contentManagement: ContentManagementPublicStart; + usageCollection?: UsageCollectionStart; } export class LinksPlugin @@ -39,7 +47,9 @@ export class LinksPlugin public setup(core: CoreSetup, plugins: LinksSetupDependencies) { core.getStartServices().then(([_, deps]) => { - plugins.embeddable.registerEmbeddableFactory(CONTENT_ID, new LinksFactoryDefinition()); + const linksFactory = new LinksFactoryDefinition(); + + plugins.embeddable.registerEmbeddableFactory(CONTENT_ID, linksFactory); plugins.contentManagement.registry.register({ id: CONTENT_ID, @@ -48,6 +58,53 @@ export class LinksPlugin }, name: APP_NAME, }); + + const getExplicitInput = async ({ + savedObjectId, + parent, + }: { + savedObjectId?: string; + parent?: DashboardContainer; + }) => { + try { + await linksFactory.getExplicitInput({ savedObjectId } as LinksByReferenceInput, parent); + } catch { + // swallow any errors - this just means that the user cancelled editing + } + return; + }; + + plugins.visualizations.registerAlias({ + disableCreate: true, // do not allow creation through visualization listing page + name: CONTENT_ID, + title: APP_NAME, + icon: APP_ICON, + description: LinksStrings.getDescription(), + stage: 'experimental', + appExtensions: { + visualizations: { + docTypes: [CONTENT_ID], + searchFields: ['title^3'], + client: getLinksClient, + toListItem(linkItem: LinksCrudTypes['Item']) { + const { id, type, updatedAt, attributes } = linkItem; + const { title, description } = attributes; + + return { + id, + title, + editor: { onEdit: (savedObjectId: string) => getExplicitInput({ savedObjectId }) }, + description, + updatedAt, + icon: APP_ICON, + typeTitle: APP_NAME, + stage: 'experimental', + savedObjectType: type, + }; + }, + }, + }, + }); }); } diff --git a/src/plugins/links/public/services/kibana_services.ts b/src/plugins/links/public/services/kibana_services.ts index 76acd242f7575..7536c12262792 100644 --- a/src/plugins/links/public/services/kibana_services.ts +++ b/src/plugins/links/public/services/kibana_services.ts @@ -8,12 +8,13 @@ import { BehaviorSubject } from 'rxjs'; +import { ContentManagementPublicStart } from '@kbn/content-management-plugin/public'; import { CoreStart } from '@kbn/core/public'; import { DashboardStart } from '@kbn/dashboard-plugin/public'; import { EmbeddableStart } from '@kbn/embeddable-plugin/public'; import { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; -import { ContentManagementPublicStart } from '@kbn/content-management-plugin/public'; +import { CONTENT_ID } from '../../common'; import { LinksStartDependencies } from '../plugin'; export let coreServices: CoreStart; @@ -21,6 +22,11 @@ export let dashboardServices: DashboardStart; export let embeddableService: EmbeddableStart; export let presentationUtil: PresentationUtilPluginStart; export let contentManagement: ContentManagementPublicStart; +export let trackUiMetric: ( + type: string, + eventNames: string | string[], + count?: number +) => void | undefined; const servicesReady$ = new BehaviorSubject(false); @@ -42,6 +48,8 @@ export const setKibanaServices = (kibanaCore: CoreStart, deps: LinksStartDepende embeddableService = deps.embeddable; presentationUtil = deps.presentationUtil; contentManagement = deps.contentManagement; + if (deps.usageCollection) + trackUiMetric = deps.usageCollection.reportUiCounter.bind(deps.usageCollection, CONTENT_ID); servicesReady$.next(true); }; diff --git a/src/plugins/links/tsconfig.json b/src/plugins/links/tsconfig.json index e9814f4e107e7..f839243325d07 100644 --- a/src/plugins/links/tsconfig.json +++ b/src/plugins/links/tsconfig.json @@ -26,7 +26,11 @@ "@kbn/logging", "@kbn/core-plugins-server", "@kbn/react-kibana-mount", - "@kbn/react-kibana-context-theme" + "@kbn/react-kibana-context-theme", + "@kbn/analytics", + "@kbn/usage-collection-plugin", + "@kbn/visualizations-plugin", + "@kbn/core-mount-utils-browser" ], "exclude": ["target/**/*"] } diff --git a/src/plugins/telemetry/server/fetcher.test.ts b/src/plugins/telemetry/server/fetcher.test.ts index e1da374dc7239..5a61de1a0d83e 100644 --- a/src/plugins/telemetry/server/fetcher.test.ts +++ b/src/plugins/telemetry/server/fetcher.test.ts @@ -195,6 +195,61 @@ describe('FetcherTask', () => { }) ); + test( + 'Retries when `getCurrentConfigs` rejects', + fakeSchedulers(async (advance) => { + expect(fetcherTask['isOnline$'].value).toBe(false); + getCurrentConfigs.mockRejectedValueOnce(new Error('SomeError')).mockResolvedValue({ + telemetryOptIn: true, + telemetrySendUsageFrom: 'server', + failureCount: 0, + telemetryUrl: 'test-url', + }); + fetchMock.mockResolvedValue({}); + + const subscription = fetcherTask['validateConnectivity'](); + + // need to advance / await twice for retry + advance(5 * 60 * 1000); + await new Promise((resolve) => process.nextTick(resolve)); // Wait for the initial promise to fulfill + advance(1 * 60 * 1000); + await new Promise((resolve) => process.nextTick(resolve)); // Wait for the retry promise to fulfill + + expect(getCurrentConfigs).toHaveBeenCalledTimes(2); + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(updateReportFailure).toHaveBeenCalledTimes(0); + expect(fetcherTask['isOnline$'].value).toBe(true); + + subscription.unsubscribe(); + }) + ); + + test( + 'logs a message when retries are exceeded', + fakeSchedulers(async (advance) => { + expect(fetcherTask['isOnline$'].value).toBe(false); + getCurrentConfigs.mockRejectedValue(new Error('SomeError')); + + const subscription = fetcherTask['validateConnectivity'](); + + const wait = async () => { + advance(5 * 60 * 1000); + await new Promise((resolve) => process.nextTick(resolve)); // Wait for the initial promise to fulfill + }; + + for (let i = 0; i < 7; i++) { + await wait(); + } + + expect(fetcherTask['logger'].error).toBeCalledTimes(1); + expect(fetcherTask['logger'].error).toHaveBeenCalledWith( + `Cannot get the current config: SomeError` + ); + + subscription.unsubscribe(); + }) + ); + test( 'Should not retry if it hit the max number of failures for this version', fakeSchedulers(async (advance) => { diff --git a/src/plugins/telemetry/server/fetcher.ts b/src/plugins/telemetry/server/fetcher.ts index a79e043551775..756c9f49ded62 100644 --- a/src/plugins/telemetry/server/fetcher.ts +++ b/src/plugins/telemetry/server/fetcher.ts @@ -18,6 +18,10 @@ import { Subscription, takeUntil, timer, + catchError, + defer, + EMPTY, + retry, } from 'rxjs'; import fetch from 'node-fetch'; import type { TelemetryCollectionManagerPluginStart } from '@kbn/telemetry-collection-manager-plugin/server'; @@ -105,7 +109,25 @@ export class FetcherTask { // Skip any further processing if already online filter(() => !this.isOnline$.value), // Fetch current state and configs - exhaustMap(async () => await this.getCurrentConfigs()), + exhaustMap(() => { + return defer(() => { + return this.getCurrentConfigs(); + }).pipe( + // exp-backoff retries in case of errors fetching the config + retry({ + count: 5, + delay: (error, retryIndex) => { + const retryDelay = 1000 * Math.min(Math.pow(2, retryIndex + 2), 64); // 5 retries -> 8s, 16s, 32s, 64s, 64s + return timer(retryDelay); + }, + }), + // shallow errors if all retry failed, next time tick will continue the emission + catchError((err) => { + this.logger.error(`Cannot get the current config: ${err.message}`); + return EMPTY; + }) + ); + }), // Skip if opted-out, or should only send from the browser filter( ({ telemetryOptIn, telemetrySendUsageFrom }) => diff --git a/src/plugins/ui_actions/public/index.ts b/src/plugins/ui_actions/public/index.ts index ede7098b7e916..d996b6b4e2cdc 100644 --- a/src/plugins/ui_actions/public/index.ts +++ b/src/plugins/ui_actions/public/index.ts @@ -31,14 +31,11 @@ export { visualizeGeoFieldTrigger, ROW_CLICK_TRIGGER, rowClickTrigger, - CATEGORIZE_FIELD_TRIGGER, - categorizeFieldTrigger, } from '@kbn/ui-actions-browser/src/triggers'; -export type { VisualizeFieldContext, CategorizeFieldContext } from './types'; +export type { VisualizeFieldContext } from './types'; export { ACTION_VISUALIZE_FIELD, ACTION_VISUALIZE_GEO_FIELD, ACTION_VISUALIZE_LENS_FIELD, - ACTION_CATEGORIZE_FIELD, } from './types'; export type { ActionExecutionContext, ActionExecutionMeta, ActionMenuItemProps } from './actions'; diff --git a/src/plugins/ui_actions/public/plugin.ts b/src/plugins/ui_actions/public/plugin.ts index 52629aa3f572d..16060d4bf3435 100644 --- a/src/plugins/ui_actions/public/plugin.ts +++ b/src/plugins/ui_actions/public/plugin.ts @@ -9,7 +9,6 @@ import { CoreStart, CoreSetup, Plugin, PluginInitializerContext } from '@kbn/core/public'; import { PublicMethodsOf } from '@kbn/utility-types'; import { - categorizeFieldTrigger, rowClickTrigger, visualizeFieldTrigger, visualizeGeoFieldTrigger, @@ -39,7 +38,6 @@ export class UiActionsPlugin implements Plugin { this.service.registerTrigger(rowClickTrigger); this.service.registerTrigger(visualizeFieldTrigger); this.service.registerTrigger(visualizeGeoFieldTrigger); - this.service.registerTrigger(categorizeFieldTrigger); return this.service; } diff --git a/src/plugins/ui_actions/public/types.ts b/src/plugins/ui_actions/public/types.ts index 6d689f6776d96..c66ea2b1769bd 100644 --- a/src/plugins/ui_actions/public/types.ts +++ b/src/plugins/ui_actions/public/types.ts @@ -7,7 +7,7 @@ */ import type { DatatableColumn } from '@kbn/expressions-plugin/common'; import type { AggregateQuery } from '@kbn/es-query'; -import type { DataViewField, DataViewSpec, DataView } from '@kbn/data-views-plugin/public'; +import type { DataViewSpec } from '@kbn/data-views-plugin/public'; import { ActionInternal } from './actions/action_internal'; import { TriggerInternal } from './triggers/trigger_internal'; @@ -24,13 +24,6 @@ export interface VisualizeFieldContext { query?: AggregateQuery; } -export interface CategorizeFieldContext { - field: DataViewField; - dataView: DataView; - originatingApp: string; -} - export const ACTION_VISUALIZE_FIELD = 'ACTION_VISUALIZE_FIELD'; export const ACTION_VISUALIZE_GEO_FIELD = 'ACTION_VISUALIZE_GEO_FIELD'; export const ACTION_VISUALIZE_LENS_FIELD = 'ACTION_VISUALIZE_LENS_FIELD'; -export const ACTION_CATEGORIZE_FIELD = 'ACTION_CATEGORIZE_FIELD'; diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.test.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.test.tsx index fc8f7498f6efc..6c6ae2852e053 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.test.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.test.tsx @@ -12,13 +12,13 @@ import { getHeight } from './get_height'; describe('getHeight', () => { Object.defineProperty(window, 'innerHeight', { writable: true, configurable: true, value: 500 }); - const getMonacoMock = (lineCount: number) => { + const getMonacoMock = (lineCount: number, top: number = 200) => { return { getDomNode: jest.fn(() => { return { getBoundingClientRect: jest.fn(() => { return { - top: 200, + top, }; }), }; @@ -29,10 +29,17 @@ describe('getHeight', () => { } as unknown as monaco.editor.IStandaloneCodeEditor; }; test('when using document explorer, returning the available height in the flyout', () => { + const monacoMock = getMonacoMock(500, 0); + + const height = getHeight(monacoMock, true); + expect(height).toBe(475); + }); + + test('when using document explorer, returning the available height in the flyout has a minimun guarenteed height', () => { const monacoMock = getMonacoMock(500); const height = getHeight(monacoMock, true); - expect(height).toBe(275); + expect(height).toBe(400); }); test('when using classic table, its displayed inline without scrolling', () => { diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.tsx index 0dcabc8ae951d..dbab289018a63 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/get_height.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ import { monaco } from '@kbn/monaco'; -import { MARGIN_BOTTOM, MAX_LINES_CLASSIC_TABLE } from './source'; +import { MARGIN_BOTTOM, MAX_LINES_CLASSIC_TABLE, MIN_HEIGHT } from './source'; export function getHeight(editor: monaco.editor.IStandaloneCodeEditor, useDocExplorer: boolean) { const editorElement = editor?.getDomNode(); @@ -28,5 +28,5 @@ export function getHeight(editor: monaco.editor.IStandaloneCodeEditor, useDocExp lineCount > MAX_LINES_CLASSIC_TABLE ? MAX_LINES_CLASSIC_TABLE : lineCount; result = editor.getTopForLineNumber(displayedLineCount + 1) + lineHeight; } - return result > 0 ? result : 0; + return Math.max(result, MIN_HEIGHT); } diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/source.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/source.tsx index 26c771e405be8..140fbd6e08cb0 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/source.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_source/source.tsx @@ -36,6 +36,8 @@ interface SourceViewerProps { export const MAX_LINES_CLASSIC_TABLE = 500; // Displayed margin of the code editor to the window bottom when rendered in the document explorer flyout export const MARGIN_BOTTOM = 25; +// Minimum height for the source content to guarantee minimum space when the flyout is scrollable. +export const MIN_HEIGHT = 400; export const DocViewerSource = ({ id, diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.test.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.test.tsx index 3a614ef71ad5e..cdf4b7cb9b0b7 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.test.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.test.tsx @@ -248,6 +248,7 @@ describe('DocViewTable at Discover Doc', () => { const props = { hit, dataView, + hideActionsColumn: true, }; const component = mountComponent(props); const foundLength = findTestSubject(component, 'addInclusiveFilterButton').length; diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.tsx index 531fafa408ece..3d5c7e277be50 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table.tsx @@ -25,6 +25,7 @@ export const DocViewerLegacyTable = ({ columns, hit, dataView, + hideActionsColumn, filter, onAddColumn, onRemoveColumn, @@ -34,8 +35,8 @@ export const DocViewerLegacyTable = ({ const mapping = useCallback((name: string) => dataView.fields.getByName(name), [dataView.fields]); const tableColumns = useMemo(() => { - return filter ? [ACTIONS_COLUMN, ...MAIN_COLUMNS] : MAIN_COLUMNS; - }, [filter]); + return !hideActionsColumn ? [ACTIONS_COLUMN, ...MAIN_COLUMNS] : MAIN_COLUMNS; + }, [hideActionsColumn]); const onToggleColumn = useCallback( (field: string) => { if (!onRemoveColumn || !onAddColumn || !columns) { diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_cell_actions.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_cell_actions.tsx index 4499a44190747..2a202513340bf 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_cell_actions.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/legacy/table_cell_actions.tsx @@ -36,11 +36,11 @@ export const TableActions = ({ return (
    onFilter(fieldMapping, flattenedField, '+')} /> onFilter(fieldMapping, flattenedField, '-')} /> onToggleColumn(field)} /> onFilter('_exists_', field, '+')} scripted={fieldMapping && fieldMapping.scripted} /> diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx index 5a53f8a8eee50..4364ab5ae4ed0 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.tsx @@ -109,6 +109,7 @@ export const DocViewerTable = ({ columnTypes, hit, dataView, + hideActionsColumn, filter, onAddColumn, onRemoveColumn, @@ -118,7 +119,6 @@ export const DocViewerTable = ({ const { fieldFormats, storage, uiSettings } = useUnifiedDocViewerServices(); const showMultiFields = uiSettings.get(SHOW_MULTIFIELDS); const currentDataViewId = dataView.id!; - const isSingleDocView = !filter; const [searchText, setSearchText] = useState(getSearchText(storage)); const [pinnedFields, setPinnedFields] = useState( @@ -283,7 +283,7 @@ export const DocViewerTable = ({ ); const headers = [ - !isSingleDocView && ( + !hideActionsColumn && ( { return ( - {!isSingleDocView && ( + {!hideActionsColumn && ( { + it('should render the panels correctly for undefined onFilter function', () => { + render( + + ); + expect(screen.getByTestId('addFilterForValueButton-message')).toBeDisabled(); + expect(screen.getByTestId('addFilterOutValueButton-message')).toBeDisabled(); + expect(screen.getByTestId('addExistsFilterButton-message')).toBeDisabled(); + expect(screen.getByTestId('toggleColumnButton-message')).not.toBeDisabled(); + expect(screen.getByTestId('togglePinFilterButton-message')).not.toBeDisabled(); + }); + + it('should render the panels correctly for defined onFilter function', () => { + render( + + ); + expect(screen.getByTestId('addFilterForValueButton-message')).not.toBeDisabled(); + expect(screen.getByTestId('addFilterOutValueButton-message')).not.toBeDisabled(); + expect(screen.getByTestId('addExistsFilterButton-message')).not.toBeDisabled(); + expect(screen.getByTestId('toggleColumnButton-message')).not.toBeDisabled(); + expect(screen.getByTestId('togglePinFilterButton-message')).not.toBeDisabled(); + }); +}); diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_actions.tsx b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_actions.tsx index 8b9a35e071310..0ebef67a7c76b 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_actions.tsx +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table_cell_actions.tsx @@ -25,7 +25,7 @@ interface TableActionsProps { pinned: boolean; flattenedField: unknown; fieldMapping?: DataViewField; - onFilter: DocViewFilterFn; + onFilter?: DocViewFilterFn; onToggleColumn: (field: string) => void; ignoredValue: boolean; onTogglePinned: (field: string) => void; @@ -51,7 +51,8 @@ export const TableActions = ({ }); // Filters pair - const filtersPairDisabled = !fieldMapping || !fieldMapping.filterable || ignoredValue; + const filtersPairDisabled = + !fieldMapping || !fieldMapping.filterable || ignoredValue || !onFilter; const filterAddLabel = i18n.translate( 'unifiedDocViewer.docViews.table.filterForValueButtonTooltip', { @@ -88,7 +89,7 @@ export const TableActions = ({ 'unifiedDocViewer.docViews.table.filterForFieldPresentButtonAriaLabel', { defaultMessage: 'Filter for field present' } ); - const filtersExistsDisabled = !fieldMapping || !fieldMapping.filterable; + const filtersExistsDisabled = !fieldMapping || !fieldMapping.filterable || !onFilter; const filtersExistsToolTip = (filtersExistsDisabled && (fieldMapping && fieldMapping.scripted @@ -156,7 +157,9 @@ export const TableActions = ({ icon: 'plusInCircle', disabled: filtersPairDisabled, 'data-test-subj': `addFilterForValueButton-${field}`, - onClick: onClickAction(onFilter.bind({}, fieldMapping, flattenedField, '+')), + onClick: onFilter + ? onClickAction(onFilter.bind({}, fieldMapping, flattenedField, '+')) + : undefined, }, { name: filterOutLabel, @@ -164,7 +167,10 @@ export const TableActions = ({ toolTipContent: filtersPairToolTip, icon: 'minusInCircle', disabled: filtersPairDisabled, - onClick: onClickAction(onFilter.bind({}, fieldMapping, flattenedField, '-')), + 'data-test-subj': `addFilterOutValueButton-${field}`, + onClick: onFilter + ? onClickAction(onFilter.bind({}, fieldMapping, flattenedField, '-')) + : undefined, }, { name: filterExistsLabel, @@ -173,7 +179,7 @@ export const TableActions = ({ icon: 'filter', disabled: filtersExistsDisabled, 'data-test-subj': `addExistsFilterButton-${field}`, - onClick: onClickAction(onFilter.bind({}, '_exists_', field, '+')), + onClick: onFilter ? onClickAction(onFilter.bind({}, '_exists_', field, '+')) : undefined, }, { name: toggleColumnsLabel, @@ -186,6 +192,7 @@ export const TableActions = ({ name: pinnedLabel, 'aria-label': pinnedAriaLabel, icon: pinnedIconType, + 'data-test-subj': `togglePinFilterButton-${field}`, onClick: onClickAction(togglePinned), }, ], diff --git a/src/plugins/unified_histogram/public/chart/chart.tsx b/src/plugins/unified_histogram/public/chart/chart.tsx index 42f3d56584789..a64944d73b5fe 100644 --- a/src/plugins/unified_histogram/public/chart/chart.tsx +++ b/src/plugins/unified_histogram/public/chart/chart.tsx @@ -76,6 +76,7 @@ export interface ChartProps { lensAdapters?: UnifiedHistogramChartLoadEvent['adapters']; lensEmbeddableOutput$?: Observable; isOnHistogramMode?: boolean; + histogramQuery?: AggregateQuery; isChartLoading?: boolean; onResetChartHeight?: () => void; onChartHiddenChange?: (chartHidden: boolean) => void; @@ -115,6 +116,7 @@ export function Chart({ lensAdapters, lensEmbeddableOutput$, isOnHistogramMode, + histogramQuery, isChartLoading, onResetChartHeight, onChartHiddenChange, @@ -216,7 +218,7 @@ export function Chart({ getLensAttributes({ title: chart?.title, filters, - query, + query: histogramQuery ?? query, dataView, timeInterval: chart?.timeInterval, breakdownField: breakdown?.field, @@ -230,6 +232,7 @@ export function Chart({ dataView, filters, query, + histogramQuery, ] ); diff --git a/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx b/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx index 486ea7da79872..5ed329f251a97 100644 --- a/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx +++ b/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx @@ -68,6 +68,7 @@ export function ChartConfigPanel({ updatePanelState={updateSuggestion} lensAdapters={lensAdapters} output$={lensEmbeddableOutput$} + displayFlyoutHeader closeFlyout={() => { setIsFlyoutVisible(false); }} diff --git a/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts b/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts index d891c62df3514..119356af6f63f 100644 --- a/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts +++ b/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.test.ts @@ -38,6 +38,7 @@ describe('useLensSuggestions', () => { allSuggestions: [], currentSuggestion: undefined, isOnHistogramMode: false, + histogramQuery: undefined, suggestionUnsupported: false, }); }); @@ -66,6 +67,7 @@ describe('useLensSuggestions', () => { allSuggestions: allSuggestionsMock, currentSuggestion: allSuggestionsMock[0], isOnHistogramMode: false, + histogramQuery: undefined, suggestionUnsupported: false, }); }); @@ -94,6 +96,7 @@ describe('useLensSuggestions', () => { allSuggestions: [], currentSuggestion: undefined, isOnHistogramMode: false, + histogramQuery: undefined, suggestionUnsupported: true, }); }); @@ -133,10 +136,52 @@ describe('useLensSuggestions', () => { allSuggestions: [], currentSuggestion: allSuggestionsMock[0], isOnHistogramMode: true, + histogramQuery: { + esql: 'from the-data-view | limit 100 | EVAL timestamp=DATE_TRUNC(30 minute, @timestamp) | stats rows = count(*) by timestamp | rename timestamp as `@timestamp every 30 minute`', + }, suggestionUnsupported: false, }); }); + test('should return histogramSuggestion even if the ESQL query contains a DROP @timestamp statement', async () => { + const firstMockReturn = undefined; + const secondMockReturn = allSuggestionsMock; + const lensSuggestionsApi = jest + .fn() + .mockReturnValueOnce(firstMockReturn) // will return to firstMockReturn object firstly + .mockReturnValueOnce(secondMockReturn); // will return to secondMockReturn object secondly + + renderHook(() => { + return useLensSuggestions({ + dataView: dataViewMock, + query: { esql: 'from the-data-view | DROP @timestamp | limit 100' }, + isPlainRecord: true, + columns: [ + { + id: 'var0', + name: 'var0', + meta: { + type: 'number', + }, + }, + ], + data: dataMock, + lensSuggestionsApi, + timeRange: { + from: '2023-09-03T08:00:00.000Z', + to: '2023-09-04T08:56:28.274Z', + }, + }); + }); + expect(lensSuggestionsApi).toHaveBeenLastCalledWith( + expect.objectContaining({ + query: { esql: expect.stringMatching('from the-data-view | limit 100 ') }, + }), + expect.anything(), + ['lnsDatatable'] + ); + }); + test('should not return histogramSuggestion if no suggestions returned by the api and transformational commands', async () => { const firstMockReturn = undefined; const secondMockReturn = allSuggestionsMock; @@ -172,6 +217,7 @@ describe('useLensSuggestions', () => { allSuggestions: [], currentSuggestion: undefined, isOnHistogramMode: false, + histogramQuery: undefined, suggestionUnsupported: true, }); }); diff --git a/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.ts b/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.ts index 514c32cefcb80..063e1b7ef89a2 100644 --- a/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.ts +++ b/src/plugins/unified_histogram/public/layout/hooks/use_lens_suggestions.ts @@ -11,6 +11,7 @@ import { AggregateQuery, isOfAggregateQueryType, getAggregateQueryMode, + cleanupESQLQueryForLensSuggestions, Query, TimeRange, } from '@kbn/es-query'; @@ -61,7 +62,7 @@ export const useLensSuggestions = ({ const [allSuggestions, setAllSuggestions] = useState(suggestions.allSuggestions); const currentSuggestion = originalSuggestion ?? suggestions.firstSuggestion; const suggestionDeps = useRef(getSuggestionDeps({ dataView, query, columns })); - + const histogramQuery = useRef(); const histogramSuggestion = useMemo(() => { if ( !currentSuggestion && @@ -85,8 +86,8 @@ export const useLensSuggestions = ({ const interval = computeInterval(timeRange, data); const language = getAggregateQueryMode(query); - const histogramQuery = `${query[language]} - | EVAL timestamp=DATE_TRUNC(${interval}, ${dataView.timeFieldName}) | stats rows = count(*) by timestamp | rename timestamp as \`${dataView.timeFieldName} every ${interval}\``; + const safeQuery = cleanupESQLQueryForLensSuggestions(query[language]); + const esqlQuery = `${safeQuery} | EVAL timestamp=DATE_TRUNC(${interval}, ${dataView.timeFieldName}) | stats rows = count(*) by timestamp | rename timestamp as \`${dataView.timeFieldName} every ${interval}\``; const context = { dataViewSpec: dataView?.toSpec(), fieldName: '', @@ -107,15 +108,16 @@ export const useLensSuggestions = ({ }, ] as DatatableColumn[], query: { - esql: histogramQuery, + esql: esqlQuery, }, }; const sug = lensSuggestionsApi(context, dataView, ['lnsDatatable']) ?? []; if (sug.length) { + histogramQuery.current = { esql: esqlQuery }; return sug[0]; } - return undefined; } + histogramQuery.current = undefined; return undefined; }, [currentSuggestion, dataView, query, timeRange, data, lensSuggestionsApi]); @@ -142,6 +144,7 @@ export const useLensSuggestions = ({ currentSuggestion: histogramSuggestion ?? currentSuggestion, suggestionUnsupported: !currentSuggestion && !histogramSuggestion && isPlainRecord, isOnHistogramMode: Boolean(histogramSuggestion), + histogramQuery: histogramQuery.current ? histogramQuery.current : undefined, }; }; diff --git a/src/plugins/unified_histogram/public/layout/layout.tsx b/src/plugins/unified_histogram/public/layout/layout.tsx index d923ea3031a50..17eaf65fcde5f 100644 --- a/src/plugins/unified_histogram/public/layout/layout.tsx +++ b/src/plugins/unified_histogram/public/layout/layout.tsx @@ -215,18 +215,23 @@ export const UnifiedHistogramLayout = ({ children, withDefaultActions, }: UnifiedHistogramLayoutProps) => { - const { allSuggestions, currentSuggestion, suggestionUnsupported, isOnHistogramMode } = - useLensSuggestions({ - dataView, - query, - originalSuggestion, - isPlainRecord, - columns, - timeRange, - data: services.data, - lensSuggestionsApi, - onSuggestionChange, - }); + const { + allSuggestions, + currentSuggestion, + suggestionUnsupported, + isOnHistogramMode, + histogramQuery, + } = useLensSuggestions({ + dataView, + query, + originalSuggestion, + isPlainRecord, + columns, + timeRange, + data: services.data, + lensSuggestionsApi, + onSuggestionChange, + }); const chart = suggestionUnsupported ? undefined : originalChart; const [topPanelNode] = useState(() => @@ -302,6 +307,7 @@ export const UnifiedHistogramLayout = ({ lensAdapters={lensAdapters} lensEmbeddableOutput$={lensEmbeddableOutput$} isOnHistogramMode={isOnHistogramMode} + histogramQuery={histogramQuery} withDefaultActions={withDefaultActions} /> diff --git a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx index e1565f1ff6b0d..8c35ed21568bb 100644 --- a/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx +++ b/src/plugins/unified_search/public/dataview_picker/change_dataview.tsx @@ -215,7 +215,7 @@ export function ChangeDataView({ })} ) : ( - + ), ); @@ -336,7 +336,7 @@ export function ChangeDataView({ if (textBasedLanguages?.length) { panelItems.push( , - + extends React.Com } protected onSearchChange = (value: string | number | boolean) => { + this.setState({ isLoading: true }); this.updateSuggestions(`${value}`); }; diff --git a/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx b/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx index 62648ae50d26a..adb80df6cf543 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx +++ b/src/plugins/unified_search/public/filter_bar/filter_editor/phrase_value_input.tsx @@ -54,7 +54,7 @@ class PhraseValueInputUI extends PhraseSuggestorUI { } private renderWithSuggestions() { - const { suggestions } = this.state; + const { suggestions, isLoading } = this.state; const { value, intl, onChange, fullWidth } = this.props; // there are cases when the value is a number, this would cause an exception const valueAsStr = String(value); @@ -62,6 +62,8 @@ class PhraseValueInputUI extends PhraseSuggestorUI { return (
    { this.inputRef = ref; }} diff --git a/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx b/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx index 513dad1445823..500b875f42667 100644 --- a/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx +++ b/src/plugins/unified_search/public/filter_bar/filter_editor/phrases_values_input.tsx @@ -31,13 +31,15 @@ class PhrasesValuesInputUI extends PhraseSuggestorUI { comboBoxWrapperRef = React.createRef(); public render() { - const { suggestions } = this.state; + const { suggestions, isLoading } = this.state; const { values, intl, onChange, fullWidth, onParamsUpdate, compressed, disabled } = this.props; const options = values ? uniq([...values, ...suggestions]) : suggestions; return (
    { { id: 'wat', image: undefined, + editor: { + editUrl: '/edit/wat', + }, readOnly: false, references: undefined, icon: undefined, savedObjectType: 'visualization', - editUrl: '/edit/wat', type: 'test', typeName: 'test', typeTitle: undefined, diff --git a/src/plugins/visualizations/public/utils/saved_visualize_utils.ts b/src/plugins/visualizations/public/utils/saved_visualize_utils.ts index 9232504e026d3..85932c09729c3 100644 --- a/src/plugins/visualizations/public/utils/saved_visualize_utils.ts +++ b/src/plugins/visualizations/public/utils/saved_visualize_utils.ts @@ -73,7 +73,7 @@ export function mapHitSource( references: SavedObjectReference[]; url: string; savedObjectType?: string; - editUrl?: string; + editor?: { editUrl?: string }; updatedAt?: string; type?: BaseVisType; icon?: BaseVisType['icon']; @@ -108,7 +108,7 @@ export function mapHitSource( newAttributes.icon = newAttributes.type?.icon; newAttributes.image = newAttributes.type?.image; newAttributes.typeTitle = newAttributes.type?.title; - newAttributes.editUrl = `/edit/${id}`; + newAttributes.editor = { editUrl: `/edit/${id}` }; newAttributes.readOnly = Boolean(visTypes.get(typeName as string)?.disableEdit); return newAttributes; @@ -168,7 +168,6 @@ export async function findListItems( return acc; }, acc); }, {} as { [visType: string]: VisualizationsAppExtension }); - const searchOption = (field: string, ...defaults: string[]) => _(extensions).map(field).concat(defaults).compact().flatten().uniq().value() as string[]; diff --git a/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts b/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts index 2a46b28f06dd9..617f0386f6181 100644 --- a/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts +++ b/src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts @@ -19,8 +19,6 @@ import { BaseVisType } from './base_vis_type'; export type VisualizationStage = 'experimental' | 'beta' | 'production'; export interface VisualizationListItem { - editUrl: string; - editApp?: string; error?: string; icon: string; id: string; @@ -32,6 +30,9 @@ export interface VisualizationListItem { typeTitle: string; image?: string; type?: BaseVisType | string; + editor: + | { editUrl: string; editApp?: string } + | { onEdit: (savedObjectId: string) => Promise }; } export interface SerializableAttributes { @@ -86,8 +87,14 @@ export interface VisualizationsAppExtension { } export interface VisTypeAlias { - aliasPath: string; - aliasApp: string; + /** + * Provide `alias` when your visualization has a dedicated app for creation. + * TODO: Provide a generic callback to create visualizations inline. + */ + alias?: { + app: string; + path: string; + }; name: string; title: string; icon: string; diff --git a/src/plugins/visualizations/public/visualize_app/components/visualize_listing.scss b/src/plugins/visualizations/public/visualize_app/components/visualize_listing.scss index 7fe4fe05ab267..48df3fc673886 100644 --- a/src/plugins/visualizations/public/visualize_app/components/visualize_listing.scss +++ b/src/plugins/visualizations/public/visualize_app/components/visualize_listing.scss @@ -11,7 +11,7 @@ .visListingTable__experimentalIcon { width: $euiSizeL; - vertical-align: baseline; + vertical-align: middle; padding: 0 $euiSizeS; margin-left: $euiSizeS; } diff --git a/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx b/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx index d4beb45c4e248..d1de28ac73795 100644 --- a/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx +++ b/src/plugins/visualizations/public/visualize_app/components/visualize_listing.tsx @@ -36,6 +36,7 @@ import { TableListViewProps, } from '@kbn/content-management-table-list-view'; import { TableListViewTable } from '@kbn/content-management-table-list-view-table'; + import { findListItems } from '../../utils/saved_visualize_utils'; import { updateBasicSoAttributes } from '../../utils/saved_objects_utils/update_basic_attributes'; import { checkForDuplicateTitle } from '../../utils/saved_objects_utils/check_for_duplicate_title'; @@ -49,17 +50,17 @@ import { getNoItemsMessage, getCustomColumn } from '../utils'; import { getVisualizeListItemLink } from '../utils/get_visualize_list_item_link'; import type { VisualizationStage } from '../../vis_types/vis_type_alias_registry'; -interface VisualizeUserContent extends VisualizationListItem, UserContentCommonSchema { - type: string; - attributes: { - title: string; - description?: string; - editApp: string; - editUrl: string; - readOnly: boolean; - error?: string; +type VisualizeUserContent = VisualizationListItem & + UserContentCommonSchema & { + type: string; + attributes: { + id: string; + title: string; + description?: string; + readOnly: boolean; + error?: string; + }; }; -} const toTableListViewSavedObject = (savedObject: Record): VisualizeUserContent => { return { @@ -67,19 +68,17 @@ const toTableListViewSavedObject = (savedObject: Record): Visua updatedAt: savedObject.updatedAt as string, references: savedObject.references as Array<{ id: string; type: string; name: string }>, type: savedObject.savedObjectType as string, - editUrl: savedObject.editUrl as string, - editApp: savedObject.editApp as string, icon: savedObject.icon as string, stage: savedObject.stage as VisualizationStage, savedObjectType: savedObject.savedObjectType as string, typeTitle: savedObject.typeTitle as string, title: (savedObject.title as string) ?? '', error: (savedObject.error as string) ?? '', + editor: savedObject.editor as any, attributes: { + id: savedObject.id as string, title: (savedObject.title as string) ?? '', description: savedObject.description as string, - editApp: savedObject.editApp as string, - editUrl: savedObject.editUrl as string, readOnly: savedObject.readOnly as boolean, error: savedObject.error as string, }, @@ -120,7 +119,13 @@ const useTableListViewProps = ( }, [closeNewVisModal]); const editItem = useCallback( - ({ attributes: { editUrl, editApp } }: VisualizeUserContent) => { + async ({ attributes: { id }, editor }: VisualizeUserContent) => { + if (!('editApp' in editor || 'editUrl' in editor)) { + await editor.onEdit(id); + return; + } + + const { editApp, editUrl } = editor; if (editApp) { application.navigateToApp(editApp, { path: editUrl }); return; @@ -383,10 +388,19 @@ export const VisualizeListing = () => { entityNamePlural={i18n.translate('visualizations.listing.table.entityNamePlural', { defaultMessage: 'visualizations', })} - getDetailViewLink={({ attributes: { editApp, editUrl, error, readOnly } }) => - readOnly + onClickTitle={(item) => { + tableViewProps.editItem?.(item); + }} + getDetailViewLink={({ editor, attributes: { error, readOnly } }) => + readOnly || (editor && 'onEdit' in editor) ? undefined - : getVisualizeListItemLink(application, kbnUrlStateStorage, editApp, editUrl, error) + : getVisualizeListItemLink( + application, + kbnUrlStateStorage, + editor.editApp, + editor.editUrl, + error + ) } tableCaption={visualizeLibraryTitle} {...tableViewProps} diff --git a/src/plugins/visualizations/public/visualize_app/utils/get_visualize_list_item_link.ts b/src/plugins/visualizations/public/visualize_app/utils/get_visualize_list_item_link.ts index 524ccbad44f81..5c1a5b1ee3ebb 100644 --- a/src/plugins/visualizations/public/visualize_app/utils/get_visualize_list_item_link.ts +++ b/src/plugins/visualizations/public/visualize_app/utils/get_visualize_list_item_link.ts @@ -17,10 +17,10 @@ export const getVisualizeListItemLink = ( application: ApplicationStart, kbnUrlStateStorage: IKbnUrlStateStorage, editApp: string | undefined, - editUrl: string, + editUrl: string | undefined, error: string | undefined = undefined ) => { - if (error) { + if (error || (!editApp && !editUrl)) { return undefined; } diff --git a/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx b/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx index e1e9cec25e15a..a9a21446e06a2 100644 --- a/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx +++ b/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx @@ -37,8 +37,10 @@ describe('GroupSelection', () => { { name: 'visWithAliasUrl', title: 'Vis with alias Url', - aliasApp: 'aliasApp', - aliasPath: '#/aliasApp', + alias: { + app: 'aliasApp', + path: '#/aliasApp', + }, description: 'Vis with alias Url', stage: 'production', group: VisGroups.PROMOTED, @@ -49,8 +51,10 @@ describe('GroupSelection', () => { description: 'Vis alias with promotion', stage: 'production', group: VisGroups.PROMOTED, - aliasApp: 'anotherApp', - aliasPath: '#/anotherUrl', + alias: { + app: 'anotherApp', + path: '#/anotherUrl', + }, promotion: true, } as unknown, ] as BaseVisType[]; diff --git a/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx b/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx index dc8aaa03161b8..3bcdff18c47a7 100644 --- a/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx +++ b/src/plugins/visualizations/public/wizard/group_selection/group_selection.tsx @@ -200,7 +200,7 @@ const VisGroup = ({ visType, onVisTypeSelected }: VisCardProps) => { } onClick={onClick} data-test-subj={`visType-${visType.name}`} - data-vis-stage={!('aliasPath' in visType) ? visType.stage : 'alias'} + data-vis-stage={!('alias' in visType) ? visType.stage : 'alias'} aria-label={`visType-${visType.name}`} description={ <> diff --git a/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx index 907c989c7bb43..0db5f66cc5c92 100644 --- a/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx @@ -47,8 +47,10 @@ describe('NewVisModal', () => { title: 'Vis with alias Url', stage: 'production', group: VisGroups.PROMOTED, - aliasApp: 'otherApp', - aliasPath: '#/aliasUrl', + alias: { + app: 'otherApp', + path: '#/aliasUrl', + }, }, { name: 'visWithSearch', @@ -181,7 +183,7 @@ describe('NewVisModal', () => { ); }); - it('closes and redirects properly if visualization with aliasPath and originatingApp in props', () => { + it('closes and redirects properly if visualization with alias.path and originatingApp in props', () => { const onClose = jest.fn(); const navigateToApp = jest.fn(); const stateTransfer = embeddablePluginMock.createStartContract().getStateTransfer(); diff --git a/src/plugins/visualizations/public/wizard/new_vis_modal.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx index ac1f89e73700f..b1e5de3215260 100644 --- a/src/plugins/visualizations/public/wizard/new_vis_modal.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.tsx @@ -119,7 +119,7 @@ class NewVisModal extends React.Component { - if (!('aliasPath' in visType) && visType.requiresSearch && visType.options.showIndexSelection) { + if ('visConfig' in visType && visType.requiresSearch && visType.options.showIndexSelection) { this.setState({ showSearchVisModal: true, visType, @@ -143,10 +143,12 @@ class NewVisModal extends React.Component { let originalTitles: string[] = []; + const checkDashboardTitle = async (expectedTitle: string) => { + expect(await browser.getTitle()).to.equal(`${expectedTitle} - Elastic`); + await retry.try(async () => { + const breadcrumb = await globalNav.getLastBreadcrumb(); + expect(breadcrumb).to.equal(`Editing ${expectedTitle}`); + }); + }; + before(async () => { await kibanaServer.savedObjects.cleanStandardList(); await kibanaServer.importExport.load( @@ -60,13 +69,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should update the title of the dashboard', async () => { + await checkDashboardTitle('few panels'); + const newTitle = 'My awesome dashboard!!1'; await PageObjects.dashboard.openSettingsFlyout(); await dashboardSettings.setCustomPanelTitle(newTitle); await dashboardSettings.clickApplyButton(); - await retry.try(async () => { - expect((await globalNav.getLastBreadcrumb()) === newTitle); - }); + + await checkDashboardTitle(newTitle); }); it('should disable quick save when the settings are open', async () => { @@ -106,9 +116,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardSettings.expectDuplicateTitleWarningDisplayed(); }); await dashboardSettings.clickApplyButton(); - await retry.try(async () => { - expect((await globalNav.getLastBreadcrumb()) === newTitle); - }); + + await checkDashboardTitle(newTitle); }); }); } diff --git a/test/functional/apps/dashboard_elements/links/links_create_edit.ts b/test/functional/apps/dashboard_elements/links/links_create_edit.ts index 4a6e94c656bac..e0abfffbad181 100644 --- a/test/functional/apps/dashboard_elements/links/links_create_edit.ts +++ b/test/functional/apps/dashboard_elements/links/links_create_edit.ts @@ -78,18 +78,33 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboard.clickDiscardChanges(); }); - it('can create a new by-value links panel', async () => { - await dashboardAddPanel.clickEditorMenuButton(); - await dashboardAddPanel.clickAddNewEmbeddableLink('links'); - await dashboardLinks.setLayout('horizontal'); - await createSomeLinks(); - await dashboardLinks.toggleSaveByReference(false); - await dashboardLinks.clickPanelEditorSaveButton(); - await testSubjects.exists('addObjectToDashboardSuccess'); - - expect(await testSubjects.existOrFail('links--component')); - expect(await dashboardLinks.getNumberOfLinksInPanel()).to.equal(4); - await dashboard.clickDiscardChanges(); + describe('by-value links panel', async () => { + it('can create a new by-value links panel', async () => { + await dashboardAddPanel.clickEditorMenuButton(); + await dashboardAddPanel.clickAddNewEmbeddableLink('links'); + await dashboardLinks.setLayout('horizontal'); + await createSomeLinks(); + await dashboardLinks.toggleSaveByReference(false); + await dashboardLinks.clickPanelEditorSaveButton(); + await testSubjects.exists('addObjectToDashboardSuccess'); + + expect(await testSubjects.existOrFail('links--component')); + expect(await dashboardLinks.getNumberOfLinksInPanel()).to.equal(4); + }); + + it('can save by-value links panel to the library', async () => { + /** Navigate away to test non-extensible input */ + await dashboard.gotoDashboardLandingPage(); + await dashboard.clickUnsavedChangesContinueEditing(DASHBOARD_NAME); + + await dashboard.waitForRenderComplete(); + await dashboardPanelActions.saveToLibrary('Some more links'); + await testSubjects.existOrFail('addPanelToLibrarySuccess'); + }); + + after(async () => { + await dashboard.clickDiscardChanges(); + }); }); }); diff --git a/test/functional/apps/discover/group1/_url_state.ts b/test/functional/apps/discover/group1/_url_state.ts index 49957519cdc5d..027e767e8fe3d 100644 --- a/test/functional/apps/discover/group1/_url_state.ts +++ b/test/functional/apps/discover/group1/_url_state.ts @@ -107,7 +107,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { "to:'2015-09-23T18:31:44.000Z'))&_a=(columns:!(),filters:!(),index:'logstash-*'," + "interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))" ); - await appsMenu.clickLink('Discover'); + await appsMenu.clickLink('Discover', { category: 'kibana' }); await PageObjects.header.waitUntilLoadingHasFinished(); expect(await filterBar.hasFilter('extension.raw', '', undefined, true)).to.be(true); expect(await filterBar.isFilterPinned('extension.raw')).to.be(true); diff --git a/test/functional/apps/home/_navigation.ts b/test/functional/apps/home/_navigation.ts index 016cead53f0c4..1d0aeeea6a0d9 100644 --- a/test/functional/apps/home/_navigation.ts +++ b/test/functional/apps/home/_navigation.ts @@ -36,13 +36,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const homeUrl = await browser.getCurrentUrl(); // Navigate to discover app - await appsMenu.clickLink('Discover'); + await appsMenu.clickLink('Discover', { category: 'kibana' }); const discoverUrl = await browser.getCurrentUrl(); await PageObjects.timePicker.setDefaultAbsoluteRange(); const modifiedTimeDiscoverUrl = await browser.getCurrentUrl(); // Navigate to dashboard app - await appsMenu.clickLink('Dashboard'); + await appsMenu.clickLink('Dashboard', { category: 'kibana' }); // Navigating back to discover await browser.goBack(); diff --git a/test/functional/fixtures/es_archiver/many_fields/mappings.json b/test/functional/fixtures/es_archiver/many_fields/mappings.json index 491085676c16e..8fb5e73b4d040 100644 --- a/test/functional/fixtures/es_archiver/many_fields/mappings.json +++ b/test/functional/fixtures/es_archiver/many_fields/mappings.json @@ -38103,6 +38103,7 @@ "limit" : "50000" } }, + "auto_expand_replicas": "0-1", "number_of_shards" : "1", "number_of_replicas" : "0" } diff --git a/test/functional/services/apps_menu.ts b/test/functional/services/apps_menu.ts index 0f63166477883..0dddddd35e77a 100644 --- a/test/functional/services/apps_menu.ts +++ b/test/functional/services/apps_menu.ts @@ -116,23 +116,55 @@ export class AppsMenuService extends FtrService { category, }: { closeCollapsibleNav?: boolean; category?: string } = {} ) { - try { + await this.waitUntilLoadingHasFinished(); + + await this.ctx.getService('retry').try(async () => { this.log.debug(`click "${name}" app link`); - await this.openCollapsibleNav(); - let nav; - if (typeof category === 'string') { - nav = await this.testSubjects.find(`collapsibleNavGroup-${category}`); - } else { - nav = await this.testSubjects.find('collapsibleNav'); - } - const link = await nav.findByPartialLinkText(name); - await link.click(); - if (closeCollapsibleNav) { - await this.closeCollapsibleNav(); + try { + await this.openCollapsibleNav(); + let nav; + if (typeof category === 'string') { + // we can search within a specific section of the side nav + nav = await this.testSubjects.find(`collapsibleNavGroup-${category}`); + const link = await nav.findByPartialLinkText(name); + await link.click(); + } else { + // we need to search our app link in the whole side nav + // first, we get all the links, along with their inner text + const allLinks = await this.testSubjects.findAll('collapsibleNavAppLink'); + const allLinksTexts = await Promise.all( + allLinks.map((link) => link.getVisibleText().then((text) => ({ link, text }))) + ); + + // then, filter out those that don't have a matching text + const matchingLinks = allLinksTexts.filter(({ text }) => text.includes(name)); + if (matchingLinks.length === 0) { + this.log.debug( + `Found ${allLinks.length} links on the side nav: ${allLinksTexts.map( + ({ text }) => text + )}` + ); + throw new Error( + `Could not find the '${name}' application on the side nav (${allLinks.length} links found)` + ); + } else if (matchingLinks.length > 1) { + throw new Error( + `Multiple apps exist in the side nav with the specified name: '${name}'. Consider using the "category" parameter to disambiguate` + ); + } + + this.log.debug(`Found "${name}" app link on the side nav!`); + // if we click on a stale element (e.g. re-rendered) it'll throw an Error and we will retry + await matchingLinks.pop()!.link.click(); + } + + if (closeCollapsibleNav) { + await this.closeCollapsibleNav(); + } + } finally { + // Intentionally empty } - } finally { - // Intentionally empty - } + }); } } diff --git a/test/functional/services/flyout.ts b/test/functional/services/flyout.ts index 71c4f13556eb9..de1592a74c953 100644 --- a/test/functional/services/flyout.ts +++ b/test/functional/services/flyout.ts @@ -36,12 +36,23 @@ export class FlyoutService extends FtrService { if (!flyoutElements.length) { return true; } + let expectedFlyoutCount = 0; for (let i = 0; i < flyoutElements.length; i++) { - const closeBtn = await flyoutElements[i].findByCssSelector('[aria-label*="Close"]'); - await closeBtn.click(); + const closeBtnExists = await this.find.descendantExistsByCssSelector( + '[aria-label*="Close"]', + flyoutElements[i] + ); + if (closeBtnExists) { + const closeBtn = await flyoutElements[i].findByCssSelector('[aria-label*="Close"]'); + await closeBtn.click(); + } else { + // If it doesn't have a close button, it can't + // be closed, so ignore it in the count check + expectedFlyoutCount++; + } } flyoutElements = await this.find.allByCssSelector('.euiFlyout', 500); - return flyoutElements.length === 0; + return flyoutElements.length === expectedFlyoutCount; }); } } diff --git a/test/plugin_functional/plugins/core_plugin_route_timeouts/server/plugin.ts b/test/plugin_functional/plugins/core_plugin_route_timeouts/server/plugin.ts index fce258c1b8b00..5ecdc0a03dd08 100644 --- a/test/plugin_functional/plugins/core_plugin_route_timeouts/server/plugin.ts +++ b/test/plugin_functional/plugins/core_plugin_route_timeouts/server/plugin.ts @@ -53,7 +53,7 @@ export class CorePluginRouteTimeoutsPlugin implements Plugin { body: { accepts: ['application/json'], }, - timeout: { idleSocket: 10 }, + timeout: { idleSocket: 5 }, }, path: '/short_idle_socket_timeout', validate: { diff --git a/test/plugin_functional/test_suites/core/route.ts b/test/plugin_functional/test_suites/core/route.ts index 13bd4190d32f9..597189dd5faf3 100644 --- a/test/plugin_functional/test_suites/core/route.ts +++ b/test/plugin_functional/test_suites/core/route.ts @@ -7,14 +7,13 @@ */ import expect from '@kbn/expect'; -import { Test } from 'supertest'; -import { PluginFunctionalProviderContext } from '../../services'; +import type { Test } from 'supertest'; +import type { PluginFunctionalProviderContext } from '../../services'; export default function ({ getService }: PluginFunctionalProviderContext) { const supertest = getService('supertest'); - // FLAKY: https://github.com/elastic/kibana/issues/75440 - describe.skip('route', function () { + describe('route', function () { describe('timeouts', function () { const writeBodyCharAtATime = (request: Test, body: string, interval: number) => { return new Promise((resolve, reject) => { @@ -45,7 +44,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { .set('Transfer-Encoding', 'chunked') .set('kbn-xsrf', 'true'); - const result = writeBodyCharAtATime(request, '{"foo":"bar"}', 10); + const result = writeBodyCharAtATime(request, '{"foo":"bar"}', 20); await result.then( (res) => { @@ -65,7 +64,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { .set('Transfer-Encoding', 'chunked') .set('kbn-xsrf', 'true'); - const result = writeBodyCharAtATime(request, '{"foo":"bar"}', 10); + const result = writeBodyCharAtATime(request, '{"foo":"bar"}', 20); await result.then( (res) => { @@ -107,7 +106,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { .set('Transfer-Encoding', 'chunked') .set('kbn-xsrf', 'true'); - const result = writeBodyCharAtATime(request, '{"responseDelay":0}', 10); + const result = writeBodyCharAtATime(request, '{"responseDelay":0}', 20); await result.then( (res) => { @@ -119,44 +118,23 @@ export default function ({ getService }: PluginFunctionalProviderContext) { ); }); - it('should timeout if servers response is too slow', async function () { - // start the request - const request = supertest + it('should timeout if servers response is too slow', async () => { + await supertest .post('/short_idle_socket_timeout') + .send({ responseDelay: 100 }) .set('Content-Type', 'application/json') - .set('Transfer-Encoding', 'chunked') - .set('kbn-xsrf', 'true'); - - const result = writeBodyCharAtATime(request, '{"responseDelay":100}', 0); - - await result.then( - (res) => { - expect(res).to.be(undefined); - }, - (err) => { - expect(err.message).to.be('socket hang up'); - } - ); + .set('kbn-xsrf', 'true') + .then(() => expect('to throw').to.be('but it did NOT')) + .catch((error) => expect(error.message).to.be('socket hang up')); }); - it('should not timeout if servers response is fast enough', async function () { - // start the request - const request = supertest + it('should not timeout if servers response is fast enough', async () => { + await supertest .post('/longer_idle_socket_timeout') + .send({ responseDelay: 100 }) .set('Content-Type', 'application/json') - .set('Transfer-Encoding', 'chunked') - .set('kbn-xsrf', 'true'); - - const result = writeBodyCharAtATime(request, '{"responseDelay":100}', 0); - - await result.then( - (res) => { - expect(res).to.have.property('statusCode', 200); - }, - (err) => { - expect(err).to.be(undefined); - } - ); + .set('kbn-xsrf', 'true') + .expect(200); }); }); }); diff --git a/test/plugin_functional/test_suites/core_plugins/applications.ts b/test/plugin_functional/test_suites/core_plugins/applications.ts index 862cb6acfb6df..d33000bfa70c3 100644 --- a/test/plugin_functional/test_suites/core_plugins/applications.ts +++ b/test/plugin_functional/test_suites/core_plugins/applications.ts @@ -7,7 +7,7 @@ */ import expect from '@kbn/expect'; -import { PluginFunctionalProviderContext } from '../../services'; +import type { PluginFunctionalProviderContext } from '../../services'; export default function ({ getService, getPageObject }: PluginFunctionalProviderContext) { const common = getPageObject('common'); @@ -17,10 +17,24 @@ export default function ({ getService, getPageObject }: PluginFunctionalProvider const find = getService('find'); const deployment = getService('deployment'); const esArchiver = getService('esArchiver'); + const log = getService('log'); + + const clickAppLink = async (app: string) => { + const appLink = `fooNav${app}`; + if (!(await testSubjects.exists(appLink))) { + log.debug(`App ${app} not found on side nav`); + } + await testSubjects.click(appLink); + }; const loadingScreenNotShown = async () => expect(await testSubjects.exists('kbnLoadingMessage')).to.be(false); + const checkAppVisible = async (app: string) => { + const appContainer = `fooApp${app}`; + await testSubjects.existOrFail(appContainer); + }; + const getAppWrapperHeight = async () => { const wrapper = await find.byClassName('kbnAppWrapper'); return (await wrapper.getSize()).height; @@ -29,8 +43,7 @@ export default function ({ getService, getPageObject }: PluginFunctionalProvider const navigateTo = async (path: string) => await browser.navigateTo(`${deployment.getHostPort()}${path}`); - // FLAKY: https://github.com/elastic/kibana/issues/53356 - describe.skip('ui applications', function describeIndexTests() { + describe('ui applications', function describeIndexTests() { before(async () => { await esArchiver.emptyKibanaIndex(); await common.navigateToApp('foo'); @@ -38,48 +51,48 @@ export default function ({ getService, getPageObject }: PluginFunctionalProvider }); it('starts on home page', async () => { - await testSubjects.existOrFail('fooAppHome'); + await checkAppVisible('Home'); }); it('redirects and renders correctly regardless of trailing slash', async () => { await navigateTo(`/app/foo`); await browser.waitForUrlToBe('/app/foo/home'); - await testSubjects.existOrFail('fooAppHome'); + await checkAppVisible('Home'); await navigateTo(`/app/foo/`); await browser.waitForUrlToBe('/app/foo/home'); - await testSubjects.existOrFail('fooAppHome'); + await checkAppVisible('Home'); }); it('navigates to its own pages', async () => { // Go to page A - await testSubjects.click('fooNavPageA'); + await clickAppLink('PageA'); await browser.waitForUrlToBe('/app/foo/page-a'); await loadingScreenNotShown(); - await testSubjects.existOrFail('fooAppPageA'); + await checkAppVisible('PageA'); // Go to home page - await testSubjects.click('fooNavHome'); + await clickAppLink('Home'); await browser.waitForUrlToBe('/app/foo/home'); await loadingScreenNotShown(); - await testSubjects.existOrFail('fooAppHome'); + await checkAppVisible('Home'); }); it('can use the back button to navigate within an app', async () => { await browser.goBack(); await browser.waitForUrlToBe('/app/foo/page-a'); await loadingScreenNotShown(); - await testSubjects.existOrFail('fooAppPageA'); + await checkAppVisible('PageA'); }); it('navigates to app root when navlink is clicked', async () => { - await appsMenu.clickLink('Foo', { category: 'kibana' }); + await appsMenu.clickLink('Foo'); await browser.waitForUrlToBe('/app/foo/home'); await loadingScreenNotShown(); - await testSubjects.existOrFail('fooAppHome'); + await checkAppVisible('Home'); }); it('navigates to other apps', async () => { - await testSubjects.click('fooNavBarPageB'); + await clickAppLink('BarPageB'); await loadingScreenNotShown(); await testSubjects.existOrFail('barAppPageB'); await browser.waitForUrlToBe('/app/bar/page-b?query=here'); @@ -94,7 +107,7 @@ export default function ({ getService, getPageObject }: PluginFunctionalProvider await browser.goBack(); await browser.waitForUrlToBe('/app/foo/home'); await loadingScreenNotShown(); - await testSubjects.existOrFail('fooAppHome'); + await checkAppVisible('Home'); }); it('chromeless applications are not visible in apps list', async () => { diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 1a168e8fe73e7..8b248c5bccc68 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -238,6 +238,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.cloud_integrations.full_story.org_id (any)', // No PII. Just the list of event types we want to forward to FullStory. 'xpack.cloud_integrations.full_story.eventTypesAllowlist (array)', + 'xpack.cloud_integrations.full_story.pageVarsDebounceTime (duration)', 'xpack.cloud_integrations.gain_sight.org_id (any)', 'xpack.cloud.id (string)', 'xpack.cloud.organization_url (string)', @@ -282,6 +283,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.infra.featureFlags.logThresholdAlertRuleEnabled (any)', 'xpack.infra.featureFlags.logsUIEnabled (any)', 'xpack.infra.featureFlags.alertsAndRulesDropdownEnabled (any)', + 'xpack.infra.featureFlags.profilingEnabled (any)', 'xpack.license_management.ui.enabled (boolean)', 'xpack.maps.preserveDrawingBuffer (boolean)', diff --git a/tsconfig.base.json b/tsconfig.base.json index a92c90b6aeb38..d21fd5f4359a1 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -102,6 +102,8 @@ "@kbn/bfetch-explorer-plugin/*": ["examples/bfetch_explorer/*"], "@kbn/bfetch-plugin": ["src/plugins/bfetch"], "@kbn/bfetch-plugin/*": ["src/plugins/bfetch/*"], + "@kbn/calculate-auto": ["packages/kbn-calculate-auto"], + "@kbn/calculate-auto/*": ["packages/kbn-calculate-auto/*"], "@kbn/canvas-plugin": ["x-pack/plugins/canvas"], "@kbn/canvas-plugin/*": ["x-pack/plugins/canvas/*"], "@kbn/cases-api-integration-test-plugin": ["x-pack/test/cases_api_integration/common/plugins/cases"], @@ -596,6 +598,8 @@ "@kbn/crypto-browser/*": ["packages/kbn-crypto-browser/*"], "@kbn/custom-branding-plugin": ["x-pack/plugins/custom_branding"], "@kbn/custom-branding-plugin/*": ["x-pack/plugins/custom_branding/*"], + "@kbn/custom-icons": ["packages/kbn-custom-icons"], + "@kbn/custom-icons/*": ["packages/kbn-custom-icons/*"], "@kbn/custom-integrations": ["packages/kbn-custom-integrations"], "@kbn/custom-integrations/*": ["packages/kbn-custom-integrations/*"], "@kbn/custom-integrations-plugin": ["src/plugins/custom_integrations"], @@ -682,6 +686,8 @@ "@kbn/ecs-data-quality-dashboard/*": ["x-pack/packages/security-solution/ecs_data_quality_dashboard/*"], "@kbn/ecs-data-quality-dashboard-plugin": ["x-pack/plugins/ecs_data_quality_dashboard"], "@kbn/ecs-data-quality-dashboard-plugin/*": ["x-pack/plugins/ecs_data_quality_dashboard/*"], + "@kbn/elastic-agent-utils": ["packages/kbn-elastic-agent-utils"], + "@kbn/elastic-agent-utils/*": ["packages/kbn-elastic-agent-utils/*"], "@kbn/elastic-assistant": ["x-pack/packages/kbn-elastic-assistant"], "@kbn/elastic-assistant/*": ["x-pack/packages/kbn-elastic-assistant/*"], "@kbn/elastic-assistant-plugin": ["x-pack/plugins/elastic_assistant"], @@ -1060,8 +1066,12 @@ "@kbn/ml-string-hash/*": ["x-pack/packages/ml/string_hash/*"], "@kbn/ml-trained-models-utils": ["x-pack/packages/ml/trained_models_utils"], "@kbn/ml-trained-models-utils/*": ["x-pack/packages/ml/trained_models_utils/*"], + "@kbn/ml-ui-actions": ["x-pack/packages/ml/ui_actions"], + "@kbn/ml-ui-actions/*": ["x-pack/packages/ml/ui_actions/*"], "@kbn/ml-url-state": ["x-pack/packages/ml/url_state"], "@kbn/ml-url-state/*": ["x-pack/packages/ml/url_state/*"], + "@kbn/mock-idp-plugin": ["packages/kbn-mock-idp-plugin"], + "@kbn/mock-idp-plugin/*": ["packages/kbn-mock-idp-plugin/*"], "@kbn/monaco": ["packages/kbn-monaco"], "@kbn/monaco/*": ["packages/kbn-monaco/*"], "@kbn/monitoring-collection-plugin": ["x-pack/plugins/monitoring_collection"], @@ -1490,8 +1500,6 @@ "@kbn/stdio-dev-helpers/*": ["packages/kbn-stdio-dev-helpers/*"], "@kbn/storybook": ["packages/kbn-storybook"], "@kbn/storybook/*": ["packages/kbn-storybook/*"], - "@kbn/subscription-tracking": ["packages/kbn-subscription-tracking"], - "@kbn/subscription-tracking/*": ["packages/kbn-subscription-tracking/*"], "@kbn/synthetics-plugin": ["x-pack/plugins/synthetics"], "@kbn/synthetics-plugin/*": ["x-pack/plugins/synthetics/*"], "@kbn/task-manager-fixture-plugin": ["x-pack/test/alerting_api_integration/common/plugins/task_manager_fixture"], @@ -1670,9 +1678,7 @@ "@kbn/zod-helpers/*": ["packages/kbn-zod-helpers/*"], // END AUTOMATED PACKAGE LISTING // Allows for importing from `kibana` package for the exported types. - "@emotion/core": [ - "typings/@emotion" - ], + "@emotion/core": ["typings/@emotion"] }, // Support .tsx files and transform JSX into calls to React.createElement "jsx": "react", @@ -1743,6 +1749,6 @@ "@kbn/ambient-ui-types", "@kbn/ambient-common-types", "@kbn/ambient-storybook-types" - ], + ] } } diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index bb14c06a53e36..45bf932799b30 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -59,6 +59,7 @@ "packages/ml/date_picker", "packages/ml/trained_models_utils", "packages/ml/category_validator", + "packages/ml/ui_actions", "plugins/ml" ], "xpack.monitoring": ["plugins/monitoring"], diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx index f92585cbdd011..dbf0697d24d14 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/api.tsx @@ -58,7 +58,7 @@ export const fetchConnectorExecuteAction = async ({ // tracked here: https://github.com/elastic/security-team/issues/7363 // In part 3 I will make enhancements to langchain to introduce streaming // Once implemented, invokeAI can be removed - const isStream = !assistantLangChain; + const isStream = true; // !assistantLangChain const requestBody = isStream ? { params: { @@ -87,8 +87,10 @@ export const fetchConnectorExecuteAction = async ({ rawResponse: isStream, } ); + console.log('RESPONSE????', response?.response); const reader = response?.response?.body?.getReader(); + console.log('reader????', reader); if (!reader) { return { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx index 3f6b7afc14c71..3fd798f38c4b9 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/new_chat/index.tsx @@ -21,10 +21,13 @@ export type Props = Omit & { iconType?: string | null; /** Optionally specify a well known ID, or default to a UUID */ promptContextId?: string; + /** Optionally specify color of empty button */ + color?: 'text' | 'accent' | 'primary' | 'success' | 'warning' | 'danger'; }; const NewChatComponent: React.FC = ({ category, + color = 'primary', children = i18n.NEW_CHAT, conversationId, description, @@ -58,11 +61,11 @@ const NewChatComponent: React.FC = ({ return useMemo( () => ( - + {children} ), - [children, icon, showOverlay] + [children, icon, showOverlay, color] ); }; 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 155fea1aeb6d0..54e463adc210c 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,6 +60,10 @@ const createSLOResponseSchema = t.type({ const getPreviewDataParamsSchema = t.type({ body: t.type({ indicator: indicatorSchema, + range: t.type({ + start: t.number, + end: t.number, + }), }), }); diff --git a/x-pack/packages/kbn-slo-schema/src/schema/common.ts b/x-pack/packages/kbn-slo-schema/src/schema/common.ts index 166f3eab34a92..55e597e759d65 100644 --- a/x-pack/packages/kbn-slo-schema/src/schema/common.ts +++ b/x-pack/packages/kbn-slo-schema/src/schema/common.ts @@ -50,10 +50,19 @@ const historicalSummarySchema = t.intersection([ summarySchema, ]); -const previewDataSchema = t.type({ - date: dateType, - sliValue: t.number, -}); +const previewDataSchema = t.intersection([ + t.type({ + date: dateType, + sliValue: t.number, + }), + t.partial({ + events: t.type({ + good: t.number, + bad: t.number, + total: t.number, + }), + }), +]); const dateRangeSchema = t.type({ from: dateType, to: dateType }); diff --git a/x-pack/packages/ml/aiops_utils/window_parameters.ts b/x-pack/packages/ml/aiops_utils/window_parameters.ts index 806d224defdf4..91ecee5f841a2 100644 --- a/x-pack/packages/ml/aiops_utils/window_parameters.ts +++ b/x-pack/packages/ml/aiops_utils/window_parameters.ts @@ -15,25 +15,13 @@ import { isPopulatedObject } from '@kbn/ml-is-populated-object'; * @typedef {WindowParameters} */ export interface WindowParameters { - /** - * Baseline minimum value - * @type {number} - */ + /** Baseline minimum value */ baselineMin: number; - /** - * Baseline maximum value - * @type {number} - */ + /** Baseline maximum value */ baselineMax: number; - /** - * Deviation minimum value - * @type {number} - */ + /** Deviation minimum value */ deviationMin: number; - /** - * Deviation maximum value - * @type {number} - */ + /** Deviation maximum value */ deviationMax: number; } diff --git a/x-pack/packages/ml/data_grid/index.ts b/x-pack/packages/ml/data_grid/index.ts index 129feadb00ca8..49468ce79c513 100644 --- a/x-pack/packages/ml/data_grid/index.ts +++ b/x-pack/packages/ml/data_grid/index.ts @@ -10,7 +10,7 @@ export { getDataGridSchemaFromESFieldType, getDataGridSchemaFromKibanaFieldType, getFeatureImportance, - getFieldsFromKibanaIndexPattern, + getFieldsFromKibanaDataView, getNestedOrEscapedVal, getProcessedFields, getTopClasses, diff --git a/x-pack/packages/ml/data_grid/lib/common.ts b/x-pack/packages/ml/data_grid/lib/common.ts index 3b6e8dc4dad60..84dc4591d9a10 100644 --- a/x-pack/packages/ml/data_grid/lib/common.ts +++ b/x-pack/packages/ml/data_grid/lib/common.ts @@ -83,7 +83,7 @@ export const euiDataGridToolbarSettings = { * @param {DataView} dataView - The Kibana data view. * @returns {string[]} - The array of field names from the data view. */ -export const getFieldsFromKibanaIndexPattern = (dataView: DataView): string[] => { +export const getFieldsFromKibanaDataView = (dataView: DataView): string[] => { const allFields = dataView.fields.map((f) => f.name); const dataViewFields: string[] = allFields.filter((f) => { if (dataView.metaFields.includes(f)) { diff --git a/x-pack/packages/ml/data_grid/lib/types.ts b/x-pack/packages/ml/data_grid/lib/types.ts index 2c1ab284d1c20..2d8ed5319237d 100644 --- a/x-pack/packages/ml/data_grid/lib/types.ts +++ b/x-pack/packages/ml/data_grid/lib/types.ts @@ -158,9 +158,9 @@ export interface UseIndexDataReturnType */ renderCellValue: RenderCellValue; /** - * Optional index pattern fields. + * Optional data view fields. */ - indexPatternFields?: string[]; + dataViewFields?: string[]; /** * Optional time range. */ diff --git a/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx b/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx index 5b2a9d880c1b8..cb890172bbdd9 100644 --- a/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx +++ b/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx @@ -7,7 +7,7 @@ import React, { FC, useCallback, useMemo, useState } from 'react'; -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { EuiButton, diff --git a/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts b/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts index cfd363e8b53ce..c4cdd23995ae7 100644 --- a/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts +++ b/x-pack/packages/ml/date_picker/src/services/full_time_range_selector_service.ts @@ -8,7 +8,7 @@ import moment from 'moment'; import type { TimefilterContract } from '@kbn/data-plugin/public'; import dateMath from '@kbn/datemath'; -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { i18n } from '@kbn/i18n'; import type { ToastsStart, HttpStart } from '@kbn/core/public'; import type { DataView } from '@kbn/data-views-plugin/public'; diff --git a/x-pack/packages/ml/date_picker/src/services/time_field_range.ts b/x-pack/packages/ml/date_picker/src/services/time_field_range.ts index 07a5fb3de3553..92d71f582a1ef 100644 --- a/x-pack/packages/ml/date_picker/src/services/time_field_range.ts +++ b/x-pack/packages/ml/date_picker/src/services/time_field_range.ts @@ -6,7 +6,7 @@ */ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import type { HttpStart } from '@kbn/core/public'; diff --git a/x-pack/packages/ml/query_utils/src/add_exclude_frozen_to_query.ts b/x-pack/packages/ml/query_utils/src/add_exclude_frozen_to_query.ts index 7162546034964..3148e93bed02f 100644 --- a/x-pack/packages/ml/query_utils/src/add_exclude_frozen_to_query.ts +++ b/x-pack/packages/ml/query_utils/src/add_exclude_frozen_to_query.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { cloneDeep } from 'lodash'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; diff --git a/x-pack/packages/ml/ui_actions/README.md b/x-pack/packages/ml/ui_actions/README.md new file mode 100644 index 0000000000000..a9cba4a278c8e --- /dev/null +++ b/x-pack/packages/ml/ui_actions/README.md @@ -0,0 +1,3 @@ +# @kbn/ml-ui-actions + +Empty package generated by @kbn/generate diff --git a/x-pack/packages/ml/ui_actions/index.ts b/x-pack/packages/ml/ui_actions/index.ts new file mode 100644 index 0000000000000..7a82ca6d68d9c --- /dev/null +++ b/x-pack/packages/ml/ui_actions/index.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. + */ + +export { + CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_ACTION, + CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER, + type CreateCategorizationADJobContext, +} from './src/ml/ui_actions'; + +export { + ACTION_CATEGORIZE_FIELD, + CATEGORIZE_FIELD_TRIGGER, + categorizeFieldTrigger, + type CategorizeFieldContext, +} from './src/aiops/ui_actions'; diff --git a/x-pack/plugins/apm/common/utils/to_kuery_filter_format.ts b/x-pack/packages/ml/ui_actions/jest.config.js similarity index 57% rename from x-pack/plugins/apm/common/utils/to_kuery_filter_format.ts rename to x-pack/packages/ml/ui_actions/jest.config.js index 8e3169f4d07e2..8efadb42705fa 100644 --- a/x-pack/plugins/apm/common/utils/to_kuery_filter_format.ts +++ b/x-pack/packages/ml/ui_actions/jest.config.js @@ -5,10 +5,8 @@ * 2.0. */ -export function toKueryFilterFormat( - key: string, - values: string[], - separator: 'OR' | 'AND' = 'OR' -) { - return values.map((value) => `${key} : "${value}"`).join(` ${separator} `); -} +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/x-pack/packages/ml/ui_actions'], +}; diff --git a/x-pack/packages/ml/ui_actions/kibana.jsonc b/x-pack/packages/ml/ui_actions/kibana.jsonc new file mode 100644 index 0000000000000..999f955bc2e47 --- /dev/null +++ b/x-pack/packages/ml/ui_actions/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/ml-ui-actions", + "owner": "@elastic/ml-ui" +} diff --git a/x-pack/packages/ml/ui_actions/package.json b/x-pack/packages/ml/ui_actions/package.json new file mode 100644 index 0000000000000..a3d77f4701c68 --- /dev/null +++ b/x-pack/packages/ml/ui_actions/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/ml-ui-actions", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} \ No newline at end of file diff --git a/x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts b/x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts new file mode 100644 index 0000000000000..b5e9ca07031ba --- /dev/null +++ b/x-pack/packages/ml/ui_actions/src/aiops/ui_actions.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; +import { i18n } from '@kbn/i18n'; +import type { Trigger } from '@kbn/ui-actions-plugin/public'; + +export interface CategorizeFieldContext { + field: DataViewField; + dataView: DataView; + originatingApp: string; + additionalFilter?: { + from: number; + to: number; + field?: { name: string; value: string }; + }; +} + +export const ACTION_CATEGORIZE_FIELD = 'ACTION_CATEGORIZE_FIELD'; + +export const CATEGORIZE_FIELD_TRIGGER = 'CATEGORIZE_FIELD_TRIGGER'; +export const categorizeFieldTrigger: Trigger = { + id: CATEGORIZE_FIELD_TRIGGER, + title: i18n.translate('xpack.ml.actions.runPatternAnalysis.title', { + defaultMessage: 'Run pattern analysis', + }), + description: i18n.translate('xpack.ml.actions.runPatternAnalysis.description', { + defaultMessage: 'Triggered when user wants to run pattern analysis on a field.', + }), +}; diff --git a/x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts b/x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts new file mode 100644 index 0000000000000..cf36e3ff01ce6 --- /dev/null +++ b/x-pack/packages/ml/ui_actions/src/ml/ui_actions.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; +import type { TimeRange } from '@kbn/es-query'; + +export interface CreateCategorizationADJobContext { + field: DataViewField; + dataView: DataView; + query: QueryDslQueryContainer; + timeRange: TimeRange; +} + +export const CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_ACTION = 'createMLADCategorizationJobAction'; + +export const CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER = + 'CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER'; diff --git a/x-pack/packages/ml/ui_actions/tsconfig.json b/x-pack/packages/ml/ui_actions/tsconfig.json new file mode 100644 index 0000000000000..ca3f66082b5c9 --- /dev/null +++ b/x-pack/packages/ml/ui_actions/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/data-views-plugin", + "@kbn/es-query", + "@kbn/ui-actions-plugin", + "@kbn/i18n", + ] +} diff --git a/x-pack/packages/observability/alerting_test_data/src/create_custom_threshold_rule.ts b/x-pack/packages/observability/alerting_test_data/src/create_custom_threshold_rule.ts index 9c7e1fb6acdb7..7ad732af36948 100644 --- a/x-pack/packages/observability/alerting_test_data/src/create_custom_threshold_rule.ts +++ b/x-pack/packages/observability/alerting_test_data/src/create_custom_threshold_rule.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -39,7 +38,6 @@ export const createCustomThresholdRule = async ( params: { criteria: ruleParams.params?.criteria || [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [1], timeSize: 1, diff --git a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count.ts b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count.ts index c2515cfe1615a..be2f2e344d7a5 100644 --- a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count.ts +++ b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -23,7 +22,6 @@ export const scenario1 = { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.LT, threshold: [100], timeSize: 1, diff --git a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_groupby.ts b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_groupby.ts index 68786ea4a06d2..fe8e2cfa01d32 100644 --- a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_groupby.ts +++ b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_groupby.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -23,7 +22,6 @@ export const scenario2 = { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.LT, threshold: [40], timeSize: 1, diff --git a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_nodata.ts b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_nodata.ts index 97585a66b8385..bbb4d4e1c2551 100644 --- a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_nodata.ts +++ b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_log_count_nodata.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -23,7 +22,6 @@ export const scenario3 = { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.LT, threshold: [5], timeSize: 1, diff --git a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg.ts b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg.ts index 0feec99ca5a47..dcf6048915ebf 100644 --- a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg.ts +++ b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -23,7 +22,6 @@ export const scenario4 = { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [80], timeSize: 1, diff --git a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_groupby.ts b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_groupby.ts index a36bb4af2544c..b42006a33a652 100644 --- a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_groupby.ts +++ b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_groupby.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -23,7 +22,6 @@ export const scenario5 = { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [80], timeSize: 5, diff --git a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_nodata.ts b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_nodata.ts index 16639c7749ca3..9bea0a00eb714 100644 --- a/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_nodata.ts +++ b/x-pack/packages/observability/alerting_test_data/src/scenarios/custom_threshold_metric_avg_nodata.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -23,7 +22,6 @@ export const scenario6 = { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.LT, threshold: [1], timeSize: 1, diff --git a/x-pack/packages/security-solution/data_table/common/types/data_table/index.ts b/x-pack/packages/security-solution/data_table/common/types/data_table/index.ts index f86b3ecc98eef..e9625d39f2690 100644 --- a/x-pack/packages/security-solution/data_table/common/types/data_table/index.ts +++ b/x-pack/packages/security-solution/data_table/common/types/data_table/index.ts @@ -31,6 +31,8 @@ export enum TableId { kubernetesPageSessions = 'kubernetes-page-sessions', alertsOnCasePage = 'alerts-case-page', alertsRiskInputs = 'alerts-risk-inputs', + // New version of `alertsRiskInputs` designed to support multiple kinds of risk inputs + riskInputs = 'risk-inputs', } export enum TableEntityType { @@ -52,6 +54,7 @@ export const tableEntity: Record = { [TableId.hostsPageSessions]: TableEntityType.session, [TableId.kubernetesPageSessions]: TableEntityType.session, [TableId.alertsRiskInputs]: TableEntityType.alert, + [TableId.riskInputs]: TableEntityType.alert, } as const; const TableIdLiteralRt = runtimeTypes.union([ diff --git a/x-pack/packages/security-solution/data_table/store/data_table/reducer.ts b/x-pack/packages/security-solution/data_table/store/data_table/reducer.ts index f65292a2919e4..1ad08a9332503 100644 --- a/x-pack/packages/security-solution/data_table/store/data_table/reducer.ts +++ b/x-pack/packages/security-solution/data_table/store/data_table/reducer.ts @@ -95,7 +95,7 @@ export const dataTableReducer = reducerWithInitialState(initialDataTableState) [action.id]: { ...state.tableById[action.id], expandedDetail: { - ...state.tableById[action.id].expandedDetail, + ...state.tableById[action.id]?.expandedDetail, ...updateTableDetailsPanel(action), }, }, diff --git a/x-pack/plugins/actions/docs/openapi/README.md b/x-pack/plugins/actions/docs/openapi/README.md index 2bce08f0b1a4c..210bb719eb918 100644 --- a/x-pack/plugins/actions/docs/openapi/README.md +++ b/x-pack/plugins/actions/docs/openapi/README.md @@ -1,6 +1,6 @@ # OpenAPI (Experimental) -The current self-contained spec file is [as JSON](https://raw.githubusercontent.com/elastic/kibana/master/x-pack/plugins/cases/common/openapi/bundled.json) or [as YAML](https://raw.githubusercontent.com/elastic/kibana/master/x-pack/plugins/cases/common/openapi/bundled.yaml) and can be used for online tools like those found at https://openapi.tools/. +The current self-contained spec file is [as JSON](https://raw.githubusercontent.com/elastic/kibana/master/x-pack/plugins/cases/common/openapi/bundled.json) or [as YAML](https://raw.githubusercontent.com/elastic/kibana/master/x-pack/plugins/cases/common/openapi/bundled.yaml) and can be used for online tools like those found at https://openapi.tools/. This spec is experimental and may be incomplete or change later. A guide about the openApi specification can be found at [https://swagger.io/docs/specification/about/](https://swagger.io/docs/specification/about/). diff --git a/x-pack/plugins/actions/docs/openapi/bundled.json b/x-pack/plugins/actions/docs/openapi/bundled.json index 2f8bbf898efee..a2debc66a17a7 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.json +++ b/x-pack/plugins/actions/docs/openapi/bundled.json @@ -1,9 +1,9 @@ { - "openapi": "3.0.1", + "openapi": "3.1.0", "info": { "title": "Connectors", "description": "OpenAPI schema for Connectors endpoints", - "version": "0.1", + "version": "0.2", "contact": { "name": "Connectors Team" }, @@ -178,7 +178,9 @@ "required": true, "schema": { "type": "string", - "example": "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + "examples": [ + "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + ] } } ], @@ -303,6 +305,9 @@ "runJiraConnectorRequest": { "$ref": "#/components/examples/run_jira_connector_request" }, + "runPagerDutyConnectorRequest": { + "$ref": "#/components/examples/run_pagerduty_connector_request" + }, "runServerLogConnectorRequest": { "$ref": "#/components/examples/run_server_log_connector_request" }, @@ -368,6 +373,9 @@ "runJiraConnectorResponse": { "$ref": "#/components/examples/run_jira_connector_response" }, + "runPagerDutyConnectorResponse": { + "$ref": "#/components/examples/run_pagerduty_connector_response" + }, "runServerLogConnectorResponse": { "$ref": "#/components/examples/run_server_log_connector_response" }, @@ -451,34 +459,46 @@ "enabled": { "type": "boolean", "description": "Indicates whether the connector type is enabled in Kibana.", - "example": true + "examples": [ + true + ] }, "enabled_in_config": { "type": "boolean", "description": "Indicates whether the connector type is enabled in the Kibana configuration file.", - "example": true + "examples": [ + true + ] }, "enabled_in_license": { "type": "boolean", "description": "Indicates whether the connector is enabled in the license.", - "example": true + "examples": [ + true + ] }, "id": { "$ref": "#/components/schemas/connector_types" }, "is_system_action_type": { "type": "boolean", - "example": false + "examples": [ + false + ] }, "minimum_license_required": { "type": "string", "description": "The license that is required to use the connector type.", - "example": "basic" + "examples": [ + "basic" + ] }, "name": { "type": "string", "description": "The name of the connector type.", - "example": "Index" + "examples": [ + "Index" + ] }, "supported_feature_ids": { "type": "array", @@ -486,10 +506,12 @@ "items": { "$ref": "#/components/schemas/features" }, - "example": [ - "alerting", - "cases", - "siem" + "examples": [ + [ + "alerting", + "cases", + "siem" + ] ] } } @@ -671,7 +693,9 @@ "required": true, "schema": { "type": "string", - "example": "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + "examples": [ + "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + ] } } ], @@ -841,17 +865,23 @@ "enabled": { "type": "boolean", "description": "Indicates whether the connector type is enabled in Kibana.", - "example": true + "examples": [ + true + ] }, "enabled_in_config": { "type": "boolean", "description": "Indicates whether the connector type is enabled in the Kibana `.yml` file.", - "example": true + "examples": [ + true + ] }, "enabled_in_license": { "type": "boolean", "description": "Indicates whether the connector is enabled in the license.", - "example": true + "examples": [ + true + ] }, "id": { "$ref": "#/components/schemas/connector_types" @@ -859,12 +889,16 @@ "minimum_license_required": { "type": "string", "description": "The license that is required to use the connector type.", - "example": "basic" + "examples": [ + "basic" + ] }, "name": { "type": "string", "description": "The name of the connector type.", - "example": "Index" + "examples": [ + "Index" + ] }, "supported_feature_ids": { "type": "array", @@ -872,10 +906,12 @@ "items": { "$ref": "#/components/schemas/features" }, - "example": [ - "alerting", - "uptime", - "siem" + "examples": [ + [ + "alerting", + "uptime", + "siem" + ] ] } } @@ -1243,7 +1279,9 @@ "enabledInLicense": { "type": "boolean", "description": "Indicates whether the connector is enabled in the license.", - "example": true + "examples": [ + true + ] }, "id": { "type": "string", @@ -1362,7 +1400,8 @@ "apiKeyAuth": { "type": "apiKey", "in": "header", - "name": "ApiKey" + "name": "Authorization", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" } }, "parameters": { @@ -1382,7 +1421,9 @@ "required": true, "schema": { "type": "string", - "example": "df770e30-8b8b-11ed-a780-3b746c987a81" + "examples": [ + "df770e30-8b8b-11ed-a780-3b746c987a81" + ] } }, "space_id": { @@ -1392,7 +1433,9 @@ "required": true, "schema": { "type": "string", - "example": "default" + "examples": [ + "default" + ] } }, "action_id": { @@ -1402,7 +1445,9 @@ "required": true, "schema": { "type": "string", - "example": "c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad" + "examples": [ + "c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad" + ] } } }, @@ -1465,12 +1510,16 @@ "enum": [ ".bedrock" ], - "example": ".bedrock" + "examples": [ + ".bedrock" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_bedrock" @@ -1495,11 +1544,13 @@ "createCommentJson": { "type": "string", "description": "A JSON payload sent to the create comment URL to create a case comment. You can use variables to add Kibana Cases data to the payload. The required variable is `case.comment`. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated once the Mustache variables have been placed when the REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass.\n", - "example": { - "body": { - "[object Object]": null + "examples": [ + { + "body": { + "[object Object]": null + } } - } + ] }, "createCommentMethod": { "type": "string", @@ -1514,24 +1565,28 @@ "createCommentUrl": { "type": "string", "description": "The REST API URL to create a case comment by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts setting`, add the hostname to the allowed hosts.\n", - "example": "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment" + "examples": [ + "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment" + ] }, "createIncidentJson": { "type": "string", "description": "A JSON payload sent to the create case URL to create a case. You can use variables to add case data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review.\n", - "example": { - "fields": { - "summary": { - "[object Object]": null - }, - "description": { - "[object Object]": null - }, - "labels": { - "[object Object]": null + "examples": [ + { + "fields": { + "summary": { + "[object Object]": null + }, + "description": { + "[object Object]": null + }, + "labels": { + "[object Object]": null + } } } - } + ] }, "createIncidentMethod": { "type": "string", @@ -1558,7 +1613,9 @@ "getIncidentUrl": { "type": "string", "description": "The REST API URL to get the case by ID from the third-party system. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. You can use a variable to add the external system ID to the URL. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass.\n", - "example": "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}" + "examples": [ + "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}" + ] }, "hasAuth": { "type": "boolean", @@ -1572,19 +1629,21 @@ "updateIncidentJson": { "type": "string", "description": "The JSON payload sent to the update case URL to update the case. You can use variables to add Kibana Cases data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review.\n", - "example": { - "fields": { - "summary": { - "[object Object]": null - }, - "description": { - "[object Object]": null - }, - "labels": { - "[object Object]": null + "examples": [ + { + "fields": { + "summary": { + "[object Object]": null + }, + "description": { + "[object Object]": null + }, + "labels": { + "[object Object]": null + } } } - } + ] }, "updateIncidentMethod": { "type": "string", @@ -1599,12 +1658,16 @@ "updateIncidentUrl": { "type": "string", "description": "The REST API URL to update the case by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts.\n", - "example": "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}}" + "examples": [ + "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}}" + ] }, "viewIncidentUrl": { "type": "string", "description": "The URL to view the case in the external system. You can use variables to add the external system ID or external system title to the URL.\n", - "example": "https://testing-jira.atlassian.net/browse/{{{external.system.title}}}" + "examples": [ + "https://testing-jira.atlassian.net/browse/{{{external.system.title}}}" + ] } } }, @@ -1641,12 +1704,16 @@ "enum": [ ".cases-webhook" ], - "example": ".cases-webhook" + "examples": [ + ".cases-webhook" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_cases_webhook" @@ -1701,12 +1768,16 @@ "enum": [ ".d3security" ], - "example": ".d3security" + "examples": [ + ".d3security" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_d3security" @@ -1723,8 +1794,10 @@ "properties": { "clientId": { "description": "The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.\n", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "from": { "description": "The from address for all emails sent by the connector. It must be specified in `user@host-name` format.\n", @@ -1740,8 +1813,10 @@ "type": "string" }, "oauthTokenUrl": { - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "port": { "description": "The port to connect to on the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. \n", @@ -1765,8 +1840,10 @@ }, "tenantId": { "description": "The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.\n", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] } } }, @@ -1809,12 +1886,16 @@ "enum": [ ".email" ], - "example": ".email" + "examples": [ + ".email" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_email" @@ -1905,12 +1986,16 @@ "enum": [ ".gen-ai" ], - "example": ".gen-ai" + "examples": [ + ".gen-ai" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_genai" @@ -1928,8 +2013,10 @@ "executionTimeField": { "description": "A field that indicates when the document was indexed.", "default": null, - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "index": { "description": "The Elasticsearch index to be written to.", @@ -1961,12 +2048,16 @@ "enum": [ ".index" ], - "example": ".index" + "examples": [ + ".index" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] } } }, @@ -2028,12 +2119,16 @@ "enum": [ ".jira" ], - "example": ".jira" + "examples": [ + ".jira" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_jira" @@ -2088,12 +2183,16 @@ "enum": [ ".opsgenie" ], - "example": ".opsgenie" + "examples": [ + ".opsgenie" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_opsgenie" @@ -2107,9 +2206,13 @@ "properties": { "apiUrl": { "description": "The PagerDuty event URL.", - "type": "string", - "nullable": true, - "example": "https://events.pagerduty.com/v2/enqueue" + "type": [ + "string", + "null" + ], + "examples": [ + "https://events.pagerduty.com/v2/enqueue" + ] } } }, @@ -2147,12 +2250,16 @@ "enum": [ ".pagerduty" ], - "example": ".pagerduty" + "examples": [ + ".pagerduty" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_pagerduty" @@ -2214,7 +2321,9 @@ "connector_type_id": { "description": "The type of connector.", "type": "string", - "example": ".resilient", + "examples": [ + ".resilient" + ], "enum": [ ".resilient" ] @@ -2222,7 +2331,9 @@ "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_resilient" @@ -2244,12 +2355,16 @@ "enum": [ ".server-log" ], - "example": ".server-log" + "examples": [ + ".server-log" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] } } }, @@ -2336,12 +2451,16 @@ "enum": [ ".servicenow" ], - "example": ".servicenow" + "examples": [ + ".servicenow" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_servicenow" @@ -2399,12 +2518,16 @@ "enum": [ ".servicenow-itom" ], - "example": ".servicenow-itom" + "examples": [ + ".servicenow-itom" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_servicenow" @@ -2431,12 +2554,16 @@ "enum": [ ".servicenow-sir" ], - "example": ".servicenow-sir" + "examples": [ + ".servicenow-sir" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_servicenow" @@ -2473,12 +2600,16 @@ "enum": [ ".slack_api" ], - "example": ".slack_api" + "examples": [ + ".slack_api" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_slack_api" @@ -2515,12 +2646,16 @@ "enum": [ ".slack" ], - "example": ".slack" + "examples": [ + ".slack" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_slack_webhook" @@ -2797,12 +2932,16 @@ "enum": [ ".swimlane" ], - "example": ".swimlane" + "examples": [ + ".swimlane" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_swimlane" @@ -2839,12 +2978,16 @@ "enum": [ ".teams" ], - "example": ".teams" + "examples": [ + ".teams" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_teams" @@ -2904,12 +3047,16 @@ "enum": [ ".tines" ], - "example": ".tines" + "examples": [ + ".tines" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_tines" @@ -2964,12 +3111,16 @@ "enum": [ ".torq" ], - "example": ".torq" + "examples": [ + ".torq" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_torq" @@ -3007,8 +3158,10 @@ "description": "If `true`, a user name and password must be provided for login type authentication.\n" }, "headers": { - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "description": "A set of key-value pairs sent as headers with the request." }, "method": { @@ -3083,12 +3236,16 @@ "enum": [ ".webhook" ], - "example": ".webhook" + "examples": [ + ".webhook" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_webhook" @@ -3102,8 +3259,10 @@ "properties": { "configUrl": { "description": "The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when `usesBasic` is `true`.\n", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "usesBasic": { "description": "Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`).", @@ -3151,12 +3310,16 @@ "enum": [ ".xmatters" ], - "example": ".xmatters" + "examples": [ + ".xmatters" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_xmatters" @@ -3241,22 +3404,30 @@ "is_deprecated": { "type": "boolean", "description": "Indicates whether the connector type is deprecated.", - "example": false + "examples": [ + false + ] }, "is_missing_secrets": { "type": "boolean", "description": "Indicates whether secrets are missing for the connector. Secrets configuration properties vary depending on the connector type.", - "example": false + "examples": [ + false + ] }, "is_preconfigured": { "type": "boolean", "description": "Indicates whether it is a preconfigured connector. If true, the `config` and `is_missing_secrets` properties are omitted from the response. \n", - "example": false + "examples": [ + false + ] }, "is_system_action": { "type": "boolean", "description": "Indicates whether the connector is used for system actions.", - "example": false + "examples": [ + false + ] }, "connector_response_properties_bedrock": { "title": "Connector response properties for an Amazon Bedrock connector", @@ -3305,7 +3476,9 @@ "referenced_by_count": { "type": "integer", "description": "Indicates the number of saved objects that reference the connector. If `is_preconfigured` is true, this value is not calculated. This property is returned only by the get all connectors API.\n", - "example": 2 + "examples": [ + 2 + ] }, "connector_response_properties_cases_webhook": { "title": "Connector request properties for a Webhook - Case Management connector", @@ -3687,8 +3860,10 @@ ], "properties": { "config": { - "type": "object", - "nullable": true + "type": [ + "object", + "null" + ] }, "connector_type_id": { "type": "string", @@ -4328,7 +4503,9 @@ "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_cases_webhook" @@ -4581,7 +4758,9 @@ "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_swimlane" @@ -4758,6 +4937,30 @@ } ] }, + "run_connector_params_acknowledge_resolve_pagerduty": { + "title": "PagerDuty connector parameters", + "description": "Test an action that acknowledges or resolves a PagerDuty alert.", + "type": "object", + "required": [ + "dedupKey", + "eventAction" + ], + "properties": { + "dedupKey": { + "description": "The deduplication key for the PagerDuty alert.", + "type": "string", + "maxLength": 255 + }, + "eventAction": { + "description": "The type of event.", + "type": "string", + "enum": [ + "acknowledge", + "resolve" + ] + } + } + }, "run_connector_params_documents": { "title": "Index connector parameters", "description": "Test an action that indexes a document into Elasticsearch.", @@ -4862,6 +5065,95 @@ } } }, + "run_connector_params_trigger_pagerduty": { + "title": "PagerDuty connector parameters", + "description": "Test an action that triggers a PagerDuty alert.", + "type": "object", + "required": [ + "eventAction" + ], + "properties": { + "class": { + "description": "The class or type of the event.", + "type": "string", + "examples": [ + "cpu load" + ] + }, + "component": { + "description": "The component of the source machine that is responsible for the event.", + "type": "string", + "examples": [ + "eth0" + ] + }, + "customDetails": { + "description": "Additional details to add to the event.", + "type": "object" + }, + "dedupKey": { + "description": "All actions sharing this key will be associated with the same PagerDuty alert. This value is used to correlate trigger and resolution.\n", + "type": "string", + "maxLength": 255 + }, + "eventAction": { + "description": "The type of event.", + "type": "string", + "enum": [ + "trigger" + ] + }, + "group": { + "description": "The logical grouping of components of a service.", + "type": "string", + "examples": [ + "app-stack" + ] + }, + "links": { + "description": "A list of links to add to the event.", + "type": "array", + "items": { + "type": "object", + "properties": { + "href": { + "description": "The URL for the link.", + "type": "string" + }, + "text": { + "description": "A plain text description of the purpose of the link.", + "type": "string" + } + } + } + }, + "severity": { + "description": "The severity of the event on the affected system.", + "type": "string", + "enum": [ + "critical", + "error", + "info", + "warning" + ], + "default": "info" + }, + "source": { + "description": "The affected system, such as a hostname or fully qualified domain name. Defaults to the Kibana saved object id of the action.\n", + "type": "string" + }, + "summary": { + "description": "A summery of the event.", + "type": "string", + "maxLength": 1024 + }, + "timestamp": { + "description": "An ISO-8601 timestamp that indicates when the event was detected or generated.", + "type": "string", + "format": "date-time" + } + } + }, "run_connector_subaction_addevent": { "title": "The addEvent subaction", "type": "object", @@ -5012,10 +5304,12 @@ "type": "object", "description": "The custom properties of the alert.", "additionalProperties": true, - "example": { - "key1": "value1", - "key2": "value2" - } + "examples": [ + { + "key1": "value1", + "key2": "value2" + } + ] }, "entity": { "type": "string", @@ -5147,7 +5441,9 @@ "id": { "type": "string", "description": "The Jira issue type identifier.", - "example": 10024 + "examples": [ + 10024 + ] } } } @@ -5229,7 +5525,9 @@ "externalId": { "type": "string", "description": "The Jira, ServiceNow ITSM, or ServiceNow SecOps issue identifier.", - "example": 71778 + "examples": [ + 71778 + ] } } } @@ -5259,7 +5557,9 @@ "id": { "type": "string", "description": "The Jira issue identifier.", - "example": 71778 + "examples": [ + 71778 + ] } } } @@ -5509,6 +5809,9 @@ "properties": { "params": { "oneOf": [ + { + "$ref": "#/components/schemas/run_connector_params_acknowledge_resolve_pagerduty" + }, { "$ref": "#/components/schemas/run_connector_params_documents" }, @@ -5518,6 +5821,9 @@ { "$ref": "#/components/schemas/run_connector_params_message_serverlog" }, + { + "$ref": "#/components/schemas/run_connector_params_trigger_pagerduty" + }, { "title": "Subaction parameters", "description": "Test an action that involves a subaction.", @@ -5603,7 +5909,9 @@ ".webhook", ".xmatters" ], - "example": ".server-log" + "examples": [ + ".server-log" + ] }, "action_response_properties": { "title": "Action response properties", @@ -5838,6 +6146,24 @@ } } }, + "run_pagerduty_connector_request": { + "summary": "Run a PagerDuty connector to trigger an alert.", + "value": { + "params": { + "eventAction": "trigger", + "summary": "A brief event summary", + "links": [ + { + "href": "http://example.com/pagerduty", + "text": "An example link" + } + ], + "customDetails": { + "my_data_1": "test data" + } + } + } + }, "run_server_log_connector_request": { "summary": "Run a server log connector.", "value": { @@ -5974,6 +6300,18 @@ "status": "ok" } }, + "run_pagerduty_connector_response": { + "summary": "Response from running a PagerDuty connector.", + "value": { + "connector_id": "45de9f70-954f-4608-b12a-db7cf808e49d", + "data": { + "dedup_key": "5115e138b26b484a81eaea779faa6016", + "message": "Event processed", + "status": "success" + }, + "status": "ok" + } + }, "run_server_log_connector_response": { "summary": "Response from running a server log connector.", "value": { @@ -6176,7 +6514,9 @@ "properties": { "error": { "type": "string", - "example": "Unauthorized", + "examples": [ + "Unauthorized" + ], "enum": [ "Unauthorized" ] @@ -6186,7 +6526,9 @@ }, "statusCode": { "type": "integer", - "example": 401, + "examples": [ + 401 + ], "enum": [ 401 ] @@ -6206,18 +6548,24 @@ "properties": { "error": { "type": "string", - "example": "Not Found", + "examples": [ + "Not Found" + ], "enum": [ "Not Found" ] }, "message": { "type": "string", - "example": "Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found" + "examples": [ + "Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found" + ] }, "statusCode": { "type": "integer", - "example": 404, + "examples": [ + 404 + ], "enum": [ 404 ] diff --git a/x-pack/plugins/actions/docs/openapi/bundled.yaml b/x-pack/plugins/actions/docs/openapi/bundled.yaml index 481d0f0a7ec42..50856a35f9399 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled.yaml +++ b/x-pack/plugins/actions/docs/openapi/bundled.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Connectors description: OpenAPI schema for Connectors endpoints - version: '0.1' + version: '0.2' contact: name: Connectors Team license: @@ -109,7 +109,8 @@ paths: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 requestBody: required: true content: @@ -185,6 +186,8 @@ paths: $ref: '#/components/examples/run_index_connector_request' runJiraConnectorRequest: $ref: '#/components/examples/run_jira_connector_request' + runPagerDutyConnectorRequest: + $ref: '#/components/examples/run_pagerduty_connector_request' runServerLogConnectorRequest: $ref: '#/components/examples/run_server_log_connector_request' runServiceNowITOMConnectorRequest: @@ -227,6 +230,8 @@ paths: $ref: '#/components/examples/run_index_connector_response' runJiraConnectorResponse: $ref: '#/components/examples/run_jira_connector_response' + runPagerDutyConnectorResponse: + $ref: '#/components/examples/run_pagerduty_connector_response' runServerLogConnectorResponse: $ref: '#/components/examples/run_server_log_connector_response' runServiceNowITOMConnectorResponse: @@ -282,37 +287,43 @@ paths: enabled: type: boolean description: Indicates whether the connector type is enabled in Kibana. - example: true + examples: + - true enabled_in_config: type: boolean description: Indicates whether the connector type is enabled in the Kibana configuration file. - example: true + examples: + - true enabled_in_license: type: boolean description: Indicates whether the connector is enabled in the license. - example: true + examples: + - true id: $ref: '#/components/schemas/connector_types' is_system_action_type: type: boolean - example: false + examples: + - false minimum_license_required: type: string description: The license that is required to use the connector type. - example: basic + examples: + - basic name: type: string description: The name of the connector type. - example: Index + examples: + - Index supported_feature_ids: type: array description: The features that are supported by the connector type. items: $ref: '#/components/schemas/features' - example: - - alerting - - cases - - siem + examples: + - - alerting + - cases + - siem examples: getConnectorTypesServerlessResponse: $ref: '#/components/examples/get_connector_types_generativeai_response' @@ -421,7 +432,8 @@ paths: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 requestBody: required: true content: @@ -530,34 +542,39 @@ paths: enabled: type: boolean description: Indicates whether the connector type is enabled in Kibana. - example: true + examples: + - true enabled_in_config: type: boolean description: Indicates whether the connector type is enabled in the Kibana `.yml` file. - example: true + examples: + - true enabled_in_license: type: boolean description: Indicates whether the connector is enabled in the license. - example: true + examples: + - true id: $ref: '#/components/schemas/connector_types' minimum_license_required: type: string description: The license that is required to use the connector type. - example: basic + examples: + - basic name: type: string description: The name of the connector type. - example: Index + examples: + - Index supported_feature_ids: type: array description: The Kibana features that are supported by the connector type. items: $ref: '#/components/schemas/features' - example: - - alerting - - uptime - - siem + examples: + - - alerting + - uptime + - siem examples: getConnectorTypesResponse: $ref: '#/components/examples/get_connector_types_response' @@ -789,7 +806,8 @@ paths: enabledInLicense: type: boolean description: Indicates whether the connector is enabled in the license. - example: true + examples: + - true id: type: string description: The unique identifier for the connector type. @@ -859,7 +877,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' parameters: kbn_xsrf: schema: @@ -875,7 +894,8 @@ components: required: true schema: type: string - example: df770e30-8b8b-11ed-a780-3b746c987a81 + examples: + - df770e30-8b8b-11ed-a780-3b746c987a81 space_id: in: path name: spaceId @@ -883,7 +903,8 @@ components: required: true schema: type: string - example: default + examples: + - default action_id: in: path name: actionId @@ -891,7 +912,8 @@ components: required: true schema: type: string - example: c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad + examples: + - c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad schemas: config_properties_bedrock: title: Connector request properties for an Amazon Bedrock connector @@ -939,11 +961,13 @@ components: description: The type of connector. enum: - .bedrock - example: .bedrock + examples: + - .bedrock name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_bedrock' config_properties_cases_webhook: @@ -964,9 +988,9 @@ components: type: string description: | A JSON payload sent to the create comment URL to create a case comment. You can use variables to add Kibana Cases data to the payload. The required variable is `case.comment`. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated once the Mustache variables have been placed when the REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. - example: - body: - '[object Object]': null + examples: + - body: + '[object Object]': null createCommentMethod: type: string description: | @@ -980,19 +1004,20 @@ components: type: string description: | The REST API URL to create a case comment by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts setting`, add the hostname to the allowed hosts. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment createIncidentJson: type: string description: | A JSON payload sent to the create case URL to create a case. You can use variables to add case data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review. - example: - fields: - summary: - '[object Object]': null - description: - '[object Object]': null - labels: - '[object Object]': null + examples: + - fields: + summary: + '[object Object]': null + description: + '[object Object]': null + labels: + '[object Object]': null createIncidentMethod: type: string description: | @@ -1016,7 +1041,8 @@ components: type: string description: | The REST API URL to get the case by ID from the third-party system. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. You can use a variable to add the external system ID to the URL. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}} + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}} hasAuth: type: boolean description: If true, a username and password for login type authentication must be provided. @@ -1029,14 +1055,14 @@ components: type: string description: | The JSON payload sent to the update case URL to update the case. You can use variables to add Kibana Cases data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review. - example: - fields: - summary: - '[object Object]': null - description: - '[object Object]': null - labels: - '[object Object]': null + examples: + - fields: + summary: + '[object Object]': null + description: + '[object Object]': null + labels: + '[object Object]': null updateIncidentMethod: type: string description: | @@ -1050,12 +1076,14 @@ components: type: string description: | The REST API URL to update the case by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}} + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}} viewIncidentUrl: type: string description: | The URL to view the case in the external system. You can use variables to add the external system ID or external system title to the URL. - example: https://testing-jira.atlassian.net/browse/{{{external.system.title}}} + examples: + - https://testing-jira.atlassian.net/browse/{{{external.system.title}}} secrets_properties_cases_webhook: title: Connector secrets properties for Webhook - Case Management connector type: object @@ -1083,11 +1111,13 @@ components: description: The type of connector. enum: - .cases-webhook - example: .cases-webhook + examples: + - .cases-webhook name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_cases_webhook' config_properties_d3security: @@ -1129,11 +1159,13 @@ components: description: The type of connector. enum: - .d3security - example: .d3security + examples: + - .d3security name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_d3security' config_properties_email: @@ -1146,8 +1178,9 @@ components: clientId: description: | The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required. - type: string - nullable: true + type: + - string + - 'null' from: description: | The from address for all emails sent by the connector. It must be specified in `user@host-name` format. @@ -1162,8 +1195,9 @@ components: The host name of the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. type: string oauthTokenUrl: - type: string - nullable: true + type: + - string + - 'null' port: description: | The port to connect to on the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. @@ -1186,8 +1220,9 @@ components: tenantId: description: | The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required. - type: string - nullable: true + type: + - string + - 'null' secrets_properties_email: title: Connector secrets properties for an email connector description: Defines secrets for connectors when type is `.email`. @@ -1223,11 +1258,13 @@ components: description: The type of connector. enum: - .email - example: .email + examples: + - .email name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_email' config_properties_genai: @@ -1291,11 +1328,13 @@ components: description: The type of connector. enum: - .gen-ai - example: .gen-ai + examples: + - .gen-ai name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_genai' config_properties_index: @@ -1308,8 +1347,9 @@ components: executionTimeField: description: A field that indicates when the document was indexed. default: null - type: string - nullable: true + type: + - string + - 'null' index: description: The Elasticsearch index to be written to. type: string @@ -1334,11 +1374,13 @@ components: description: The type of connector. enum: - .index - example: .index + examples: + - .index name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector config_properties_jira: title: Connector request properties for a Jira connector required: @@ -1384,11 +1426,13 @@ components: description: The type of connector. enum: - .jira - example: .jira + examples: + - .jira name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_jira' config_properties_opsgenie: @@ -1429,11 +1473,13 @@ components: description: The type of connector. enum: - .opsgenie - example: .opsgenie + examples: + - .opsgenie name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_opsgenie' config_properties_pagerduty: @@ -1443,9 +1489,11 @@ components: properties: apiUrl: description: The PagerDuty event URL. - type: string - nullable: true - example: https://events.pagerduty.com/v2/enqueue + type: + - string + - 'null' + examples: + - https://events.pagerduty.com/v2/enqueue secrets_properties_pagerduty: title: Connector secrets properties for a PagerDuty connector description: Defines secrets for connectors when type is `.pagerduty`. @@ -1475,11 +1523,13 @@ components: description: The type of connector. enum: - .pagerduty - example: .pagerduty + examples: + - .pagerduty name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_pagerduty' config_properties_resilient: @@ -1525,13 +1575,15 @@ components: connector_type_id: description: The type of connector. type: string - example: .resilient + examples: + - .resilient enum: - .resilient name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_resilient' create_connector_request_serverlog: @@ -1547,11 +1599,13 @@ components: description: The type of connector. enum: - .server-log - example: .server-log + examples: + - .server-log name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector config_properties_servicenow: title: Connector request properties for a ServiceNow ITSM connector required: @@ -1622,11 +1676,13 @@ components: description: The type of connector. enum: - .servicenow - example: .servicenow + examples: + - .servicenow name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_servicenow' config_properties_servicenow_itom: @@ -1674,11 +1730,13 @@ components: description: The type of connector. enum: - .servicenow-itom - example: .servicenow-itom + examples: + - .servicenow-itom name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_servicenow' create_connector_request_servicenow_sir: @@ -1699,11 +1757,13 @@ components: description: The type of connector. enum: - .servicenow-sir - example: .servicenow-sir + examples: + - .servicenow-sir name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_servicenow' secrets_properties_slack_api: @@ -1730,11 +1790,13 @@ components: description: The type of connector. enum: - .slack_api - example: .slack_api + examples: + - .slack_api name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_slack_api' secrets_properties_slack_webhook: @@ -1761,11 +1823,13 @@ components: description: The type of connector. enum: - .slack - example: .slack + examples: + - .slack name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_slack_webhook' config_properties_swimlane: @@ -1974,11 +2038,13 @@ components: description: The type of connector. enum: - .swimlane - example: .swimlane + examples: + - .swimlane name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_swimlane' secrets_properties_teams: @@ -2006,11 +2072,13 @@ components: description: The type of connector. enum: - .teams - example: .teams + examples: + - .teams name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_teams' config_properties_tines: @@ -2056,11 +2124,13 @@ components: description: The type of connector. enum: - .tines - example: .tines + examples: + - .tines name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_tines' config_properties_torq: @@ -2101,11 +2171,13 @@ components: description: The type of connector. enum: - .torq - example: .torq + examples: + - .torq name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_torq' config_properties_webhook: @@ -2137,8 +2209,9 @@ components: description: | If `true`, a user name and password must be provided for login type authentication. headers: - type: object - nullable: true + type: + - object + - 'null' description: A set of key-value pairs sent as headers with the request. method: type: string @@ -2201,11 +2274,13 @@ components: description: The type of connector. enum: - .webhook - example: .webhook + examples: + - .webhook name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_webhook' config_properties_xmatters: @@ -2216,8 +2291,9 @@ components: configUrl: description: | The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when `usesBasic` is `true`. - type: string - nullable: true + type: + - string + - 'null' usesBasic: description: Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`). type: boolean @@ -2257,11 +2333,13 @@ components: description: The type of connector. enum: - .xmatters - example: .xmatters + examples: + - .xmatters name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_xmatters' create_connector_request: @@ -2295,20 +2373,24 @@ components: is_deprecated: type: boolean description: Indicates whether the connector type is deprecated. - example: false + examples: + - false is_missing_secrets: type: boolean description: Indicates whether secrets are missing for the connector. Secrets configuration properties vary depending on the connector type. - example: false + examples: + - false is_preconfigured: type: boolean description: | Indicates whether it is a preconfigured connector. If true, the `config` and `is_missing_secrets` properties are omitted from the response. - example: false + examples: + - false is_system_action: type: boolean description: Indicates whether the connector is used for system actions. - example: false + examples: + - false connector_response_properties_bedrock: title: Connector response properties for an Amazon Bedrock connector type: object @@ -2345,7 +2427,8 @@ components: type: integer description: | Indicates the number of saved objects that reference the connector. If `is_preconfigured` is true, this value is not calculated. This property is returned only by the get all connectors API. - example: 2 + examples: + - 2 connector_response_properties_cases_webhook: title: Connector request properties for a Webhook - Case Management connector type: object @@ -2621,8 +2704,9 @@ components: - name properties: config: - type: object - nullable: true + type: + - object + - 'null' connector_type_id: type: string description: The type of connector. @@ -3056,7 +3140,8 @@ components: name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_cases_webhook' update_connector_request_d3security: @@ -3236,7 +3321,8 @@ components: name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_swimlane' update_connector_request_teams: @@ -3336,6 +3422,24 @@ components: - $ref: '#/components/schemas/update_connector_request_torq' - $ref: '#/components/schemas/update_connector_request_webhook' - $ref: '#/components/schemas/update_connector_request_xmatters' + run_connector_params_acknowledge_resolve_pagerduty: + title: PagerDuty connector parameters + description: Test an action that acknowledges or resolves a PagerDuty alert. + type: object + required: + - dedupKey + - eventAction + properties: + dedupKey: + description: The deduplication key for the PagerDuty alert. + type: string + maxLength: 255 + eventAction: + description: The type of event. + type: string + enum: + - acknowledge + - resolve run_connector_params_documents: title: Index connector parameters description: Test an action that indexes a document into Elasticsearch. @@ -3413,6 +3517,74 @@ components: message: type: string description: The message for server log connectors. + run_connector_params_trigger_pagerduty: + title: PagerDuty connector parameters + description: Test an action that triggers a PagerDuty alert. + type: object + required: + - eventAction + properties: + class: + description: The class or type of the event. + type: string + examples: + - cpu load + component: + description: The component of the source machine that is responsible for the event. + type: string + examples: + - eth0 + customDetails: + description: Additional details to add to the event. + type: object + dedupKey: + description: | + All actions sharing this key will be associated with the same PagerDuty alert. This value is used to correlate trigger and resolution. + type: string + maxLength: 255 + eventAction: + description: The type of event. + type: string + enum: + - trigger + group: + description: The logical grouping of components of a service. + type: string + examples: + - app-stack + links: + description: A list of links to add to the event. + type: array + items: + type: object + properties: + href: + description: The URL for the link. + type: string + text: + description: A plain text description of the purpose of the link. + type: string + severity: + description: The severity of the event on the affected system. + type: string + enum: + - critical + - error + - info + - warning + default: info + source: + description: | + The affected system, such as a hostname or fully qualified domain name. Defaults to the Kibana saved object id of the action. + type: string + summary: + description: A summery of the event. + type: string + maxLength: 1024 + timestamp: + description: An ISO-8601 timestamp that indicates when the event was detected or generated. + type: string + format: date-time run_connector_subaction_addevent: title: The addEvent subaction type: object @@ -3525,9 +3697,9 @@ components: type: object description: The custom properties of the alert. additionalProperties: true - example: - key1: value1 - key2: value2 + examples: + - key1: value1 + key2: value2 entity: type: string description: The domain of the alert. For example, the application or server name. @@ -3625,7 +3797,8 @@ components: id: type: string description: The Jira issue type identifier. - example: 10024 + examples: + - 10024 run_connector_subaction_getchoices: title: The getChoices subaction type: object @@ -3683,7 +3856,8 @@ components: externalId: type: string description: The Jira, ServiceNow ITSM, or ServiceNow SecOps issue identifier. - example: 71778 + examples: + - 71778 run_connector_subaction_issue: title: The issue subaction type: object @@ -3704,7 +3878,8 @@ components: id: type: string description: The Jira issue identifier. - example: 71778 + examples: + - 71778 run_connector_subaction_issues: title: The issues subaction type: object @@ -3877,9 +4052,11 @@ components: properties: params: oneOf: + - $ref: '#/components/schemas/run_connector_params_acknowledge_resolve_pagerduty' - $ref: '#/components/schemas/run_connector_params_documents' - $ref: '#/components/schemas/run_connector_params_message_email' - $ref: '#/components/schemas/run_connector_params_message_serverlog' + - $ref: '#/components/schemas/run_connector_params_trigger_pagerduty' - title: Subaction parameters description: Test an action that involves a subaction. oneOf: @@ -3933,7 +4110,8 @@ components: - .torq - .webhook - .xmatters - example: .server-log + examples: + - .server-log action_response_properties: title: Action response properties description: The properties vary depending on the action type. @@ -4110,6 +4288,17 @@ components: value: params: subAction: issueTypes + run_pagerduty_connector_request: + summary: Run a PagerDuty connector to trigger an alert. + value: + params: + eventAction: trigger + summary: A brief event summary + links: + - href: http://example.com/pagerduty + text: An example link + customDetails: + my_data_1: test data run_server_log_connector_request: summary: Run a server log connector. value: @@ -4201,6 +4390,15 @@ components: - id: 10000 name: Epic status: ok + run_pagerduty_connector_response: + summary: Response from running a PagerDuty connector. + value: + connector_id: 45de9f70-954f-4608-b12a-db7cf808e49d + data: + dedup_key: 5115e138b26b484a81eaea779faa6016 + message: Event processed + status: success + status: ok run_server_log_connector_response: summary: Response from running a server log connector. value: @@ -4347,14 +4545,16 @@ components: properties: error: type: string - example: Unauthorized + examples: + - Unauthorized enum: - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 enum: - 401 '404': @@ -4367,15 +4567,18 @@ components: properties: error: type: string - example: Not Found + examples: + - Not Found enum: - Not Found message: type: string - example: Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found + examples: + - Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found statusCode: type: integer - example: 404 + examples: + - 404 enum: - 404 200_actions: diff --git a/x-pack/plugins/actions/docs/openapi/bundled_serverless.json b/x-pack/plugins/actions/docs/openapi/bundled_serverless.json index dadcc4cc08767..769fdf2d258e9 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled_serverless.json +++ b/x-pack/plugins/actions/docs/openapi/bundled_serverless.json @@ -1,9 +1,9 @@ { - "openapi": "3.0.1", + "openapi": "3.1.0", "info": { "title": "Connectors", "description": "OpenAPI schema for connectors in Serverless projects", - "version": "0.1", + "version": "0.2", "contact": { "name": "Connectors Team" }, @@ -180,7 +180,9 @@ "required": true, "schema": { "type": "string", - "example": "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + "examples": [ + "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + ] } } ], @@ -336,34 +338,46 @@ "enabled": { "type": "boolean", "description": "Indicates whether the connector type is enabled in Kibana.", - "example": true + "examples": [ + true + ] }, "enabled_in_config": { "type": "boolean", "description": "Indicates whether the connector type is enabled in the Kibana configuration file.", - "example": true + "examples": [ + true + ] }, "enabled_in_license": { "type": "boolean", "description": "Indicates whether the connector is enabled in the license.", - "example": true + "examples": [ + true + ] }, "id": { "$ref": "#/components/schemas/connector_types" }, "is_system_action_type": { "type": "boolean", - "example": false + "examples": [ + false + ] }, "minimum_license_required": { "type": "string", "description": "The license that is required to use the connector type.", - "example": "basic" + "examples": [ + "basic" + ] }, "name": { "type": "string", "description": "The name of the connector type.", - "example": "Index" + "examples": [ + "Index" + ] }, "supported_feature_ids": { "type": "array", @@ -371,10 +385,12 @@ "items": { "$ref": "#/components/schemas/features" }, - "example": [ - "alerting", - "cases", - "siem" + "examples": [ + [ + "alerting", + "cases", + "siem" + ] ] } } @@ -400,7 +416,8 @@ "apiKeyAuth": { "type": "apiKey", "in": "header", - "name": "ApiKey" + "name": "Authorization", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" } }, "parameters": { @@ -420,7 +437,9 @@ "required": true, "schema": { "type": "string", - "example": "df770e30-8b8b-11ed-a780-3b746c987a81" + "examples": [ + "df770e30-8b8b-11ed-a780-3b746c987a81" + ] } } }, @@ -483,12 +502,16 @@ "enum": [ ".bedrock" ], - "example": ".bedrock" + "examples": [ + ".bedrock" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_bedrock" @@ -513,11 +536,13 @@ "createCommentJson": { "type": "string", "description": "A JSON payload sent to the create comment URL to create a case comment. You can use variables to add Kibana Cases data to the payload. The required variable is `case.comment`. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated once the Mustache variables have been placed when the REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass.\n", - "example": { - "body": { - "[object Object]": null + "examples": [ + { + "body": { + "[object Object]": null + } } - } + ] }, "createCommentMethod": { "type": "string", @@ -532,24 +557,28 @@ "createCommentUrl": { "type": "string", "description": "The REST API URL to create a case comment by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts setting`, add the hostname to the allowed hosts.\n", - "example": "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment" + "examples": [ + "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment" + ] }, "createIncidentJson": { "type": "string", "description": "A JSON payload sent to the create case URL to create a case. You can use variables to add case data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review.\n", - "example": { - "fields": { - "summary": { - "[object Object]": null - }, - "description": { - "[object Object]": null - }, - "labels": { - "[object Object]": null + "examples": [ + { + "fields": { + "summary": { + "[object Object]": null + }, + "description": { + "[object Object]": null + }, + "labels": { + "[object Object]": null + } } } - } + ] }, "createIncidentMethod": { "type": "string", @@ -576,7 +605,9 @@ "getIncidentUrl": { "type": "string", "description": "The REST API URL to get the case by ID from the third-party system. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. You can use a variable to add the external system ID to the URL. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass.\n", - "example": "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}" + "examples": [ + "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}" + ] }, "hasAuth": { "type": "boolean", @@ -590,19 +621,21 @@ "updateIncidentJson": { "type": "string", "description": "The JSON payload sent to the update case URL to update the case. You can use variables to add Kibana Cases data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review.\n", - "example": { - "fields": { - "summary": { - "[object Object]": null - }, - "description": { - "[object Object]": null - }, - "labels": { - "[object Object]": null + "examples": [ + { + "fields": { + "summary": { + "[object Object]": null + }, + "description": { + "[object Object]": null + }, + "labels": { + "[object Object]": null + } } } - } + ] }, "updateIncidentMethod": { "type": "string", @@ -617,12 +650,16 @@ "updateIncidentUrl": { "type": "string", "description": "The REST API URL to update the case by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts.\n", - "example": "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}}" + "examples": [ + "https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}}" + ] }, "viewIncidentUrl": { "type": "string", "description": "The URL to view the case in the external system. You can use variables to add the external system ID or external system title to the URL.\n", - "example": "https://testing-jira.atlassian.net/browse/{{{external.system.title}}}" + "examples": [ + "https://testing-jira.atlassian.net/browse/{{{external.system.title}}}" + ] } } }, @@ -659,12 +696,16 @@ "enum": [ ".cases-webhook" ], - "example": ".cases-webhook" + "examples": [ + ".cases-webhook" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_cases_webhook" @@ -719,12 +760,16 @@ "enum": [ ".d3security" ], - "example": ".d3security" + "examples": [ + ".d3security" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_d3security" @@ -741,8 +786,10 @@ "properties": { "clientId": { "description": "The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.\n", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "from": { "description": "The from address for all emails sent by the connector. It must be specified in `user@host-name` format.\n", @@ -758,8 +805,10 @@ "type": "string" }, "oauthTokenUrl": { - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "port": { "description": "The port to connect to on the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. \n", @@ -783,8 +832,10 @@ }, "tenantId": { "description": "The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required.\n", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] } } }, @@ -827,12 +878,16 @@ "enum": [ ".email" ], - "example": ".email" + "examples": [ + ".email" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_email" @@ -923,12 +978,16 @@ "enum": [ ".gen-ai" ], - "example": ".gen-ai" + "examples": [ + ".gen-ai" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_genai" @@ -946,8 +1005,10 @@ "executionTimeField": { "description": "A field that indicates when the document was indexed.", "default": null, - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "index": { "description": "The Elasticsearch index to be written to.", @@ -979,12 +1040,16 @@ "enum": [ ".index" ], - "example": ".index" + "examples": [ + ".index" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] } } }, @@ -1046,12 +1111,16 @@ "enum": [ ".jira" ], - "example": ".jira" + "examples": [ + ".jira" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_jira" @@ -1106,12 +1175,16 @@ "enum": [ ".opsgenie" ], - "example": ".opsgenie" + "examples": [ + ".opsgenie" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_opsgenie" @@ -1125,9 +1198,13 @@ "properties": { "apiUrl": { "description": "The PagerDuty event URL.", - "type": "string", - "nullable": true, - "example": "https://events.pagerduty.com/v2/enqueue" + "type": [ + "string", + "null" + ], + "examples": [ + "https://events.pagerduty.com/v2/enqueue" + ] } } }, @@ -1165,12 +1242,16 @@ "enum": [ ".pagerduty" ], - "example": ".pagerduty" + "examples": [ + ".pagerduty" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_pagerduty" @@ -1232,7 +1313,9 @@ "connector_type_id": { "description": "The type of connector.", "type": "string", - "example": ".resilient", + "examples": [ + ".resilient" + ], "enum": [ ".resilient" ] @@ -1240,7 +1323,9 @@ "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_resilient" @@ -1262,12 +1347,16 @@ "enum": [ ".server-log" ], - "example": ".server-log" + "examples": [ + ".server-log" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] } } }, @@ -1354,12 +1443,16 @@ "enum": [ ".servicenow" ], - "example": ".servicenow" + "examples": [ + ".servicenow" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_servicenow" @@ -1417,12 +1510,16 @@ "enum": [ ".servicenow-itom" ], - "example": ".servicenow-itom" + "examples": [ + ".servicenow-itom" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_servicenow" @@ -1449,12 +1546,16 @@ "enum": [ ".servicenow-sir" ], - "example": ".servicenow-sir" + "examples": [ + ".servicenow-sir" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_servicenow" @@ -1491,12 +1592,16 @@ "enum": [ ".slack_api" ], - "example": ".slack_api" + "examples": [ + ".slack_api" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_slack_api" @@ -1533,12 +1638,16 @@ "enum": [ ".slack" ], - "example": ".slack" + "examples": [ + ".slack" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_slack_webhook" @@ -1815,12 +1924,16 @@ "enum": [ ".swimlane" ], - "example": ".swimlane" + "examples": [ + ".swimlane" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_swimlane" @@ -1857,12 +1970,16 @@ "enum": [ ".teams" ], - "example": ".teams" + "examples": [ + ".teams" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_teams" @@ -1922,12 +2039,16 @@ "enum": [ ".tines" ], - "example": ".tines" + "examples": [ + ".tines" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_tines" @@ -1982,12 +2103,16 @@ "enum": [ ".torq" ], - "example": ".torq" + "examples": [ + ".torq" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_torq" @@ -2025,8 +2150,10 @@ "description": "If `true`, a user name and password must be provided for login type authentication.\n" }, "headers": { - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "description": "A set of key-value pairs sent as headers with the request." }, "method": { @@ -2101,12 +2228,16 @@ "enum": [ ".webhook" ], - "example": ".webhook" + "examples": [ + ".webhook" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_webhook" @@ -2120,8 +2251,10 @@ "properties": { "configUrl": { "description": "The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when `usesBasic` is `true`.\n", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "usesBasic": { "description": "Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`).", @@ -2169,12 +2302,16 @@ "enum": [ ".xmatters" ], - "example": ".xmatters" + "examples": [ + ".xmatters" + ] }, "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_xmatters" @@ -2259,22 +2396,30 @@ "is_deprecated": { "type": "boolean", "description": "Indicates whether the connector type is deprecated.", - "example": false + "examples": [ + false + ] }, "is_missing_secrets": { "type": "boolean", "description": "Indicates whether secrets are missing for the connector. Secrets configuration properties vary depending on the connector type.", - "example": false + "examples": [ + false + ] }, "is_preconfigured": { "type": "boolean", "description": "Indicates whether it is a preconfigured connector. If true, the `config` and `is_missing_secrets` properties are omitted from the response. \n", - "example": false + "examples": [ + false + ] }, "is_system_action": { "type": "boolean", "description": "Indicates whether the connector is used for system actions.", - "example": false + "examples": [ + false + ] }, "connector_response_properties_bedrock": { "title": "Connector response properties for an Amazon Bedrock connector", @@ -2323,7 +2468,9 @@ "referenced_by_count": { "type": "integer", "description": "Indicates the number of saved objects that reference the connector. If `is_preconfigured` is true, this value is not calculated. This property is returned only by the get all connectors API.\n", - "example": 2 + "examples": [ + 2 + ] }, "connector_response_properties_cases_webhook": { "title": "Connector request properties for a Webhook - Case Management connector", @@ -2705,8 +2852,10 @@ ], "properties": { "config": { - "type": "object", - "nullable": true + "type": [ + "object", + "null" + ] }, "connector_type_id": { "type": "string", @@ -3346,7 +3495,9 @@ "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_cases_webhook" @@ -3599,7 +3750,9 @@ "name": { "type": "string", "description": "The display name for the connector.", - "example": "my-connector" + "examples": [ + "my-connector" + ] }, "secrets": { "$ref": "#/components/schemas/secrets_properties_swimlane" @@ -3815,7 +3968,9 @@ ".webhook", ".xmatters" ], - "example": ".server-log" + "examples": [ + ".server-log" + ] } }, "examples": { @@ -4048,7 +4203,9 @@ "properties": { "error": { "type": "string", - "example": "Unauthorized", + "examples": [ + "Unauthorized" + ], "enum": [ "Unauthorized" ] @@ -4058,7 +4215,9 @@ }, "statusCode": { "type": "integer", - "example": 401, + "examples": [ + 401 + ], "enum": [ 401 ] @@ -4078,18 +4237,24 @@ "properties": { "error": { "type": "string", - "example": "Not Found", + "examples": [ + "Not Found" + ], "enum": [ "Not Found" ] }, "message": { "type": "string", - "example": "Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found" + "examples": [ + "Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found" + ] }, "statusCode": { "type": "integer", - "example": 404, + "examples": [ + 404 + ], "enum": [ 404 ] diff --git a/x-pack/plugins/actions/docs/openapi/bundled_serverless.yaml b/x-pack/plugins/actions/docs/openapi/bundled_serverless.yaml index fbe684c35fe48..15a9dfb0be293 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled_serverless.yaml +++ b/x-pack/plugins/actions/docs/openapi/bundled_serverless.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Connectors description: OpenAPI schema for connectors in Serverless projects - version: '0.1' + version: '0.2' contact: name: Connectors Team license: @@ -111,7 +111,8 @@ paths: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 requestBody: required: true content: @@ -210,37 +211,43 @@ paths: enabled: type: boolean description: Indicates whether the connector type is enabled in Kibana. - example: true + examples: + - true enabled_in_config: type: boolean description: Indicates whether the connector type is enabled in the Kibana configuration file. - example: true + examples: + - true enabled_in_license: type: boolean description: Indicates whether the connector is enabled in the license. - example: true + examples: + - true id: $ref: '#/components/schemas/connector_types' is_system_action_type: type: boolean - example: false + examples: + - false minimum_license_required: type: string description: The license that is required to use the connector type. - example: basic + examples: + - basic name: type: string description: The name of the connector type. - example: Index + examples: + - Index supported_feature_ids: type: array description: The features that are supported by the connector type. items: $ref: '#/components/schemas/features' - example: - - alerting - - cases - - siem + examples: + - - alerting + - cases + - siem examples: getConnectorTypesServerlessResponse: $ref: '#/components/examples/get_connector_types_generativeai_response' @@ -251,7 +258,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' parameters: kbn_xsrf: schema: @@ -267,7 +275,8 @@ components: required: true schema: type: string - example: df770e30-8b8b-11ed-a780-3b746c987a81 + examples: + - df770e30-8b8b-11ed-a780-3b746c987a81 schemas: config_properties_bedrock: title: Connector request properties for an Amazon Bedrock connector @@ -315,11 +324,13 @@ components: description: The type of connector. enum: - .bedrock - example: .bedrock + examples: + - .bedrock name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_bedrock' config_properties_cases_webhook: @@ -340,9 +351,9 @@ components: type: string description: | A JSON payload sent to the create comment URL to create a case comment. You can use variables to add Kibana Cases data to the payload. The required variable is `case.comment`. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated once the Mustache variables have been placed when the REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. - example: - body: - '[object Object]': null + examples: + - body: + '[object Object]': null createCommentMethod: type: string description: | @@ -356,19 +367,20 @@ components: type: string description: | The REST API URL to create a case comment by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts setting`, add the hostname to the allowed hosts. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment createIncidentJson: type: string description: | A JSON payload sent to the create case URL to create a case. You can use variables to add case data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review. - example: - fields: - summary: - '[object Object]': null - description: - '[object Object]': null - labels: - '[object Object]': null + examples: + - fields: + summary: + '[object Object]': null + description: + '[object Object]': null + labels: + '[object Object]': null createIncidentMethod: type: string description: | @@ -392,7 +404,8 @@ components: type: string description: | The REST API URL to get the case by ID from the third-party system. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. You can use a variable to add the external system ID to the URL. Due to Mustache template variables (the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}} + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}} hasAuth: type: boolean description: If true, a username and password for login type authentication must be provided. @@ -405,14 +418,14 @@ components: type: string description: | The JSON payload sent to the update case URL to update the case. You can use variables to add Kibana Cases data to the payload. Required variables are `case.title` and `case.description`. Due to Mustache template variables (which is the text enclosed in triple braces, for example, `{{{case.title}}}`), the JSON is not validated when you create the connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review. - example: - fields: - summary: - '[object Object]': null - description: - '[object Object]': null - labels: - '[object Object]': null + examples: + - fields: + summary: + '[object Object]': null + description: + '[object Object]': null + labels: + '[object Object]': null updateIncidentMethod: type: string description: | @@ -426,12 +439,14 @@ components: type: string description: | The REST API URL to update the case by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}} + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}} viewIncidentUrl: type: string description: | The URL to view the case in the external system. You can use variables to add the external system ID or external system title to the URL. - example: https://testing-jira.atlassian.net/browse/{{{external.system.title}}} + examples: + - https://testing-jira.atlassian.net/browse/{{{external.system.title}}} secrets_properties_cases_webhook: title: Connector secrets properties for Webhook - Case Management connector type: object @@ -459,11 +474,13 @@ components: description: The type of connector. enum: - .cases-webhook - example: .cases-webhook + examples: + - .cases-webhook name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_cases_webhook' config_properties_d3security: @@ -505,11 +522,13 @@ components: description: The type of connector. enum: - .d3security - example: .d3security + examples: + - .d3security name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_d3security' config_properties_email: @@ -522,8 +541,9 @@ components: clientId: description: | The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required. - type: string - nullable: true + type: + - string + - 'null' from: description: | The from address for all emails sent by the connector. It must be specified in `user@host-name` format. @@ -538,8 +558,9 @@ components: The host name of the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. type: string oauthTokenUrl: - type: string - nullable: true + type: + - string + - 'null' port: description: | The port to connect to on the service provider. If the `service` is `elastic_cloud` (for Elastic Cloud notifications) or one of Nodemailer's well-known email service providers, this property is ignored. If `service` is `other`, this property must be defined. @@ -562,8 +583,9 @@ components: tenantId: description: | The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required. - type: string - nullable: true + type: + - string + - 'null' secrets_properties_email: title: Connector secrets properties for an email connector description: Defines secrets for connectors when type is `.email`. @@ -599,11 +621,13 @@ components: description: The type of connector. enum: - .email - example: .email + examples: + - .email name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_email' config_properties_genai: @@ -667,11 +691,13 @@ components: description: The type of connector. enum: - .gen-ai - example: .gen-ai + examples: + - .gen-ai name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_genai' config_properties_index: @@ -684,8 +710,9 @@ components: executionTimeField: description: A field that indicates when the document was indexed. default: null - type: string - nullable: true + type: + - string + - 'null' index: description: The Elasticsearch index to be written to. type: string @@ -710,11 +737,13 @@ components: description: The type of connector. enum: - .index - example: .index + examples: + - .index name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector config_properties_jira: title: Connector request properties for a Jira connector required: @@ -760,11 +789,13 @@ components: description: The type of connector. enum: - .jira - example: .jira + examples: + - .jira name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_jira' config_properties_opsgenie: @@ -805,11 +836,13 @@ components: description: The type of connector. enum: - .opsgenie - example: .opsgenie + examples: + - .opsgenie name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_opsgenie' config_properties_pagerduty: @@ -819,9 +852,11 @@ components: properties: apiUrl: description: The PagerDuty event URL. - type: string - nullable: true - example: https://events.pagerduty.com/v2/enqueue + type: + - string + - 'null' + examples: + - https://events.pagerduty.com/v2/enqueue secrets_properties_pagerduty: title: Connector secrets properties for a PagerDuty connector description: Defines secrets for connectors when type is `.pagerduty`. @@ -851,11 +886,13 @@ components: description: The type of connector. enum: - .pagerduty - example: .pagerduty + examples: + - .pagerduty name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_pagerduty' config_properties_resilient: @@ -901,13 +938,15 @@ components: connector_type_id: description: The type of connector. type: string - example: .resilient + examples: + - .resilient enum: - .resilient name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_resilient' create_connector_request_serverlog: @@ -923,11 +962,13 @@ components: description: The type of connector. enum: - .server-log - example: .server-log + examples: + - .server-log name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector config_properties_servicenow: title: Connector request properties for a ServiceNow ITSM connector required: @@ -998,11 +1039,13 @@ components: description: The type of connector. enum: - .servicenow - example: .servicenow + examples: + - .servicenow name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_servicenow' config_properties_servicenow_itom: @@ -1050,11 +1093,13 @@ components: description: The type of connector. enum: - .servicenow-itom - example: .servicenow-itom + examples: + - .servicenow-itom name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_servicenow' create_connector_request_servicenow_sir: @@ -1075,11 +1120,13 @@ components: description: The type of connector. enum: - .servicenow-sir - example: .servicenow-sir + examples: + - .servicenow-sir name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_servicenow' secrets_properties_slack_api: @@ -1106,11 +1153,13 @@ components: description: The type of connector. enum: - .slack_api - example: .slack_api + examples: + - .slack_api name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_slack_api' secrets_properties_slack_webhook: @@ -1137,11 +1186,13 @@ components: description: The type of connector. enum: - .slack - example: .slack + examples: + - .slack name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_slack_webhook' config_properties_swimlane: @@ -1350,11 +1401,13 @@ components: description: The type of connector. enum: - .swimlane - example: .swimlane + examples: + - .swimlane name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_swimlane' secrets_properties_teams: @@ -1382,11 +1435,13 @@ components: description: The type of connector. enum: - .teams - example: .teams + examples: + - .teams name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_teams' config_properties_tines: @@ -1432,11 +1487,13 @@ components: description: The type of connector. enum: - .tines - example: .tines + examples: + - .tines name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_tines' config_properties_torq: @@ -1477,11 +1534,13 @@ components: description: The type of connector. enum: - .torq - example: .torq + examples: + - .torq name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_torq' config_properties_webhook: @@ -1513,8 +1572,9 @@ components: description: | If `true`, a user name and password must be provided for login type authentication. headers: - type: object - nullable: true + type: + - object + - 'null' description: A set of key-value pairs sent as headers with the request. method: type: string @@ -1577,11 +1637,13 @@ components: description: The type of connector. enum: - .webhook - example: .webhook + examples: + - .webhook name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_webhook' config_properties_xmatters: @@ -1592,8 +1654,9 @@ components: configUrl: description: | The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when `usesBasic` is `true`. - type: string - nullable: true + type: + - string + - 'null' usesBasic: description: Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`). type: boolean @@ -1633,11 +1696,13 @@ components: description: The type of connector. enum: - .xmatters - example: .xmatters + examples: + - .xmatters name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_xmatters' create_connector_request: @@ -1671,20 +1736,24 @@ components: is_deprecated: type: boolean description: Indicates whether the connector type is deprecated. - example: false + examples: + - false is_missing_secrets: type: boolean description: Indicates whether secrets are missing for the connector. Secrets configuration properties vary depending on the connector type. - example: false + examples: + - false is_preconfigured: type: boolean description: | Indicates whether it is a preconfigured connector. If true, the `config` and `is_missing_secrets` properties are omitted from the response. - example: false + examples: + - false is_system_action: type: boolean description: Indicates whether the connector is used for system actions. - example: false + examples: + - false connector_response_properties_bedrock: title: Connector response properties for an Amazon Bedrock connector type: object @@ -1721,7 +1790,8 @@ components: type: integer description: | Indicates the number of saved objects that reference the connector. If `is_preconfigured` is true, this value is not calculated. This property is returned only by the get all connectors API. - example: 2 + examples: + - 2 connector_response_properties_cases_webhook: title: Connector request properties for a Webhook - Case Management connector type: object @@ -1997,8 +2067,9 @@ components: - name properties: config: - type: object - nullable: true + type: + - object + - 'null' connector_type_id: type: string description: The type of connector. @@ -2432,7 +2503,8 @@ components: name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_cases_webhook' update_connector_request_d3security: @@ -2612,7 +2684,8 @@ components: name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: '#/components/schemas/secrets_properties_swimlane' update_connector_request_teams: @@ -2749,7 +2822,8 @@ components: - .torq - .webhook - .xmatters - example: .server-log + examples: + - .server-log examples: create_email_connector_request: summary: Create an email connector. @@ -2932,14 +3006,16 @@ components: properties: error: type: string - example: Unauthorized + examples: + - Unauthorized enum: - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 enum: - 401 '404': @@ -2952,14 +3028,17 @@ components: properties: error: type: string - example: Not Found + examples: + - Not Found enum: - Not Found message: type: string - example: Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found + examples: + - Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found statusCode: type: integer - example: 404 + examples: + - 404 enum: - 404 diff --git a/x-pack/plugins/actions/docs/openapi/components/examples/run_pagerduty_connector_request.yaml b/x-pack/plugins/actions/docs/openapi/components/examples/run_pagerduty_connector_request.yaml new file mode 100644 index 0000000000000..8124aac245ec7 --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/examples/run_pagerduty_connector_request.yaml @@ -0,0 +1,10 @@ +summary: Run a PagerDuty connector to trigger an alert. +value: + params: + eventAction: trigger + summary: A brief event summary + links: + - href: http://example.com/pagerduty + text: An example link + customDetails: + my_data_1: test data \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/examples/run_pagerduty_connector_response.yaml b/x-pack/plugins/actions/docs/openapi/components/examples/run_pagerduty_connector_response.yaml new file mode 100644 index 0000000000000..81e941ce52a42 --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/examples/run_pagerduty_connector_response.yaml @@ -0,0 +1,8 @@ +summary: Response from running a PagerDuty connector. +value: + connector_id: 45de9f70-954f-4608-b12a-db7cf808e49d + data: + dedup_key: 5115e138b26b484a81eaea779faa6016 + message: Event processed + status: success + status: ok \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/parameters/action_id.yaml b/x-pack/plugins/actions/docs/openapi/components/parameters/action_id.yaml index 3ee0b642c9dee..acbc6ab5acd63 100644 --- a/x-pack/plugins/actions/docs/openapi/components/parameters/action_id.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/parameters/action_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the action. required: true schema: type: string - example: c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad + examples: + - c55b6eb0-6bad-11eb-9f3b-611eebc6c3ad diff --git a/x-pack/plugins/actions/docs/openapi/components/parameters/connector_id.yaml b/x-pack/plugins/actions/docs/openapi/components/parameters/connector_id.yaml index d98c2cec803ff..fdf1487e626a8 100644 --- a/x-pack/plugins/actions/docs/openapi/components/parameters/connector_id.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/parameters/connector_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the connector. required: true schema: type: string - example: df770e30-8b8b-11ed-a780-3b746c987a81 + examples: + - df770e30-8b8b-11ed-a780-3b746c987a81 diff --git a/x-pack/plugins/actions/docs/openapi/components/parameters/space_id.yaml b/x-pack/plugins/actions/docs/openapi/components/parameters/space_id.yaml index 0a9fba457e3e7..45787e844caec 100644 --- a/x-pack/plugins/actions/docs/openapi/components/parameters/space_id.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/parameters/space_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the space. If `/s/` and the identifier are omitte required: true schema: type: string - example: default + examples: + - default diff --git a/x-pack/plugins/actions/docs/openapi/components/responses/400.yaml b/x-pack/plugins/actions/docs/openapi/components/responses/400.yaml index 263623dd1fb4c..4f8890737ff40 100644 --- a/x-pack/plugins/actions/docs/openapi/components/responses/400.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/responses/400.yaml @@ -6,10 +6,13 @@ content: properties: error: type: string - example: Bad Request + examples: + - Bad Request message: type: string - example: "error validating action type config: [index]: expected value of type [string] but got [undefined]" + examples: + - "error validating action type config: [index]: expected value of type [string] but got [undefined]" statusCode: type: integer - example: 400 \ No newline at end of file + examples: + - 400 \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/responses/401.yaml b/x-pack/plugins/actions/docs/openapi/components/responses/401.yaml index ff5cbfd4c2768..78b77b3ab5f43 100644 --- a/x-pack/plugins/actions/docs/openapi/components/responses/401.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/responses/401.yaml @@ -7,13 +7,15 @@ content: properties: error: type: string - example: Unauthorized + examples: + - Unauthorized enum: - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 enum: - 401 \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/responses/404.yaml b/x-pack/plugins/actions/docs/openapi/components/responses/404.yaml index 56964c6015c85..d4cf816f5903c 100644 --- a/x-pack/plugins/actions/docs/openapi/components/responses/404.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/responses/404.yaml @@ -7,14 +7,17 @@ content: properties: error: type: string - example: Not Found + examples: + - Not Found enum: - Not Found message: type: string - example: "Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found" + examples: + - "Saved object [action/baf33fc0-920c-11ed-b36a-874bd1548a00] not found" statusCode: type: integer - example: 404 + examples: + - 404 enum: - 404 \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_cases_webhook.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_cases_webhook.yaml index 43945fbb241a2..81c94bd3e8806 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_cases_webhook.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_cases_webhook.yaml @@ -22,7 +22,8 @@ properties: connector. The JSON is validated once the Mustache variables have been placed when the REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. - example: {"body": {{{case.comment}}}} + examples: + - {"body": {{{case.comment}}}} createCommentMethod: type: string description: > @@ -40,7 +41,8 @@ properties: You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts setting`, add the hostname to the allowed hosts. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}}/comment createIncidentJson: type: string description: > @@ -52,7 +54,8 @@ properties: connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review. - example: {"fields": {"summary": {{{case.title}}},"description": {{{case.description}}},"labels": {{{case.tags}}}}} + examples: + - {"fields": {"summary": {{{case.title}}},"description": {{{case.description}}},"labels": {{{case.tags}}}}} createIncidentMethod: type: string description: > @@ -86,7 +89,8 @@ properties: variables have been placed when REST method runs. Manually ensure that the JSON is valid, disregarding the Mustache variables, so the later validation will pass. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}} + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.id}}} hasAuth: type: boolean description: If true, a username and password for login type authentication must be provided. @@ -107,7 +111,8 @@ properties: connector. The JSON is validated after the Mustache variables have been placed when REST method runs. Manually ensure that the JSON is valid to avoid future validation errors; disregard Mustache variables during your review. - example: {"fields": {"summary": {{{case.title}}},"description": {{{case.description}}},"labels": {{{case.tags}}}}} + examples: + - {"fields": {"summary": {{{case.title}}},"description": {{{case.description}}},"labels": {{{case.tags}}}}} updateIncidentMethod: type: string description: > @@ -124,12 +129,14 @@ properties: The REST API URL to update the case by ID in the third-party system. You can use a variable to add the external system ID to the URL. If you are using the `xpack.actions.allowedHosts` setting, add the hostname to the allowed hosts. - example: https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}} + examples: + - https://testing-jira.atlassian.net/rest/api/2/issue/{{{external.system.ID}}} viewIncidentUrl: type: string description: > The URL to view the case in the external system. You can use variables to add the external system ID or external system title to the URL. - example: https://testing-jira.atlassian.net/browse/{{{external.system.title}}} + examples: + - https://testing-jira.atlassian.net/browse/{{{external.system.title}}} diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml index 6d3618e2bba27..202f4022a6fbd 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_email.yaml @@ -8,8 +8,9 @@ properties: description: > The client identifier, which is a part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required. - type: string - nullable: true + type: + - "string" + - "null" from: description: > The from address for all emails sent by the connector. It must be specified in `user@host-name` format. @@ -27,8 +28,9 @@ properties: type: string oauthTokenUrl: # description: TBD - type: string - nullable: true + type: + - "string" + - "null" port: description: > The port to connect to on the service provider. @@ -55,5 +57,6 @@ properties: description: > The tenant identifier, which is part of OAuth 2.0 client credentials authentication, in GUID format. If `service` is `exchange_server`, this property is required. - type: string - nullable: true \ No newline at end of file + type: + - "string" + - "null" \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml index 6c335b166d20a..f6d3af59b4937 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_index.yaml @@ -7,8 +7,9 @@ properties: executionTimeField: description: A field that indicates when the document was indexed. default: null - type: string - nullable: true + type: + - "string" + - "null" index: description: The Elasticsearch index to be written to. type: string diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml index 562557f548ece..bfbec7b46190b 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_pagerduty.yaml @@ -4,6 +4,8 @@ type: object properties: apiUrl: description: The PagerDuty event URL. - type: string - nullable: true - example: https://events.pagerduty.com/v2/enqueue \ No newline at end of file + type: + - "string" + - "null" + examples: + - https://events.pagerduty.com/v2/enqueue \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_webhook.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_webhook.yaml index fe45366eca264..601d410666576 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_webhook.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_webhook.yaml @@ -27,8 +27,9 @@ properties: description: > If `true`, a user name and password must be provided for login type authentication. headers: - type: object - nullable: true + type: + - "object" + - "null" description: A set of key-value pairs sent as headers with the request. method: type: string diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml index 350e96f3aa63d..3393c11ecd90d 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/config_properties_xmatters.yaml @@ -6,8 +6,9 @@ properties: description: > The request URL for the Elastic Alerts trigger in xMatters. It is applicable only when `usesBasic` is `true`. - type: string - nullable: true + type: + - "string" + - "null" usesBasic: description: Specifies whether the connector uses HTTP basic authentication (`true`) or URL authentication (`false`). type: boolean diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_serverlog.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_serverlog.yaml index a397e668102a6..da741478864b4 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_serverlog.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties_serverlog.yaml @@ -8,8 +8,9 @@ required: - name properties: config: - type: object - nullable: true + type: + - "object" + - "null" connector_type_id: type: string description: The type of connector. diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml index 5d0bc42ab8317..dff10fcc778da 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml @@ -24,4 +24,5 @@ enum: - .torq - .webhook - .xmatters -example: .server-log \ No newline at end of file +examples: + - .server-log \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_bedrock.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_bedrock.yaml index 2acc21bfbfac7..e8feecb0051cd 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_bedrock.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_bedrock.yaml @@ -14,10 +14,12 @@ properties: description: The type of connector. enum: - .bedrock - example: .bedrock + examples: + - .bedrock name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_bedrock.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_cases_webhook.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_cases_webhook.yaml index bcbe840c03513..0cd030d740809 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_cases_webhook.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_cases_webhook.yaml @@ -15,10 +15,12 @@ properties: description: The type of connector. enum: - .cases-webhook - example: .cases-webhook + examples: + - .cases-webhook name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_cases_webhook.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_d3security.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_d3security.yaml index 39cdda80b7dd2..6b5389cc80f31 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_d3security.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_d3security.yaml @@ -15,10 +15,12 @@ properties: description: The type of connector. enum: - .d3security - example: .d3security + examples: + - .d3security name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_d3security.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_email.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_email.yaml index 89f0b79c4e74b..1f1c6c079770a 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_email.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_email.yaml @@ -18,10 +18,12 @@ properties: description: The type of connector. enum: - .email - example: .email + examples: + - .email name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_email.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_genai.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_genai.yaml index 95d65bdb80919..725f842f91093 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_genai.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_genai.yaml @@ -16,10 +16,12 @@ properties: description: The type of connector. enum: - .gen-ai - example: .gen-ai + examples: + - .gen-ai name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_genai.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_index.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_index.yaml index 26d6e118c1fe8..ad8e9be9a41dc 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_index.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_index.yaml @@ -13,8 +13,10 @@ properties: description: The type of connector. enum: - .index - example: .index + examples: + - .index name: type: string description: The display name for the connector. - example: my-connector \ No newline at end of file + examples: + - my-connector \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_jira.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_jira.yaml index 5b6077e875b24..95ccaa5b2ec6f 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_jira.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_jira.yaml @@ -14,10 +14,12 @@ properties: description: The type of connector. enum: - .jira - example: .jira + examples: + - .jira name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_jira.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_opsgenie.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_opsgenie.yaml index 6de1296dac43c..51c29f5cdd8fd 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_opsgenie.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_opsgenie.yaml @@ -14,10 +14,12 @@ properties: description: The type of connector. enum: - .opsgenie - example: .opsgenie + examples: + - .opsgenie name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_opsgenie.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_pagerduty.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_pagerduty.yaml index 498488299afd3..66ffc61d30f30 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_pagerduty.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_pagerduty.yaml @@ -16,10 +16,12 @@ properties: description: The type of connector. enum: - .pagerduty - example: .pagerduty + examples: + - .pagerduty name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_pagerduty.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_resilient.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_resilient.yaml index c3f766625b7da..60467336c0d9a 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_resilient.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_resilient.yaml @@ -12,12 +12,14 @@ properties: connector_type_id: description: The type of connector. type: string - example: .resilient + examples: + - .resilient enum: - .resilient name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_resilient.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_serverlog.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_serverlog.yaml index eac0a0d65b69f..0cb85403663c6 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_serverlog.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_serverlog.yaml @@ -10,8 +10,10 @@ properties: description: The type of connector. enum: - .server-log - example: .server-log + examples: + - .server-log name: type: string description: The display name for the connector. - example: my-connector \ No newline at end of file + examples: + - my-connector \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow.yaml index e03303dcada4f..b0f35483cc39f 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow.yaml @@ -16,10 +16,12 @@ properties: description: The type of connector. enum: - .servicenow - example: .servicenow + examples: + - .servicenow name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_servicenow.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_itom.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_itom.yaml index 70a4c05c96522..bfbeb231ca7dc 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_itom.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_itom.yaml @@ -16,10 +16,12 @@ properties: description: The type of connector. enum: - .servicenow-itom - example: .servicenow-itom + examples: + - .servicenow-itom name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_servicenow.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_sir.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_sir.yaml index 4d247c456f3e6..37519eb63f27b 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_sir.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_servicenow_sir.yaml @@ -16,10 +16,12 @@ properties: description: The type of connector. enum: - .servicenow-sir - example: .servicenow-sir + examples: + - .servicenow-sir name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_servicenow.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_api.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_api.yaml index a16ba7416e7bc..07dbadbef9891 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_api.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_api.yaml @@ -11,10 +11,12 @@ properties: description: The type of connector. enum: - .slack_api - example: .slack_api + examples: + - .slack_api name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_slack_api.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_webhook.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_webhook.yaml index 1c046cc3f000c..3e884daa6e3b8 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_webhook.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_slack_webhook.yaml @@ -11,10 +11,12 @@ properties: description: The type of connector. enum: - .slack - example: .slack + examples: + - .slack name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_slack_webhook.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_swimlane.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_swimlane.yaml index 3de4f5ecbccef..633438a721ee9 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_swimlane.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_swimlane.yaml @@ -14,10 +14,12 @@ properties: description: The type of connector. enum: - .swimlane - example: .swimlane + examples: + - .swimlane name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_swimlane.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_teams.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_teams.yaml index 5e0d449bf5546..787f057c09ce6 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_teams.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_teams.yaml @@ -11,10 +11,12 @@ properties: description: The type of connector. enum: - .teams - example: .teams + examples: + - .teams name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_teams.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_tines.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_tines.yaml index 224c3e03c4363..c5333c8acc479 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_tines.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_tines.yaml @@ -15,10 +15,12 @@ properties: description: The type of connector. enum: - .tines - example: .tines + examples: + - .tines name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_tines.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_torq.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_torq.yaml index 934f9c9c1b395..a4ab3cc92aa0d 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_torq.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_torq.yaml @@ -15,10 +15,12 @@ properties: description: The type of connector. enum: - .torq - example: .torq + examples: + - .torq name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_torq.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_webhook.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_webhook.yaml index e0ead115d48dc..30e9663da8d99 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_webhook.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_webhook.yaml @@ -15,10 +15,12 @@ properties: description: The type of connector. enum: - .webhook - example: .webhook + examples: + - .webhook name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_webhook.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_xmatters.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_xmatters.yaml index 13213d39561b2..753888b16ae5e 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_xmatters.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request_xmatters.yaml @@ -16,10 +16,12 @@ properties: description: The type of connector. enum: - .xmatters - example: .xmatters + examples: + - .xmatters name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_xmatters.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/is_deprecated.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/is_deprecated.yaml index 75fb1efe2f589..ac0a26102eed1 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/is_deprecated.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/is_deprecated.yaml @@ -1,3 +1,4 @@ type: boolean description: Indicates whether the connector type is deprecated. -example: false \ No newline at end of file +examples: + - false \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/is_missing_secrets.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/is_missing_secrets.yaml index cad03a44f8629..a7ad3f9542b3f 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/is_missing_secrets.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/is_missing_secrets.yaml @@ -1,3 +1,4 @@ type: boolean description: Indicates whether secrets are missing for the connector. Secrets configuration properties vary depending on the connector type. -example: false \ No newline at end of file +examples: + - false \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/is_preconfigured.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/is_preconfigured.yaml index e38741c83718e..d3f711c229399 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/is_preconfigured.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/is_preconfigured.yaml @@ -2,4 +2,5 @@ type: boolean description: > Indicates whether it is a preconfigured connector. If true, the `config` and `is_missing_secrets` properties are omitted from the response. -example: false \ No newline at end of file +examples: + - false \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/is_system_action.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/is_system_action.yaml index fd0dd06ef5fff..5a78f4676646f 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/is_system_action.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/is_system_action.yaml @@ -1,3 +1,4 @@ type: boolean description: Indicates whether the connector is used for system actions. -example: false \ No newline at end of file +examples: + - false \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/referenced_by_count.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/referenced_by_count.yaml index 61579fa3dc6ce..0a65bf9a854ff 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/referenced_by_count.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/referenced_by_count.yaml @@ -3,4 +3,5 @@ description: > Indicates the number of saved objects that reference the connector. If `is_preconfigured` is true, this value is not calculated. This property is returned only by the get all connectors API. -example: 2 \ No newline at end of file +examples: + - 2 \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_params_acknowledge_resolve_pagerduty.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_params_acknowledge_resolve_pagerduty.yaml new file mode 100644 index 0000000000000..d5e9087cdb7ba --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_params_acknowledge_resolve_pagerduty.yaml @@ -0,0 +1,17 @@ +title: PagerDuty connector parameters +description: Test an action that acknowledges or resolves a PagerDuty alert. +type: object +required: + - dedupKey + - eventAction +properties: + dedupKey: + description: The deduplication key for the PagerDuty alert. + type: string + maxLength: 255 + eventAction: + description: The type of event. + type: string + enum: + - acknowledge + - resolve \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_params_trigger_pagerduty.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_params_trigger_pagerduty.yaml new file mode 100644 index 0000000000000..75a59af156264 --- /dev/null +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_params_trigger_pagerduty.yaml @@ -0,0 +1,69 @@ +title: PagerDuty connector parameters +description: Test an action that triggers a PagerDuty alert. +type: object +required: + - eventAction +properties: + class: + description: The class or type of the event. + type: string + examples: + - cpu load + component: + description: The component of the source machine that is responsible for the event. + type: string + examples: + - eth0 + customDetails: + description: Additional details to add to the event. + type: object + dedupKey: + description: > + All actions sharing this key will be associated with the same PagerDuty alert. + This value is used to correlate trigger and resolution. + type: string + maxLength: 255 + eventAction: + description: The type of event. + type: string + enum: + - trigger + group: + description: The logical grouping of components of a service. + type: string + examples: + - app-stack + links: + description: A list of links to add to the event. + type: array + items: + type: object + properties: + href: + description: The URL for the link. + type: string + text: + description: A plain text description of the purpose of the link. + type: string + severity: + description: The severity of the event on the affected system. + type: string + enum: + - critical + - error + - info + - warning + default: info + source: + description: > + The affected system, such as a hostname or fully qualified domain name. + Defaults to the Kibana saved object id of the action. + type: string + summary: + description: A summery of the event. + type: string + maxLength: 1024 + timestamp: + description: An ISO-8601 timestamp that indicates when the event was detected or generated. + type: string + format: date-time \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_request.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_request.yaml index 7602693cebe50..13b0623a01ab8 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_request.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_request.yaml @@ -6,9 +6,11 @@ required: properties: params: oneOf: + - $ref: 'run_connector_params_acknowledge_resolve_pagerduty.yaml' - $ref: 'run_connector_params_documents.yaml' - $ref: 'run_connector_params_message_email.yaml' - $ref: 'run_connector_params_message_serverlog.yaml' + - $ref: 'run_connector_params_trigger_pagerduty.yaml' - title: Subaction parameters description: Test an action that involves a subaction. oneOf: diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_createalert.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_createalert.yaml index e739a9ed6c91d..a53560951361f 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_createalert.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_createalert.yaml @@ -30,7 +30,8 @@ properties: type: object description: The custom properties of the alert. additionalProperties: true - example: {"key1":"value1","key2":"value2"} + examples: + - {"key1":"value1","key2":"value2"} entity: type: string description: The domain of the alert. For example, the application or server name. diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_fieldsbyissuetype.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_fieldsbyissuetype.yaml index e8c8869e7d68b..6c39957c29fc4 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_fieldsbyissuetype.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_fieldsbyissuetype.yaml @@ -18,5 +18,6 @@ properties: id: type: string description: The Jira issue type identifier. - example: 10024 + examples: + - 10024 \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_getincident.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_getincident.yaml index 666c0257f68b8..7a16f3d9f8295 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_getincident.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_getincident.yaml @@ -18,4 +18,5 @@ properties: externalId: type: string description: The Jira, ServiceNow ITSM, or ServiceNow SecOps issue identifier. - example: 71778 + examples: + - 71778 diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_issue.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_issue.yaml index 56ee923b40063..3743e7fa90bd3 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_issue.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/run_connector_subaction_issue.yaml @@ -17,4 +17,5 @@ properties: id: type: string description: The Jira issue identifier. - example: 71778 \ No newline at end of file + examples: + - 71778 \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_cases_webhook.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_cases_webhook.yaml index 66250b31a94eb..9201a1b1e1d70 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_cases_webhook.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_cases_webhook.yaml @@ -9,6 +9,7 @@ properties: name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_cases_webhook.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_swimlane.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_swimlane.yaml index 81321351b74ec..771625841a042 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_swimlane.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request_swimlane.yaml @@ -10,6 +10,7 @@ properties: name: type: string description: The display name for the connector. - example: my-connector + examples: + - my-connector secrets: $ref: 'secrets_properties_swimlane.yaml' \ No newline at end of file diff --git a/x-pack/plugins/actions/docs/openapi/entrypoint.yaml b/x-pack/plugins/actions/docs/openapi/entrypoint.yaml index bdbf408de3e1a..d082d91a2a4e5 100644 --- a/x-pack/plugins/actions/docs/openapi/entrypoint.yaml +++ b/x-pack/plugins/actions/docs/openapi/entrypoint.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Connectors description: OpenAPI schema for Connectors endpoints - version: '0.1' + version: '0.2' contact: name: Connectors Team license: @@ -51,7 +51,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' security: - basicAuth: [] - apiKeyAuth: [] diff --git a/x-pack/plugins/actions/docs/openapi/entrypoint_serverless.yaml b/x-pack/plugins/actions/docs/openapi/entrypoint_serverless.yaml index 3503221c4e306..4780a65da6520 100644 --- a/x-pack/plugins/actions/docs/openapi/entrypoint_serverless.yaml +++ b/x-pack/plugins/actions/docs/openapi/entrypoint_serverless.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Connectors description: OpenAPI schema for connectors in Serverless projects - version: '0.1' + version: '0.2' contact: name: Connectors Team license: @@ -30,6 +30,7 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' security: - apiKeyAuth: [] diff --git a/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}.yaml b/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}.yaml index e4b8e1c468643..6464b9592436a 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}.yaml @@ -51,7 +51,8 @@ post: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 requestBody: required: true content: diff --git a/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}@_execute.yaml b/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}@_execute.yaml index 577a57fbb5d96..a276f30292daf 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}@_execute.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector@{connectorid}@_execute.yaml @@ -23,6 +23,8 @@ post: $ref: '../components/examples/run_index_connector_request.yaml' runJiraConnectorRequest: $ref: '../components/examples/run_jira_connector_request.yaml' + runPagerDutyConnectorRequest: + $ref: '../components/examples/run_pagerduty_connector_request.yaml' runServerLogConnectorRequest: $ref: '../components/examples/run_server_log_connector_request.yaml' runServiceNowITOMConnectorRequest: @@ -65,6 +67,8 @@ post: $ref: '../components/examples/run_index_connector_response.yaml' runJiraConnectorResponse: $ref: '../components/examples/run_jira_connector_response.yaml' + runPagerDutyConnectorResponse: + $ref: '../components/examples/run_pagerduty_connector_response.yaml' runServerLogConnectorResponse: $ref: '../components/examples/run_server_log_connector_response.yaml' runServiceNowITOMConnectorResponse: diff --git a/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector_types.yaml b/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector_types.yaml index 530fed05e3046..94dbb727eea4a 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector_types.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/api@actions@connector_types.yaml @@ -24,37 +24,41 @@ get: enabled: type: boolean description: Indicates whether the connector type is enabled in Kibana. - example: true + examples: + - true enabled_in_config: type: boolean description: Indicates whether the connector type is enabled in the Kibana configuration file. - example: true + examples: + - true enabled_in_license: type: boolean description: Indicates whether the connector is enabled in the license. - example: true + examples: + - true id: $ref: '../components/schemas/connector_types.yaml' is_system_action_type: type: boolean - example: false + examples: + - false minimum_license_required: type: string description: The license that is required to use the connector type. - example: basic + examples: + - basic name: type: string description: The name of the connector type. - example: Index + examples: + - Index supported_feature_ids: type: array description: The features that are supported by the connector type. items: $ref: '../components/schemas/features.yaml' - example: - - alerting - - cases - - siem + examples: + - [alerting, cases, siem] examples: getConnectorTypesServerlessResponse: $ref: '../components/examples/get_connector_types_generativeai_response.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml index 1d014404a643a..27351f0954eee 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector@{connectorid}.yaml @@ -59,7 +59,8 @@ post: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 requestBody: required: true content: diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector_types.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector_types.yaml index 86ef1cd5460f1..9a0fababdf166 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector_types.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@connector_types.yaml @@ -27,34 +27,37 @@ get: enabled: type: boolean description: Indicates whether the connector type is enabled in Kibana. - example: true + examples: + - true enabled_in_config: type: boolean description: Indicates whether the connector type is enabled in the Kibana `.yml` file. - example: true + examples: + - true enabled_in_license: type: boolean description: Indicates whether the connector is enabled in the license. - example: true + examples: + - true id: $ref: '../components/schemas/connector_types.yaml' minimum_license_required: type: string description: The license that is required to use the connector type. - example: basic + examples: + - basic name: type: string description: The name of the connector type. - example: Index + examples: + - Index supported_feature_ids: type: array description: The Kibana features that are supported by the connector type. items: $ref: '../components/schemas/features.yaml' - example: - - alerting - - uptime - - siem + examples: + - [alerting, uptime, siem] examples: getConnectorTypesResponse: $ref: '../components/examples/get_connector_types_response.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@list_action_types.yaml b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@list_action_types.yaml index edda7d4aca310..6bc2b9e5e53a8 100644 --- a/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@list_action_types.yaml +++ b/x-pack/plugins/actions/docs/openapi/paths/s@{spaceid}@api@actions@list_action_types.yaml @@ -28,7 +28,8 @@ get: enabledInLicense: type: boolean description: Indicates whether the connector is enabled in the license. - example: true + examples: + - true id: type: string description: The unique identifier for the connector type. diff --git a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts index 7c104177ea36e..866580e8e7b3b 100644 --- a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts +++ b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts @@ -42,6 +42,7 @@ export const getGenAiTokenTracking = async ({ try { const { total, prompt, completion } = await getTokenCountFromInvokeStream({ responseStream: result.data.pipe(new PassThrough()), + actionTypeId, body: (validatedParams as { subActionParams: InvokeBody }).subActionParams, logger, }); diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.test.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.test.ts index 3c0dd66130f3a..2d8f86b881728 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.test.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.test.ts @@ -7,20 +7,15 @@ import { Transform } from 'stream'; import { getTokenCountFromInvokeStream } from './get_token_count_from_invoke_stream'; import { loggerMock } from '@kbn/logging-mocks'; +import { EventStreamCodec } from '@smithy/eventstream-codec'; +import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; -interface StreamMock { - write: (data: string) => void; - fail: () => void; - complete: () => void; - transform: Transform; -} - -function createStreamMock(): StreamMock { +function createStreamMock() { const transform: Transform = new Transform({}); return { - write: (data: string) => { - transform.push(`${data}\n`); + write: (data: unknown) => { + transform.push(data); }, fail: () => { transform.emit('error', new Error('Stream failed')); @@ -34,7 +29,10 @@ function createStreamMock(): StreamMock { } const logger = loggerMock.create(); describe('getTokenCountFromInvokeStream', () => { - let stream: StreamMock; + beforeEach(() => { + jest.resetAllMocks(); + }); + let stream: ReturnType; const body = { messages: [ { @@ -48,36 +46,79 @@ describe('getTokenCountFromInvokeStream', () => { ], }; + const chunk = { + object: 'chat.completion.chunk', + choices: [ + { + delta: { + content: 'Single.', + }, + }, + ], + }; + const PROMPT_TOKEN_COUNT = 34; const COMPLETION_TOKEN_COUNT = 2; + describe('OpenAI stream', () => { + beforeEach(() => { + stream = createStreamMock(); + stream.write(`data: ${JSON.stringify(chunk)}`); + }); - beforeEach(() => { - stream = createStreamMock(); - stream.write('Single'); - }); - - describe('when a stream completes', () => { - beforeEach(async () => { + it('counts the prompt + completion tokens for OpenAI response', async () => { stream.complete(); - }); - it('counts the prompt tokens', async () => { const tokens = await getTokenCountFromInvokeStream({ responseStream: stream.transform, body, logger, + actionTypeId: '.gen-ai', }); expect(tokens.prompt).toBe(PROMPT_TOKEN_COUNT); expect(tokens.completion).toBe(COMPLETION_TOKEN_COUNT); expect(tokens.total).toBe(PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT); }); + it('resolves the promise with the correct prompt tokens', async () => { + const tokenPromise = getTokenCountFromInvokeStream({ + responseStream: stream.transform, + body, + logger, + actionTypeId: '.gen-ai', + }); + + stream.fail(); + + await expect(tokenPromise).resolves.toEqual({ + prompt: PROMPT_TOKEN_COUNT, + total: PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT, + completion: COMPLETION_TOKEN_COUNT, + }); + expect(logger.error).toHaveBeenCalled(); + }); }); + describe('Bedrock stream', () => { + beforeEach(() => { + stream = createStreamMock(); + stream.write(encodeBedrockResponse('Simple.')); + }); - describe('when a stream fails', () => { + it('counts the prompt + completion tokens for OpenAI response', async () => { + stream.complete(); + const tokens = await getTokenCountFromInvokeStream({ + responseStream: stream.transform, + body, + logger, + actionTypeId: '.bedrock', + }); + expect(tokens.prompt).toBe(PROMPT_TOKEN_COUNT); + expect(tokens.completion).toBe(COMPLETION_TOKEN_COUNT); + expect(tokens.total).toBe(PROMPT_TOKEN_COUNT + COMPLETION_TOKEN_COUNT); + }); it('resolves the promise with the correct prompt tokens', async () => { const tokenPromise = getTokenCountFromInvokeStream({ responseStream: stream.transform, body, logger, + actionTypeId: '.bedrock', }); stream.fail(); @@ -91,3 +132,16 @@ describe('getTokenCountFromInvokeStream', () => { }); }); }); + +function encodeBedrockResponse(completion: string) { + return new EventStreamCodec(toUtf8, fromUtf8).encode({ + headers: {}, + body: Uint8Array.from( + Buffer.from( + JSON.stringify({ + bytes: Buffer.from(JSON.stringify({ completion })).toString('base64'), + }) + ) + ), + }); +} diff --git a/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.ts b/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.ts index 594fec89d93c0..dfb4bae69f8cf 100644 --- a/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.ts +++ b/x-pack/plugins/actions/server/lib/get_token_count_from_invoke_stream.ts @@ -9,6 +9,8 @@ import { Logger } from '@kbn/logging'; import { encode } from 'gpt-tokenizer'; import { Readable } from 'stream'; import { finished } from 'stream/promises'; +import { EventStreamCodec } from '@smithy/eventstream-codec'; +import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; export interface InvokeBody { messages: Array<{ @@ -26,10 +28,12 @@ export interface InvokeBody { * @param logger the logger */ export async function getTokenCountFromInvokeStream({ + actionTypeId, responseStream, body, logger, }: { + actionTypeId: string; responseStream: Readable; body: InvokeBody; logger: Logger; @@ -47,9 +51,37 @@ export async function getTokenCountFromInvokeStream({ .join('\n') ).length; - let responseBody: string = ''; + const parser = actionTypeId === '.bedrock' ? parseBedrockStream : parseOpenAIStream; + const parsedResponse = await parser(responseStream, logger); + + const completionTokens = encode(parsedResponse).length; + return { + prompt: promptTokens, + completion: completionTokens, + total: promptTokens + completionTokens, + }; +} + +type StreamParser = (responseStream: Readable, logger: Logger) => Promise; - responseStream.on('data', (chunk: string) => { +const parseBedrockStream: StreamParser = async (responseStream, logger) => { + const responseBuffer: Uint8Array[] = []; + responseStream.on('data', (chunk) => { + // special encoding for bedrock, do not attempt to convert to string + responseBuffer.push(chunk); + }); + try { + await finished(responseStream); + } catch (e) { + logger.error('An error occurred while calculating streaming response tokens'); + } + return parseBedrockBuffer(responseBuffer); +}; + +const parseOpenAIStream: StreamParser = async (responseStream, logger) => { + let responseBody: string = ''; + responseStream.on('data', (chunk) => { + // no special encoding, can safely use toString and append to responseBody responseBody += chunk.toString(); }); try { @@ -57,12 +89,109 @@ export async function getTokenCountFromInvokeStream({ } catch (e) { logger.error('An error occurred while calculating streaming response tokens'); } + return parseOpenAIResponse(responseBody); +}; - const completionTokens = encode(responseBody).length; +/** + * Parses a Bedrock buffer from an array of chunks. + * + * @param {Uint8Array[]} chunks - Array of Uint8Array chunks to be parsed. + * @returns {string} - Parsed string from the Bedrock buffer. + */ +const parseBedrockBuffer = (chunks: Uint8Array[]): string => { + // Initialize an empty Uint8Array to store the concatenated buffer. + let bedrockBuffer: Uint8Array = new Uint8Array(0); - return { - prompt: promptTokens, - completion: completionTokens, - total: promptTokens + completionTokens, - }; + // Map through each chunk to process the Bedrock buffer. + return chunks + .map((chunk) => { + // Concatenate the current chunk to the existing buffer. + bedrockBuffer = concatChunks(bedrockBuffer, chunk); + // Get the length of the next message in the buffer. + let messageLength = getMessageLength(bedrockBuffer); + // Initialize an array to store fully formed message chunks. + const buildChunks = []; + // Process the buffer until no complete messages are left. + while (bedrockBuffer.byteLength > 0 && bedrockBuffer.byteLength >= messageLength) { + // Extract a chunk of the specified length from the buffer. + const extractedChunk = bedrockBuffer.slice(0, messageLength); + // Add the extracted chunk to the array of fully formed message chunks. + buildChunks.push(extractedChunk); + // Remove the processed chunk from the buffer. + bedrockBuffer = bedrockBuffer.slice(messageLength); + // Get the length of the next message in the updated buffer. + messageLength = getMessageLength(bedrockBuffer); + } + + const awsDecoder = new EventStreamCodec(toUtf8, fromUtf8); + + // Decode and parse each message chunk, extracting the 'completion' property. + return buildChunks + .map((bChunk) => { + const event = awsDecoder.decode(bChunk); + const body = JSON.parse( + Buffer.from(JSON.parse(new TextDecoder().decode(event.body)).bytes, 'base64').toString() + ); + return body.completion; + }) + .join(''); + }) + .join(''); +}; + +/** + * Concatenates two Uint8Array buffers. + * + * @param {Uint8Array} a - First buffer. + * @param {Uint8Array} b - Second buffer. + * @returns {Uint8Array} - Concatenated buffer. + */ +function concatChunks(a: Uint8Array, b: Uint8Array): Uint8Array { + const newBuffer = new Uint8Array(a.length + b.length); + // Copy the contents of the first buffer to the new buffer. + newBuffer.set(a); + // Copy the contents of the second buffer to the new buffer starting from the end of the first buffer. + newBuffer.set(b, a.length); + return newBuffer; +} + +/** + * Gets the length of the next message from the buffer. + * + * @param {Uint8Array} buffer - Buffer containing the message. + * @returns {number} - Length of the next message. + */ +function getMessageLength(buffer: Uint8Array): number { + // If the buffer is empty, return 0. + if (buffer.byteLength === 0) return 0; + // Create a DataView to read the Uint32 value at the beginning of the buffer. + const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength); + // Read and return the Uint32 value (message length). + return view.getUint32(0, false); } + +const parseOpenAIResponse = (responseBody: string) => + responseBody + .split('\n') + .filter((line) => { + return line.startsWith('data: ') && !line.endsWith('[DONE]'); + }) + .map((line) => { + return JSON.parse(line.replace('data: ', '')); + }) + .filter( + ( + line + ): line is { + choices: Array<{ + delta: { content?: string; function_call?: { name?: string; arguments: string } }; + }>; + } => { + return 'object' in line && line.object === 'chat.completion.chunk'; + } + ) + .reduce((prev, line) => { + const msg = line.choices[0].delta!; + prev += msg.content || ''; + return prev; + }, ''); diff --git a/x-pack/plugins/aiops/public/application/utils/url_state.ts b/x-pack/plugins/aiops/public/application/url_state/common.ts similarity index 71% rename from x-pack/plugins/aiops/public/application/utils/url_state.ts rename to x-pack/plugins/aiops/public/application/url_state/common.ts index 22a32a3d610ed..8ca9ec848150c 100644 --- a/x-pack/plugins/aiops/public/application/utils/url_state.ts +++ b/x-pack/plugins/aiops/public/application/url_state/common.ts @@ -38,21 +38,3 @@ export const getDefaultAiOpsListState = ( filters: [], ...overrides, }); - -export interface LogCategorizationPageUrlState { - pageKey: 'logCategorization'; - pageUrlState: LogCategorizationAppState; -} - -export interface LogCategorizationAppState extends AiOpsFullIndexBasedAppState { - field: string | undefined; -} - -export const getDefaultLogCategorizationAppState = ( - overrides?: Partial -): LogCategorizationAppState => { - return { - field: undefined, - ...getDefaultAiOpsListState(overrides), - }; -}; diff --git a/x-pack/plugins/aiops/public/application/url_state/log_pattern_analysis.ts b/x-pack/plugins/aiops/public/application/url_state/log_pattern_analysis.ts new file mode 100644 index 0000000000000..7ea9e1a398e40 --- /dev/null +++ b/x-pack/plugins/aiops/public/application/url_state/log_pattern_analysis.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getDefaultAiOpsListState, type AiOpsFullIndexBasedAppState } from './common'; + +export interface LogCategorizationPageUrlState { + pageKey: 'logCategorization'; + pageUrlState: LogCategorizationAppState; +} + +export interface LogCategorizationAppState extends AiOpsFullIndexBasedAppState { + field: string | undefined; +} + +export const getDefaultLogCategorizationAppState = ( + overrides?: Partial +): LogCategorizationAppState => { + return { + field: undefined, + ...getDefaultAiOpsListState(overrides), + }; +}; diff --git a/x-pack/plugins/aiops/public/application/url_state/log_rate_analysis.ts b/x-pack/plugins/aiops/public/application/url_state/log_rate_analysis.ts new file mode 100644 index 0000000000000..f7691bc2b9d79 --- /dev/null +++ b/x-pack/plugins/aiops/public/application/url_state/log_rate_analysis.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { WindowParameters } from '@kbn/aiops-utils'; + +import { getDefaultAiOpsListState, type AiOpsFullIndexBasedAppState } from './common'; + +export interface LogRateAnalysisPageUrlState { + pageKey: 'logRateAnalysis'; + pageUrlState: LogRateAnalysisAppState; +} +/** + * To avoid long urls, we store the window parameters in the url state not with + * their full parameters names but with abbrevations. `windowParametersToAppState` and + * `appStateToWindowParameters` are used to transform the data structure. + */ +export interface LogRateAnalysisAppState extends AiOpsFullIndexBasedAppState { + /** Window parameters */ + wp?: { + /** Baseline minimum value */ + bMin: number; + /** Baseline maximum value */ + bMax: number; + /** Deviation minimum value */ + dMin: number; + /** Deviation maximum value */ + dMax: number; + }; +} + +/** + * Transforms a full window parameters object to the abbreviated url state version. + */ +export const windowParametersToAppState = (wp?: WindowParameters): LogRateAnalysisAppState['wp'] => + wp && { + bMin: wp.baselineMin, + bMax: wp.baselineMax, + dMin: wp.deviationMin, + dMax: wp.deviationMax, + }; + +/** + * Transforms an abbreviated url state version of window parameters to its full version. + */ +export const appStateToWindowParameters = ( + wp: LogRateAnalysisAppState['wp'] +): WindowParameters | undefined => + wp && { + baselineMin: wp.bMin, + baselineMax: wp.bMax, + deviationMin: wp.dMin, + deviationMax: wp.dMax, + }; + +export const getDefaultLogRateAnalysisAppState = ( + overrides?: Partial +): LogRateAnalysisAppState => { + return { + wp: undefined, + ...getDefaultAiOpsListState(overrides), + }; +}; diff --git a/x-pack/plugins/aiops/public/components/log_categorization/categorize_field_actions.ts b/x-pack/plugins/aiops/public/components/log_categorization/categorize_field_actions.ts index 4d03465605463..761948ab8c4fd 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/categorize_field_actions.ts +++ b/x-pack/plugins/aiops/public/components/log_categorization/categorize_field_actions.ts @@ -6,22 +6,19 @@ */ import { i18n } from '@kbn/i18n'; -import { - createAction, - ACTION_CATEGORIZE_FIELD, - type CategorizeFieldContext, -} from '@kbn/ui-actions-plugin/public'; +import { createAction } from '@kbn/ui-actions-plugin/public'; import type { CoreStart } from '@kbn/core/public'; +import { ACTION_CATEGORIZE_FIELD, type CategorizeFieldContext } from '@kbn/ml-ui-actions'; import { AiopsPluginStartDeps } from '../../types'; import { showCategorizeFlyout } from './show_flyout'; -export const categorizeFieldAction = (coreStart: CoreStart, plugins: AiopsPluginStartDeps) => +export const createCategorizeFieldAction = (coreStart: CoreStart, plugins: AiopsPluginStartDeps) => createAction({ type: ACTION_CATEGORIZE_FIELD, id: ACTION_CATEGORIZE_FIELD, getDisplayName: () => i18n.translate('xpack.aiops.categorizeFieldAction.displayName', { - defaultMessage: 'Categorize field', + defaultMessage: 'Pattern analysis', }), isCompatible: async ({ field }: CategorizeFieldContext) => { return field.esTypes?.includes('text') === true; diff --git a/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx b/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx index 3796af67f8cd2..05cca08d22227 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/category_table/category_table.tsx @@ -30,7 +30,7 @@ import type { } from '../../../../common/api/log_categorization/types'; import { useEuiTheme } from '../../../hooks/use_eui_theme'; -import type { LogCategorizationAppState } from '../../../application/utils/url_state'; +import type { LogCategorizationAppState } from '../../../application/url_state/log_pattern_analysis'; import { MiniHistogram } from '../../mini_histogram'; diff --git a/x-pack/plugins/aiops/public/components/log_categorization/create_categorization_job.tsx b/x-pack/plugins/aiops/public/components/log_categorization/create_categorization_job.tsx new file mode 100644 index 0000000000000..66458c511d981 --- /dev/null +++ b/x-pack/plugins/aiops/public/components/log_categorization/create_categorization_job.tsx @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; + +import moment from 'moment'; +import { EuiButtonEmpty } from '@elastic/eui'; +import type { DataViewField, DataView } from '@kbn/data-views-plugin/common'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { + CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER, + type CreateCategorizationADJobContext, +} from '@kbn/ml-ui-actions'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; + +interface Props { + dataView: DataView; + field: DataViewField; + query: QueryDslQueryContainer; + earliest: number | undefined; + latest: number | undefined; +} + +export const CreateCategorizationJobButton: FC = ({ + dataView, + field, + query, + earliest, + latest, +}) => { + const { + uiActions, + application: { capabilities }, + } = useAiopsAppContext(); + + const createADJob = () => { + if (uiActions === undefined) { + return; + } + + const triggerOptions: CreateCategorizationADJobContext = { + dataView, + field, + query, + timeRange: { from: moment(earliest).toISOString(), to: moment(latest).toISOString() }, + }; + uiActions.getTrigger(CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER).exec(triggerOptions); + }; + + if (uiActions === undefined || capabilities.ml.canCreateJob === false) { + return null; + } + + return ( + <> + + + + + ); +}; diff --git a/x-pack/plugins/aiops/public/components/log_categorization/index.ts b/x-pack/plugins/aiops/public/components/log_categorization/index.ts index 550add8802747..ace01d4f03389 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/index.ts +++ b/x-pack/plugins/aiops/public/components/log_categorization/index.ts @@ -7,7 +7,7 @@ export type { LogCategorizationAppStateProps } from './log_categorization_app_state'; import { LogCategorizationAppState } from './log_categorization_app_state'; -export { categorizeFieldAction } from './categorize_field_actions'; +export { createCategorizeFieldAction } from './categorize_field_actions'; // required for dynamic import using React.lazy() // eslint-disable-next-line import/no-default-export diff --git a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx index a5262393e0eec..1f3eda09132eb 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_for_flyout.tsx @@ -29,7 +29,7 @@ import type { Category, SparkLinesPerCategory } from '../../../common/api/log_ca import { type LogCategorizationPageUrlState, getDefaultLogCategorizationAppState, -} from '../../application/utils/url_state'; +} from '../../application/url_state/log_pattern_analysis'; import { createMergedEsQuery } from '../../application/utils/search_utils'; import { useData } from '../../hooks/use_data'; import { useSearch } from '../../hooks/use_search'; @@ -44,6 +44,7 @@ import { TechnicalPreviewBadge } from './technical_preview_badge'; import { LoadingCategorization } from './loading_categorization'; import { useValidateFieldRequest } from './use_validate_category_field'; import { FieldValidationCallout } from './category_validation_callout'; +import { CreateCategorizationJobButton } from './create_categorization_job'; export interface LogCategorizationPageProps { dataView: DataView; @@ -261,17 +262,21 @@ export const LogCategorizationFlyout: FC = ({ + - {loading === true ? : null} - - {loading === false && data !== null && data.categories.length > 0 ? ( void; + /** Optional callback that exposes current window parameters */ + onWindowParametersChange?: (wp?: WindowParameters) => void; /** Identifier to indicate the plugin utilizing the component */ embeddingOrigin: string; } @@ -90,6 +92,7 @@ export const LogRateAnalysisContent: FC = ({ barColorOverride, barHighlightColorOverride, onAnalysisCompleted, + onWindowParametersChange, embeddingOrigin, }) => { const [windowParameters, setWindowParameters] = useState(); @@ -105,6 +108,28 @@ export const LogRateAnalysisContent: FC = ({ setIsBrushCleared(windowParameters === undefined); }, [windowParameters]); + // Window parameters stored in the url state use this components + // `initialAnalysisStart` prop to set the initial params restore from url state. + // To avoid a loop with window parameters being passed around on load, + // the following ref and useEffect are used to check wether it's safe to call + // the `onWindowParametersChange` callback. + const windowParametersTouched = useRef(false); + useEffect(() => { + // Don't continue if window parameters were not touched yet. + // Because they can be reset to `undefined` at a later stage again when a user + // clears the selections, we cannot rely solely on checking if they are + // `undefined`, we need the additional ref to update on the first change. + if (!windowParametersTouched.current && windowParameters === undefined) { + return; + } + + windowParametersTouched.current = true; + + if (onWindowParametersChange) { + onWindowParametersChange(windowParameters); + } + }, [onWindowParametersChange, windowParameters]); + // Checks if `esSearchQuery` is the default empty query passed on from the search bar // and if that's the case fall back to a simpler match all query. const searchQuery = useMemo( diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_page.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_page.tsx index b3c9f256fb2ea..4931503b7366e 100644 --- a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_page.tsx +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_page.tsx @@ -6,22 +6,26 @@ */ import React, { useCallback, useEffect, useState, FC } from 'react'; +import { isEqual } from 'lodash'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { EuiFlexGroup, EuiFlexItem, EuiPageBody, EuiPageSection, EuiSpacer } from '@elastic/eui'; import { Filter, FilterStateStore, Query } from '@kbn/es-query'; import { useUrlState, usePageUrlState } from '@kbn/ml-url-state'; - import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; +import type { WindowParameters } from '@kbn/aiops-utils'; + import { useDataSource } from '../../hooks/use_data_source'; import { useAiopsAppContext } from '../../hooks/use_aiops_app_context'; import { useData } from '../../hooks/use_data'; import { useSearch } from '../../hooks/use_search'; import { - getDefaultAiOpsListState, - type AiOpsPageUrlState, -} from '../../application/utils/url_state'; + getDefaultLogRateAnalysisAppState, + appStateToWindowParameters, + windowParametersToAppState, + type LogRateAnalysisPageUrlState, +} from '../../application/url_state/log_rate_analysis'; import { AIOPS_TELEMETRY_ID } from '../../../common/constants'; import { SearchPanel } from '../search_panel'; @@ -40,9 +44,9 @@ export const LogRateAnalysisPage: FC = ({ stickyHistogram }) => { const { currentSelectedSignificantItem, currentSelectedGroup } = useLogRateAnalysisResultsTableRowContext(); - const [aiopsListState, setAiopsListState] = usePageUrlState( - 'AIOPS_INDEX_VIEWER', - getDefaultAiOpsListState() + const [stateFromUrl, setUrlState] = usePageUrlState( + 'logRateAnalysis', + getDefaultLogRateAnalysisAppState() ); const [globalState, setGlobalState] = useUrlState('_g'); @@ -67,20 +71,20 @@ export const LogRateAnalysisPage: FC = ({ stickyHistogram }) => { setSelectedSavedSearch(null); } - setAiopsListState({ - ...aiopsListState, + setUrlState({ + ...stateFromUrl, searchQuery: searchParams.searchQuery, searchString: searchParams.searchString, searchQueryLanguage: searchParams.queryLanguage, filters: searchParams.filters, }); }, - [selectedSavedSearch, aiopsListState, setAiopsListState] + [selectedSavedSearch, stateFromUrl, setUrlState] ); const { searchQueryLanguage, searchString, searchQuery } = useSearch( { dataView, savedSearch }, - aiopsListState + stateFromUrl ); const { timefilter } = useData( @@ -132,6 +136,14 @@ export const LogRateAnalysisPage: FC = ({ stickyHistogram }) => { }); }, [dataService, searchQueryLanguage, searchString]); + const onWindowParametersHandler = (wp?: WindowParameters) => { + if (!isEqual(wp, stateFromUrl.wp)) { + setUrlState({ + wp: windowParametersToAppState(wp), + }); + } + }; + return ( @@ -148,11 +160,13 @@ export const LogRateAnalysisPage: FC = ({ stickyHistogram }) => { /> diff --git a/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts b/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts index 5714ae5283fb2..c1903f6bba8ab 100644 --- a/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts +++ b/x-pack/plugins/aiops/public/hooks/use_aiops_app_context.ts @@ -33,6 +33,7 @@ import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/ import type { EmbeddableStart } from '@kbn/embeddable-plugin/public'; import type { CasesUiStart } from '@kbn/cases-plugin/public'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; +import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; /** * AIOps App Dependencies to be provided via React context. @@ -97,6 +98,10 @@ export interface AiopsAppDependencies { * Used to create lens embeddables. */ lens: LensPublicStart; + /** + * UI actions. + */ + uiActions?: UiActionsStart; /** * Internationalisation service */ diff --git a/x-pack/plugins/aiops/public/hooks/use_search.ts b/x-pack/plugins/aiops/public/hooks/use_search.ts index 609beb6774bc9..8c62db36289fd 100644 --- a/x-pack/plugins/aiops/public/hooks/use_search.ts +++ b/x-pack/plugins/aiops/public/hooks/use_search.ts @@ -11,7 +11,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { getEsQueryFromSavedSearch } from '../application/utils/search_utils'; -import type { AiOpsIndexBasedAppState } from '../application/utils/url_state'; +import type { AiOpsIndexBasedAppState } from '../application/url_state/common'; import { useAiopsAppContext } from './use_aiops_app_context'; export const useSearch = ( diff --git a/x-pack/plugins/aiops/public/plugin.tsx b/x-pack/plugins/aiops/public/plugin.tsx index c896ccc7d5b3e..12a7f659135ae 100755 --- a/x-pack/plugins/aiops/public/plugin.tsx +++ b/x-pack/plugins/aiops/public/plugin.tsx @@ -25,49 +25,38 @@ export class AiopsPlugin core: AiopsCoreSetup, { embeddable, cases, licensing, uiActions }: AiopsPluginSetupDeps ) { - firstValueFrom(licensing.license$).then(async (license) => { - if (license.hasAtLeast('platinum')) { - if (embeddable) { - const { registerEmbeddable } = await import('./embeddable/register_embeddable'); - registerEmbeddable(core, embeddable); - } + Promise.all([ + firstValueFrom(licensing.license$), + import('./embeddable/register_embeddable'), + import('./ui_actions'), + import('./cases/register_change_point_charts_attachment'), + core.getStartServices(), + ]).then( + ([ + license, + { registerEmbeddable }, + { registerAiopsUiActions }, + { registerChangePointChartsAttachment }, + [coreStart, pluginStart], + ]) => { + if (license.hasAtLeast('platinum')) { + if (embeddable) { + registerEmbeddable(core, embeddable); + } - if (uiActions) { - const { registerAiopsUiActions } = await import('./ui_actions'); - registerAiopsUiActions(uiActions, core); - } + if (uiActions) { + registerAiopsUiActions(uiActions, coreStart, pluginStart); + } - if (cases) { - const [coreStart, pluginStart] = await core.getStartServices(); - const { registerChangePointChartsAttachment } = await import( - './cases/register_change_point_charts_attachment' - ); - registerChangePointChartsAttachment(cases, coreStart, pluginStart); + if (cases) { + registerChangePointChartsAttachment(cases, coreStart, pluginStart); + } } } - }); + ); } public start(core: CoreStart, plugins: AiopsPluginStartDeps): AiopsPluginStart { - // importing async to keep the aiops plugin size to a minimum - Promise.all([ - import('@kbn/ui-actions-plugin/public'), - import('./components/log_categorization'), - firstValueFrom(plugins.licensing.license$), - ]).then(([uiActionsImports, { categorizeFieldAction }, license]) => { - if (license.hasAtLeast('platinum')) { - const { ACTION_CATEGORIZE_FIELD, CATEGORIZE_FIELD_TRIGGER } = uiActionsImports; - if (plugins.uiActions.hasAction(ACTION_CATEGORIZE_FIELD)) { - plugins.uiActions.unregisterAction(ACTION_CATEGORIZE_FIELD); - } - - plugins.uiActions.addTriggerAction( - CATEGORIZE_FIELD_TRIGGER, - categorizeFieldAction(core, plugins) - ); - } - }); - return { EmbeddableChangePointChart: getEmbeddableChangePointChart(core, plugins), }; diff --git a/x-pack/plugins/aiops/public/ui_actions/edit_change_point_charts_panel.tsx b/x-pack/plugins/aiops/public/ui_actions/edit_change_point_charts_panel.tsx index ae50937921f33..d9401f6064cbf 100644 --- a/x-pack/plugins/aiops/public/ui_actions/edit_change_point_charts_panel.tsx +++ b/x-pack/plugins/aiops/public/ui_actions/edit_change_point_charts_panel.tsx @@ -8,14 +8,16 @@ import type { UiActionsActionDefinition } from '@kbn/ui-actions-plugin/public'; import { i18n } from '@kbn/i18n'; import { ViewMode } from '@kbn/embeddable-plugin/common'; +import type { CoreStart } from '@kbn/core/public'; import { EMBEDDABLE_CHANGE_POINT_CHART_TYPE } from '../../common/constants'; import type { EditChangePointChartsPanelContext } from '../embeddable/types'; -import type { AiopsCoreSetup } from '../plugin'; +import type { AiopsPluginStartDeps } from '../types'; export const EDIT_CHANGE_POINT_CHARTS_ACTION = 'editChangePointChartsPanelAction'; export function createEditChangePointChartsPanelAction( - getStartServices: AiopsCoreSetup['getStartServices'] + coreStart: CoreStart, + pluginStart: AiopsPluginStartDeps ): UiActionsActionDefinition { return { id: 'edit-change-point-charts', @@ -32,8 +34,6 @@ export function createEditChangePointChartsPanelAction( throw new Error('Not possible to execute an action without the embeddable context'); } - const [coreStart, pluginStart] = await getStartServices(); - try { const { resolveEmbeddableChangePointUserInput } = await import( '../embeddable/handle_explicit_input' diff --git a/x-pack/plugins/aiops/public/ui_actions/index.ts b/x-pack/plugins/aiops/public/ui_actions/index.ts index cd00842c662c8..14e1879027fff 100644 --- a/x-pack/plugins/aiops/public/ui_actions/index.ts +++ b/x-pack/plugins/aiops/public/ui_actions/index.ts @@ -7,16 +7,33 @@ import type { UiActionsSetup } from '@kbn/ui-actions-plugin/public'; import { CONTEXT_MENU_TRIGGER } from '@kbn/embeddable-plugin/public'; +import { + categorizeFieldTrigger, + CATEGORIZE_FIELD_TRIGGER, +} from '@kbn/ml-ui-actions/src/aiops/ui_actions'; + +import type { CoreStart } from '@kbn/core/public'; +import type { AiopsPluginStartDeps } from '../types'; import { createEditChangePointChartsPanelAction } from './edit_change_point_charts_panel'; -import type { AiopsCoreSetup } from '../plugin'; +import { createCategorizeFieldAction } from '../components/log_categorization'; -export function registerAiopsUiActions(uiActions: UiActionsSetup, core: AiopsCoreSetup) { +export function registerAiopsUiActions( + uiActions: UiActionsSetup, + coreStart: CoreStart, + pluginStart: AiopsPluginStartDeps +) { // Initialize actions const editChangePointChartPanelAction = createEditChangePointChartsPanelAction( - core.getStartServices + coreStart, + pluginStart + ); + // // Register actions and triggers + uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, editChangePointChartPanelAction); + + uiActions.registerTrigger(categorizeFieldTrigger); + + uiActions.addTriggerAction( + CATEGORIZE_FIELD_TRIGGER, + createCategorizeFieldAction(coreStart, pluginStart) ); - // Register actions - uiActions.registerAction(editChangePointChartPanelAction); - // Assign and register triggers - uiActions.attachAction(CONTEXT_MENU_TRIGGER, editChangePointChartPanelAction.id); } diff --git a/x-pack/plugins/aiops/tsconfig.json b/x-pack/plugins/aiops/tsconfig.json index 31d68a5a4ab0f..4e2e4bfc8a19f 100644 --- a/x-pack/plugins/aiops/tsconfig.json +++ b/x-pack/plugins/aiops/tsconfig.json @@ -65,6 +65,7 @@ "@kbn/ml-chi2test", "@kbn/usage-collection-plugin", "@kbn/analytics", + "@kbn/ml-ui-actions", "@kbn/core-http-server", ], "exclude": [ diff --git a/x-pack/plugins/alerting/server/constants/plugin.ts b/x-pack/plugins/alerting/common/constants/plugin.ts similarity index 90% rename from x-pack/plugins/alerting/server/constants/plugin.ts rename to x-pack/plugins/alerting/common/constants/plugin.ts index 05fd33ebf8dd3..e8136f257d465 100644 --- a/x-pack/plugins/alerting/server/constants/plugin.ts +++ b/x-pack/plugins/alerting/common/constants/plugin.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { LicenseType } from '@kbn/licensing-plugin/server'; +import type { LicenseType } from '@kbn/licensing-plugin/server'; export const PLUGIN = { ID: 'alerting', diff --git a/x-pack/plugins/alerting/common/maintenance_window.ts b/x-pack/plugins/alerting/common/maintenance_window.ts index 1f5bffea77081..8b7646670cc76 100644 --- a/x-pack/plugins/alerting/common/maintenance_window.ts +++ b/x-pack/plugins/alerting/common/maintenance_window.ts @@ -14,6 +14,13 @@ export enum MaintenanceWindowStatus { Archived = 'archived', } +export const filterStateStore = { + APP_STATE: 'appState', + GLOBAL_STATE: 'globalState', +} as const; + +export type FilterStateStore = typeof filterStateStore[keyof typeof filterStateStore]; + export interface MaintenanceWindowModificationMetadata { createdBy: string | null; updatedBy: string | null; @@ -26,6 +33,23 @@ export interface DateRange { lte: string; } +export interface ScopeQueryFilter { + query?: Record; + meta: Record; + $state?: { + store: FilterStateStore; + }; +} + +export interface ScopedQueryAttributes { + kql: string; + filters: ScopeQueryFilter[]; + dsl?: string; +} + +/** + * @deprecated Use the data/maintenance_window types instead + */ export interface MaintenanceWindowSOProperties { title: string; enabled: boolean; @@ -34,11 +58,18 @@ export interface MaintenanceWindowSOProperties { events: DateRange[]; rRule: RRuleParams; categoryIds?: string[] | null; + scopedQuery?: ScopedQueryAttributes | null; } +/** + * @deprecated Use the data/maintenance_window types instead + */ export type MaintenanceWindowSOAttributes = MaintenanceWindowSOProperties & MaintenanceWindowModificationMetadata; +/** + * @deprecated Use the application/maintenance_window types instead + */ export type MaintenanceWindow = MaintenanceWindowSOAttributes & { status: MaintenanceWindowStatus; eventStartTime: string | null; diff --git a/x-pack/plugins/alerting/common/routes/alerts_filter_query/constants/latest.ts b/x-pack/plugins/alerting/common/routes/alerts_filter_query/constants/latest.ts new file mode 100644 index 0000000000000..6c32b4867cc0d --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/alerts_filter_query/constants/latest.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { filterStateStore } from './v1'; +export type { FilterStateStore } from './v1'; diff --git a/x-pack/plugins/alerting/common/routes/alerts_filter_query/constants/v1.ts b/x-pack/plugins/alerting/common/routes/alerts_filter_query/constants/v1.ts new file mode 100644 index 0000000000000..bce6890c22f2c --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/alerts_filter_query/constants/v1.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const filterStateStore = { + APP_STATE: 'appState', + GLOBAL_STATE: 'globalState', +} as const; + +export type FilterStateStore = typeof filterStateStore[keyof typeof filterStateStore]; diff --git a/x-pack/plugins/alerting/common/routes/alerts_filter_query/index.ts b/x-pack/plugins/alerting/common/routes/alerts_filter_query/index.ts new file mode 100644 index 0000000000000..093299dbe66f2 --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/alerts_filter_query/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { filterStateStore } from './constants/latest'; +export type { FilterStateStore } from './constants/latest'; +export { alertsFilterQuerySchema } from './schemas/latest'; + +export { filterStateStore as filterStateStoreV1 } from './constants/v1'; +export type { FilterStateStore as FilterStateStoreV1 } from './constants/v1'; +export { alertsFilterQuerySchema as alertsFilterQuerySchemaV1 } from './schemas/v1'; diff --git a/x-pack/plugins/alerting/common/routes/alerts_filter_query/schemas/latest.ts b/x-pack/plugins/alerting/common/routes/alerts_filter_query/schemas/latest.ts new file mode 100644 index 0000000000000..b9ae85bd590cf --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/alerts_filter_query/schemas/latest.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 { alertsFilterQuerySchema } from './v1'; diff --git a/x-pack/plugins/alerting/common/routes/alerts_filter_query/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/alerts_filter_query/schemas/v1.ts new file mode 100644 index 0000000000000..08614efb96b70 --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/alerts_filter_query/schemas/v1.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 { schema } from '@kbn/config-schema'; +import { filterStateStore } from '..'; + +export const alertsFilterQuerySchema = schema.object({ + kql: schema.string(), + filters: schema.arrayOf( + schema.object({ + query: schema.maybe(schema.recordOf(schema.string(), schema.any())), + meta: schema.recordOf(schema.string(), schema.any()), + $state: schema.maybe( + schema.object({ + store: schema.oneOf([ + schema.literal(filterStateStore.APP_STATE), + schema.literal(filterStateStore.GLOBAL_STATE), + ]), + }) + ), + }) + ), + dsl: schema.maybe(schema.string()), +}); diff --git a/x-pack/plugins/alerting/common/routes/maintenance_window/apis/create/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/maintenance_window/apis/create/schemas/v1.ts index f10eb420963ed..a715bd13f2f75 100644 --- a/x-pack/plugins/alerting/common/routes/maintenance_window/apis/create/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/maintenance_window/apis/create/schemas/v1.ts @@ -8,10 +8,12 @@ import { schema } from '@kbn/config-schema'; import { maintenanceWindowCategoryIdsSchemaV1 } from '../../../shared'; import { rRuleRequestSchemaV1 } from '../../../../r_rule'; +import { alertsFilterQuerySchemaV1 } from '../../../../alerts_filter_query'; export const createBodySchema = schema.object({ title: schema.string(), duration: schema.number(), r_rule: rRuleRequestSchemaV1, category_ids: maintenanceWindowCategoryIdsSchemaV1, + scoped_query: schema.maybe(schema.nullable(alertsFilterQuerySchemaV1)), }); diff --git a/x-pack/plugins/alerting/common/routes/maintenance_window/apis/update/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/maintenance_window/apis/update/schemas/v1.ts index 970cd34424576..ac61048d760a1 100644 --- a/x-pack/plugins/alerting/common/routes/maintenance_window/apis/update/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/maintenance_window/apis/update/schemas/v1.ts @@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema'; import { maintenanceWindowCategoryIdsSchemaV1 } from '../../../shared'; import { rRuleRequestSchemaV1 } from '../../../../r_rule'; +import { alertsFilterQuerySchemaV1 } from '../../../../alerts_filter_query'; export const updateParamsSchema = schema.object({ id: schema.string(), @@ -19,4 +20,5 @@ export const updateBodySchema = schema.object({ duration: schema.maybe(schema.number()), r_rule: schema.maybe(rRuleRequestSchemaV1), category_ids: maintenanceWindowCategoryIdsSchemaV1, + scoped_query: schema.maybe(schema.nullable(alertsFilterQuerySchemaV1)), }); diff --git a/x-pack/plugins/alerting/common/routes/maintenance_window/response/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/maintenance_window/response/schemas/v1.ts index 410a1dc1e439d..648b2b806978f 100644 --- a/x-pack/plugins/alerting/common/routes/maintenance_window/response/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/maintenance_window/response/schemas/v1.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { maintenanceWindowStatusV1 } from '..'; import { maintenanceWindowCategoryIdsSchemaV1 } from '../../shared'; import { rRuleResponseSchemaV1 } from '../../../r_rule'; +import { alertsFilterQuerySchemaV1 } from '../../../alerts_filter_query'; export const maintenanceWindowEventSchema = schema.object({ gte: schema.string(), @@ -36,4 +37,5 @@ export const maintenanceWindowResponseSchema = schema.object({ schema.literal(maintenanceWindowStatusV1.ARCHIVED), ]), category_ids: maintenanceWindowCategoryIdsSchemaV1, + scoped_query: schema.maybe(schema.nullable(alertsFilterQuerySchemaV1)), }); diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts index 751f2e8c38780..30a294d5c0527 100644 --- a/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/rule/apis/create/schemas/v1.ts @@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema'; import { validateDurationV1, validateHoursV1, validateTimezoneV1 } from '../../../validation'; import { notifyWhenSchemaV1 } from '../../../response'; -import { filterStateStore } from '../../../common/constants/v1'; +import { alertsFilterQuerySchemaV1 } from '../../../../alerts_filter_query'; export const actionFrequencySchema = schema.object({ summary: schema.boolean(), @@ -17,26 +17,7 @@ export const actionFrequencySchema = schema.object({ }); export const actionAlertsFilterSchema = schema.object({ - query: schema.maybe( - schema.object({ - kql: schema.string(), - filters: schema.arrayOf( - schema.object({ - query: schema.maybe(schema.recordOf(schema.string(), schema.any())), - meta: schema.recordOf(schema.string(), schema.any()), - $state: schema.maybe( - schema.object({ - store: schema.oneOf([ - schema.literal(filterStateStore.APP_STATE), - schema.literal(filterStateStore.GLOBAL_STATE), - ]), - }) - ), - }) - ), - dsl: schema.maybe(schema.string()), - }) - ), + query: schema.maybe(alertsFilterQuerySchemaV1), timeframe: schema.maybe( schema.object({ days: schema.arrayOf( diff --git a/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts index 0e043aa217667..1c7b202f59060 100644 --- a/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts @@ -7,13 +7,13 @@ import { schema } from '@kbn/config-schema'; import { rRuleResponseSchemaV1 } from '../../../r_rule'; +import { alertsFilterQuerySchemaV1 } from '../../../alerts_filter_query'; import { ruleNotifyWhen as ruleNotifyWhenV1, ruleExecutionStatusValues as ruleExecutionStatusValuesV1, ruleExecutionStatusErrorReason as ruleExecutionStatusErrorReasonV1, ruleExecutionStatusWarningReason as ruleExecutionStatusWarningReasonV1, ruleLastRunOutcomeValues as ruleLastRunOutcomeValuesV1, - filterStateStore as filterStateStoreV1, } from '../../common/constants/v1'; import { validateNotifyWhenV1 } from '../../validation'; @@ -41,25 +41,7 @@ const actionFrequencySchema = schema.object({ }); const actionAlertsFilterSchema = schema.object({ - query: schema.maybe( - schema.object({ - kql: schema.string(), - filters: schema.arrayOf( - schema.object({ - query: schema.maybe(schema.recordOf(schema.string(), schema.any())), - meta: schema.recordOf(schema.string(), schema.any()), - $state: schema.maybe( - schema.object({ - store: schema.oneOf([ - schema.literal(filterStateStoreV1.APP_STATE), - schema.literal(filterStateStoreV1.GLOBAL_STATE), - ]), - }) - ), - }) - ), - }) - ), + query: schema.maybe(alertsFilterQuerySchemaV1), timeframe: schema.maybe( schema.object({ days: schema.arrayOf( diff --git a/x-pack/plugins/alerting/docs/openapi/bundled.json b/x-pack/plugins/alerting/docs/openapi/bundled.json index 6e09c658ae407..0ffb3afc11186 100644 --- a/x-pack/plugins/alerting/docs/openapi/bundled.json +++ b/x-pack/plugins/alerting/docs/openapi/bundled.json @@ -1,9 +1,9 @@ { - "openapi": "3.0.1", + "openapi": "3.1.0", "info": { "title": "Alerting", "description": "OpenAPI schema for alerting endpoints", - "version": "0.1", + "version": "0.2", "contact": { "name": "Alerting Team" }, @@ -239,7 +239,9 @@ "required": true, "schema": { "type": "string", - "example": "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + "examples": [ + "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + ] } } ], @@ -496,9 +498,11 @@ "description": "The default operator to use for the simple_query_string.", "schema": { "type": "string", - "default": "OR" - }, - "example": "OR" + "default": "OR", + "examples": [ + "OR" + ] + } }, { "name": "fields", @@ -541,9 +545,11 @@ "description": "The page number to return.", "schema": { "type": "integer", - "default": 1 - }, - "example": 1 + "default": 1, + "examples": [ + 1 + ] + } }, { "name": "per_page", @@ -551,9 +557,11 @@ "description": "The number of rules to return per page.", "schema": { "type": "integer", - "default": 20 - }, - "example": 20 + "default": 20, + "examples": [ + 20 + ] + } }, { "name": "search", @@ -599,9 +607,11 @@ "asc", "desc" ], - "default": "desc" - }, - "example": "asc" + "default": "desc", + "examples": [ + "asc" + ] + } } ], "responses": { @@ -684,7 +694,9 @@ "properties": { "status": { "type": "string", - "example": "ok", + "examples": [ + "ok" + ], "enum": [ "error", "ok", @@ -694,7 +706,9 @@ "timestamp": { "type": "string", "format": "date-time", - "example": "2023-01-13T01:28:00.280Z" + "examples": [ + "2023-01-13T01:28:00.280Z" + ] } } }, @@ -704,7 +718,9 @@ "properties": { "status": { "type": "string", - "example": "ok", + "examples": [ + "ok" + ], "enum": [ "error", "ok", @@ -714,7 +730,9 @@ "timestamp": { "type": "string", "format": "date-time", - "example": "2023-01-13T01:28:00.280Z" + "examples": [ + "2023-01-13T01:28:00.280Z" + ] } } }, @@ -724,7 +742,9 @@ "properties": { "status": { "type": "string", - "example": "ok", + "examples": [ + "ok" + ], "enum": [ "error", "ok", @@ -734,7 +754,9 @@ "timestamp": { "type": "string", "format": "date-time", - "example": "2023-01-13T01:28:00.280Z" + "examples": [ + "2023-01-13T01:28:00.280Z" + ] } } } @@ -743,12 +765,16 @@ "has_permanent_encryption_key": { "type": "boolean", "description": "If `false`, the encrypted saved object plugin does not have a permanent encryption key.", - "example": true + "examples": [ + true + ] }, "is_sufficiently_secure": { "type": "boolean", "description": "If `false`, security is enabled but TLS is not.", - "example": true + "examples": [ + true + ] } } }, @@ -1030,7 +1056,9 @@ "minimum_license_required": { "description": "The subscriptions required to use the rule type.", "type": "string", - "example": "basic" + "examples": [ + "basic" + ] }, "name": { "description": "The descriptive name of the rule type.", @@ -1039,7 +1067,9 @@ "producer": { "description": "An identifier for the application that produces this rule type.", "type": "string", - "example": "stackAlerts" + "examples": [ + "stackAlerts" + ] }, "recovery_action_group": { "description": "An action group to use when an alert goes from an active state to an inactive one.", @@ -1055,7 +1085,9 @@ }, "rule_task_timeout": { "type": "string", - "example": "5m" + "examples": [ + "5m" + ] } } } @@ -1290,7 +1322,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } } ], @@ -1329,7 +1363,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } } ], @@ -1375,7 +1411,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } }, { @@ -1464,7 +1502,9 @@ "interval": { "type": "string", "description": "The interval format specifies the interval in seconds, minutes, hours or days at which the alert should execute.", - "example": "10s" + "examples": [ + "10s" + ] } } }, @@ -1529,7 +1569,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } } ], @@ -1601,7 +1643,9 @@ "interval": { "type": "string", "description": "The interval format specifies the interval in seconds, minutes, hours or days at which the alert should execute.", - "example": "1d" + "examples": [ + "1d" + ] } } }, @@ -1668,7 +1712,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } } ], @@ -1712,7 +1758,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } } ], @@ -1756,7 +1804,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } } ], @@ -1800,7 +1850,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } } ], @@ -1840,9 +1892,11 @@ "description": "The default operator to use for the `simple_query_string`.", "schema": { "type": "string", - "default": "OR" - }, - "example": "OR" + "default": "OR", + "examples": [ + "OR" + ] + } }, { "name": "fields", @@ -1885,9 +1939,11 @@ "description": "The page number to return.", "schema": { "type": "integer", - "default": 1 - }, - "example": 1 + "default": 1, + "examples": [ + 1 + ] + } }, { "name": "per_page", @@ -1895,9 +1951,11 @@ "description": "The number of alerts to return per page.", "schema": { "type": "integer", - "default": 20 - }, - "example": 20 + "default": 20, + "examples": [ + 20 + ] + } }, { "name": "search", @@ -1943,9 +2001,11 @@ "asc", "desc" ], - "default": "desc" - }, - "example": "asc" + "default": "desc", + "examples": [ + "asc" + ] + } } ], "responses": { @@ -2021,7 +2081,9 @@ "properties": { "status": { "type": "string", - "example": "ok", + "examples": [ + "ok" + ], "enum": [ "error", "ok", @@ -2031,7 +2093,9 @@ "timestamp": { "type": "string", "format": "date-time", - "example": "2023-01-13T01:28:00.280Z" + "examples": [ + "2023-01-13T01:28:00.280Z" + ] } } }, @@ -2041,7 +2105,9 @@ "properties": { "status": { "type": "string", - "example": "ok", + "examples": [ + "ok" + ], "enum": [ "error", "ok", @@ -2051,7 +2117,9 @@ "timestamp": { "type": "string", "format": "date-time", - "example": "2023-01-13T01:28:00.280Z" + "examples": [ + "2023-01-13T01:28:00.280Z" + ] } } }, @@ -2061,7 +2129,9 @@ "properties": { "status": { "type": "string", - "example": "ok", + "examples": [ + "ok" + ], "enum": [ "error", "ok", @@ -2071,7 +2141,9 @@ "timestamp": { "type": "string", "format": "date-time", - "example": "2023-01-13T01:28:00.280Z" + "examples": [ + "2023-01-13T01:28:00.280Z" + ] } } } @@ -2080,12 +2152,16 @@ "hasPermanentEncryptionKey": { "type": "boolean", "description": "If `false`, the encrypted saved object plugin does not have a permanent encryption key.", - "example": true + "examples": [ + true + ] }, "isSufficientlySecure": { "type": "boolean", "description": "If `false`, security is enabled but TLS is not.", - "example": true + "examples": [ + true + ] } } } @@ -2278,7 +2354,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } }, { @@ -2288,7 +2366,9 @@ "required": true, "schema": { "type": "string", - "example": "dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2" + "examples": [ + "dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2" + ] } } ], @@ -2332,7 +2412,9 @@ "required": true, "schema": { "type": "string", - "example": "41893910-6bca-11eb-9e0d-85d233e3ee35" + "examples": [ + "41893910-6bca-11eb-9e0d-85d233e3ee35" + ] } }, { @@ -2342,7 +2424,9 @@ "required": true, "schema": { "type": "string", - "example": "dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2" + "examples": [ + "dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2" + ] } } ], @@ -2373,7 +2457,8 @@ "apiKeyAuth": { "type": "apiKey", "in": "header", - "name": "ApiKey" + "name": "Authorization", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" } }, "parameters": { @@ -2393,7 +2478,9 @@ "required": true, "schema": { "type": "string", - "example": "default" + "examples": [ + "default" + ] } }, "rule_id": { @@ -2403,7 +2490,9 @@ "required": true, "schema": { "type": "string", - "example": "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + "examples": [ + "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + ] } }, "alert_id": { @@ -2413,7 +2502,9 @@ "required": true, "schema": { "type": "string", - "example": "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + "examples": [ + "ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74" + ] } } }, @@ -2426,8 +2517,10 @@ "type": "object", "properties": { "alias": { - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "controlledBy": { "type": "string" @@ -2480,19 +2573,27 @@ "onActiveAlert", "onThrottleInterval" ], - "example": "onActiveAlert" + "examples": [ + "onActiveAlert" + ] }, "throttle": { - "type": "string", + "type": [ + "string", + "null" + ], "description": "The throttle interval, which defines how often an alert generates repeated actions. It is specified in seconds, minutes, hours, or days and is applicable only if `notify_when` is set to `onThrottleInterval`. NOTE: You cannot specify the throttle interval at both the rule and action level. The recommended method is to set it for each action. If you set it at the rule level then update the rule in Kibana, it is automatically changed to use action-specific values.\n", - "nullable": true, "default": null, - "example": "10m" + "examples": [ + "10m" + ] }, "actions": { - "type": "array", + "type": [ + "array", + "null" + ], "default": [], - "nullable": true, "items": { "type": "object", "required": [ @@ -2532,12 +2633,14 @@ "items": { "type": "integer" }, - "example": [ - 1, - 2, - 3, - 4, - 5 + "examples": [ + [ + 1, + 2, + 3, + 4, + 5 + ] ] }, "hours": { @@ -2547,19 +2650,25 @@ "end": { "type": "string", "description": "The end of the time frame in 24-hour notation (`hh:mm`).", - "example": "17:00" + "examples": [ + "17:00" + ] }, "start": { "type": "string", "description": "The start of the time frame in 24-hour notation (`hh:mm`).", - "example": "08:00" + "examples": [ + "08:00" + ] } } }, "timezone": { "type": "string", "description": "The ISO time zone for the `hours` values. Values such as `UTC` and `UTC+1` also work but lack built-in daylight savings time support and are not recommended.\n", - "example": "Europe/Madrid" + "examples": [ + "Europe/Madrid" + ] } } } @@ -2568,7 +2677,9 @@ "connector_type_id": { "type": "string", "description": "The type of connector. This property appears in responses but cannot be set in requests.", - "example": ".server-log", + "examples": [ + ".server-log" + ], "readOnly": true }, "frequency": { @@ -2594,12 +2705,16 @@ "group": { "type": "string", "description": "The group name, which affects when the action runs (for example, when the threshold is met or when the alert is recovered). Each rule type has a list of valid action group names. If you don't need to group actions, set to `default`.\n", - "example": "default" + "examples": [ + "default" + ] }, "id": { "type": "string", "description": "The identifier for the connector saved object.", - "example": "9dca3e00-74f5-11ed-9801-35303b735aef" + "examples": [ + "9dca3e00-74f5-11ed-9801-35303b735aef" + ] }, "params": { "type": "object", @@ -2609,7 +2724,9 @@ "uuid": { "type": "string", "description": "A universally unique identifier (UUID) for the action.", - "example": "1c7a1280-f28c-4e06-96b2-e4e5f05d1d61" + "examples": [ + "1c7a1280-f28c-4e06-96b2-e4e5f05d1d61" + ] } } } @@ -2632,7 +2749,9 @@ "properties": { "interval": { "type": "string", - "example": "1m" + "examples": [ + "1m" + ] } } }, @@ -3210,7 +3329,9 @@ "timewindowsize": { "description": "The size of the time window (in `timeWindowUnit` units), which determines how far back to search for documents. Generally it should be a value higher than the rule check interval to avoid gaps in detection.\n", "type": "integer", - "example": 5 + "examples": [ + 5 + ] }, "timewindowunit": { "description": "The type of units for the time window: seconds, minutes, hours, or days.\n", @@ -3221,7 +3342,9 @@ "h", "d" ], - "example": "m" + "examples": [ + "m" + ] }, "size": { "description": "The number of documents to pass to the configured actions when the threshold condition is met.\n", @@ -3247,7 +3370,9 @@ "type": "array", "items": { "type": "integer", - "example": 4000 + "examples": [ + 4000 + ] } }, "thresholdcomparator": { @@ -3261,7 +3386,9 @@ "between", "notBetween" ], - "example": ">" + "examples": [ + ">" + ] }, "params_es_query_rule": { "oneOf": [ @@ -3309,12 +3436,16 @@ "enum": [ "esqlQuery" ], - "example": "esqlQuery" + "examples": [ + "esqlQuery" + ] }, "size": { "type": "integer", "description": "When `searchType` is `esqlQuery`, this property is required but it does not affect the rule behavior.\n", - "example": 0 + "examples": [ + 0 + ] }, "termSize": { "$ref": "#/components/schemas/termsize" @@ -3334,7 +3465,9 @@ "enum": [ ">" ], - "example": ">" + "examples": [ + ">" + ] }, "timeField": { "$ref": "#/components/schemas/timefield" @@ -3400,7 +3533,9 @@ "properties": { "language": { "type": "string", - "example": "kuery" + "examples": [ + "kuery" + ] }, "query": { "type": "string" @@ -3415,7 +3550,9 @@ "enum": [ "searchSource" ], - "example": "searchSource" + "examples": [ + "searchSource" + ] }, "size": { "$ref": "#/components/schemas/size" @@ -3493,7 +3630,9 @@ "esQuery" ], "default": "esQuery", - "example": "esQuery" + "examples": [ + "esQuery" + ] }, "size": { "$ref": "#/components/schemas/size" @@ -6318,58 +6457,82 @@ "api_key_created_by_user": { "type": "boolean", "description": "Indicates whether the API key that is associated with the rule was created by the user.", - "example": false + "examples": [ + false + ] }, "api_key_owner": { - "type": "string", + "type": [ + "string", + "null" + ], "description": "The owner of the API key that is associated with the rule and used to run background tasks.\n", - "nullable": true, - "example": "elastic" + "examples": [ + "elastic" + ] }, "consumer": { "type": "string", "description": "The application or feature that owns the rule. For example, `alerts`, `apm`, `discover`, `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, `securitySolution`, `siem`, `stackAlerts`, or `uptime`.", - "example": "alerts" + "examples": [ + "alerts" + ] }, "created_at": { "type": "string", "description": "The date and time that the rule was created.", "format": "date-time", - "example": "2022-12-05T23:36:58.284Z" + "examples": [ + "2022-12-05T23:36:58.284Z" + ] }, "created_by": { - "type": "string", + "type": [ + "string", + "null" + ], "description": "The identifier for the user that created the rule.", - "nullable": true, - "example": "elastic" + "examples": [ + "elastic" + ] }, "enabled": { "type": "boolean", "description": "Indicates whether the rule is currently enabled.", - "example": true + "examples": [ + true + ] }, "execution_status": { "type": "object", "properties": { "last_duration": { "type": "integer", - "example": 55 + "examples": [ + 55 + ] }, "last_execution_date": { "type": "string", "format": "date-time", - "example": "2022-12-06T00:13:43.890Z" + "examples": [ + "2022-12-06T00:13:43.890Z" + ] }, "status": { "type": "string", - "example": "ok" + "examples": [ + "ok" + ] } } }, "id": { "type": "string", "description": "The identifier for the rule.", - "example": "b530fed0-74f5-11ed-9801-35303b735aef" + "examples": [ + "b530fed0-74f5-11ed-9801-35303b735aef" + ] }, "last_run": { "type": "object", @@ -6393,51 +6556,71 @@ }, "outcome": { "type": "string", - "example": "succeeded" + "examples": [ + "succeeded" + ] }, "outcome_msg": { - "type": "array", + "type": [ + "array", + "null" + ], "items": { "type": "string" - }, - "nullable": true + } }, "outcome_order": { "type": "integer" }, "warning": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] } } }, "muted_alert_ids": { - "type": "array", - "nullable": true, + "type": [ + "array", + "null" + ], "items": { "type": "string" } }, "mute_all": { "type": "boolean", - "example": false + "examples": [ + false + ] }, "name": { "type": "string", "description": "The name of the rule.", - "example": "cluster_health_rule" + "examples": [ + "cluster_health_rule" + ] }, "next_run": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": "2022-12-06T00:14:43.818Z" + "examples": [ + "2022-12-06T00:14:43.818Z" + ] }, "notify_when": { - "type": "string", - "description": "Indicates how often alerts generate actions.", - "nullable": true + "type": [ + "string", + "null" + ], + "description": "Indicates how often alerts generate actions." }, "params": { "type": "object", @@ -6451,7 +6634,9 @@ "rule_type_id": { "type": "string", "description": "The identifier for the type of rule. For example, `.es-query`, `.index-threshold`, `logs.alert.document.count`, `monitoring_alert_cluster_health`, `siem.thresholdRule`, or `xpack.ml.anomaly_detection_alert`.\n", - "example": "monitoring_alert_cluster_health" + "examples": [ + "monitoring_alert_cluster_health" + ] }, "running": { "type": "boolean", @@ -6462,7 +6647,9 @@ }, "scheduled_task_id": { "type": "string", - "example": "b530fed0-74f5-11ed-9801-35303b735aef" + "examples": [ + "b530fed0-74f5-11ed-9801-35303b735aef" + ] }, "tags": { "$ref": "#/components/schemas/tags" @@ -6473,13 +6660,19 @@ "updated_at": { "type": "string", "description": "The date and time that the rule was updated most recently.", - "example": "2022-12-05T23:36:58.284Z" + "examples": [ + "2022-12-05T23:36:58.284Z" + ] }, "updated_by": { - "type": "string", + "type": [ + "string", + "null" + ], "description": "The identifier for the user that updated this rule most recently.", - "nullable": true, - "example": "elastic" + "examples": [ + "elastic" + ] } } }, @@ -6489,7 +6682,9 @@ "properties": { "error": { "type": "string", - "example": "Unauthorized", + "examples": [ + "Unauthorized" + ], "enum": [ "Unauthorized" ] @@ -6499,7 +6694,9 @@ }, "statusCode": { "type": "integer", - "example": 401, + "examples": [ + 401 + ], "enum": [ 401 ] @@ -6511,18 +6708,24 @@ "properties": { "error": { "type": "string", - "example": "Not Found", + "examples": [ + "Not Found" + ], "enum": [ "Not Found" ] }, "message": { "type": "string", - "example": "Saved object [alert/caaad6d0-920c-11ed-b36a-874bd1548a00] not found" + "examples": [ + "Saved object [alert/caaad6d0-920c-11ed-b36a-874bd1548a00] not found" + ] }, "statusCode": { "type": "integer", - "example": 404, + "examples": [ + 404 + ], "enum": [ 404 ] @@ -6545,7 +6748,9 @@ "name": { "type": "string", "description": "The name of the rule.", - "example": "cluster_health_rule" + "examples": [ + "cluster_health_rule" + ] }, "notify_when": { "$ref": "#/components/schemas/notify_when" @@ -6604,28 +6809,40 @@ }, "alertTypeId": { "type": "string", - "example": ".index-threshold" + "examples": [ + ".index-threshold" + ] }, "apiKeyOwner": { - "type": "string", - "nullable": true, - "example": "elastic" + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] }, "createdAt": { "type": "string", "description": "The date and time that the alert was created.", "format": "date-time", - "example": "2022-12-05T23:36:58.284Z" + "examples": [ + "2022-12-05T23:36:58.284Z" + ] }, "createdBy": { "type": "string", "description": "The identifier for the user that created the alert.", - "example": "elastic" + "examples": [ + "elastic" + ] }, "enabled": { "type": "boolean", "description": "Indicates whether the alert is currently enabled.", - "example": true + "examples": [ + true + ] }, "executionStatus": { "type": "object", @@ -6633,26 +6850,36 @@ "lastExecutionDate": { "type": "string", "format": "date-time", - "example": "2022-12-06T00:13:43.890Z" + "examples": [ + "2022-12-06T00:13:43.890Z" + ] }, "status": { "type": "string", - "example": "ok" + "examples": [ + "ok" + ] } } }, "id": { "type": "string", "description": "The identifier for the alert.", - "example": "b530fed0-74f5-11ed-9801-35303b735aef" + "examples": [ + "b530fed0-74f5-11ed-9801-35303b735aef" + ] }, "muteAll": { "type": "boolean", - "example": false + "examples": [ + false + ] }, "mutedInstanceIds": { - "type": "array", - "nullable": true, + "type": [ + "array", + "null" + ], "items": { "type": "string" } @@ -6660,11 +6887,15 @@ "name": { "type": "string", "description": "The name of the alert.", - "example": "my alert" + "examples": [ + "my alert" + ] }, "notifyWhen": { "type": "string", - "example": "onActionGroupChange" + "examples": [ + "onActionGroupChange" + ] }, "params": { "type": "object", @@ -6680,7 +6911,9 @@ }, "scheduledTaskId": { "type": "string", - "example": "b530fed0-74f5-11ed-9801-35303b735aef" + "examples": [ + "b530fed0-74f5-11ed-9801-35303b735aef" + ] }, "tags": { "type": "array", @@ -6689,18 +6922,26 @@ } }, "throttle": { - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "updatedAt": { "type": "string", - "example": "2022-12-05T23:36:58.284Z" + "examples": [ + "2022-12-05T23:36:58.284Z" + ] }, "updatedBy": { - "type": "string", + "type": [ + "string", + "null" + ], "description": "The identifier for the user that updated this alert most recently.", - "nullable": true, - "example": "elastic" + "examples": [ + "elastic" + ] } } } diff --git a/x-pack/plugins/alerting/docs/openapi/bundled.yaml b/x-pack/plugins/alerting/docs/openapi/bundled.yaml index 424326e12c8f6..4a736e68e9b66 100644 --- a/x-pack/plugins/alerting/docs/openapi/bundled.yaml +++ b/x-pack/plugins/alerting/docs/openapi/bundled.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Alerting description: OpenAPI schema for alerting endpoints - version: '0.1' + version: '0.2' contact: name: Alerting Team license: @@ -147,7 +147,8 @@ paths: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 requestBody: required: true content: @@ -303,7 +304,8 @@ paths: schema: type: string default: OR - example: OR + examples: + - OR - name: fields in: query description: The fields to return in the `attributes` key of the response. @@ -333,14 +335,16 @@ paths: schema: type: integer default: 1 - example: 1 + examples: + - 1 - name: per_page in: query description: The number of rules to return per page. schema: type: integer default: 20 - example: 20 + examples: + - 20 - name: search in: query description: An Elasticsearch simple_query_string query that filters the objects in the response. @@ -370,7 +374,8 @@ paths: - asc - desc default: desc - example: asc + examples: + - asc responses: '200': description: Indicates a successful call. @@ -429,7 +434,8 @@ paths: properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -437,14 +443,16 @@ paths: timestamp: type: string format: date-time - example: '2023-01-13T01:28:00.280Z' + examples: + - '2023-01-13T01:28:00.280Z' execution_health: type: object description: The timestamp and status of the rule run. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -452,14 +460,16 @@ paths: timestamp: type: string format: date-time - example: '2023-01-13T01:28:00.280Z' + examples: + - '2023-01-13T01:28:00.280Z' read_health: type: object description: The timestamp and status of the rule reading events. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -467,15 +477,18 @@ paths: timestamp: type: string format: date-time - example: '2023-01-13T01:28:00.280Z' + examples: + - '2023-01-13T01:28:00.280Z' has_permanent_encryption_key: type: boolean description: If `false`, the encrypted saved object plugin does not have a permanent encryption key. - example: true + examples: + - true is_sufficiently_secure: type: boolean description: If `false`, security is enabled but TLS is not. - example: true + examples: + - true examples: getAlertingHealthResponse: $ref: '#/components/examples/get_health_response' @@ -662,14 +675,16 @@ paths: minimum_license_required: description: The subscriptions required to use the rule type. type: string - example: basic + examples: + - basic name: description: The descriptive name of the rule type. type: string producer: description: An identifier for the application that produces this rule type. type: string - example: stackAlerts + examples: + - stackAlerts recovery_action_group: description: An action group to use when an alert goes from an active state to an inactive one. type: object @@ -680,7 +695,8 @@ paths: type: string rule_task_timeout: type: string - example: 5m + examples: + - 5m examples: getRuleTypesResponse: $ref: '#/components/examples/get_rule_types_response' @@ -814,7 +830,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. @@ -839,7 +856,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '200': description: Indicates a successful call. @@ -868,7 +886,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 - $ref: '#/components/parameters/space_id' requestBody: required: true @@ -939,7 +958,8 @@ paths: interval: type: string description: The interval format specifies the interval in seconds, minutes, hours or days at which the alert should execute. - example: 10s + examples: + - 10s tags: type: array items: @@ -978,7 +998,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 requestBody: required: true content: @@ -1037,7 +1058,8 @@ paths: interval: type: string description: The interval format specifies the interval in seconds, minutes, hours or days at which the alert should execute. - example: 1d + examples: + - 1d tags: type: array items: @@ -1077,7 +1099,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. @@ -1104,7 +1127,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. @@ -1131,7 +1155,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. @@ -1158,7 +1183,8 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. @@ -1185,7 +1211,8 @@ paths: schema: type: string default: OR - example: OR + examples: + - OR - name: fields in: query description: The fields to return in the `attributes` key of the response. @@ -1215,14 +1242,16 @@ paths: schema: type: integer default: 1 - example: 1 + examples: + - 1 - name: per_page in: query description: The number of alerts to return per page. schema: type: integer default: 20 - example: 20 + examples: + - 20 - name: search in: query description: An Elasticsearch `simple_query_string` query that filters the alerts in the response. @@ -1252,7 +1281,8 @@ paths: - asc - desc default: desc - example: asc + examples: + - asc responses: '200': description: Indicates a successful call. @@ -1306,7 +1336,8 @@ paths: properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -1314,14 +1345,16 @@ paths: timestamp: type: string format: date-time - example: '2023-01-13T01:28:00.280Z' + examples: + - '2023-01-13T01:28:00.280Z' executionHealth: type: object description: The timestamp and status of the alert execution. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -1329,14 +1362,16 @@ paths: timestamp: type: string format: date-time - example: '2023-01-13T01:28:00.280Z' + examples: + - '2023-01-13T01:28:00.280Z' readHealth: type: object description: The timestamp and status of the alert reading events. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -1344,15 +1379,18 @@ paths: timestamp: type: string format: date-time - example: '2023-01-13T01:28:00.280Z' + examples: + - '2023-01-13T01:28:00.280Z' hasPermanentEncryptionKey: type: boolean description: If `false`, the encrypted saved object plugin does not have a permanent encryption key. - example: true + examples: + - true isSufficientlySecure: type: boolean description: If `false`, security is enabled but TLS is not. - example: true + examples: + - true '401': description: Authorization information is missing or invalid. content: @@ -1478,14 +1516,16 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 - in: path name: alertInstanceId description: An identifier for the alert instance. required: true schema: type: string - example: dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 + examples: + - dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 responses: '204': description: Indicates a successful call. @@ -1512,14 +1552,16 @@ paths: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 - in: path name: alertInstanceId description: An identifier for the alert instance. required: true schema: type: string - example: dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 + examples: + - dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 responses: '204': description: Indicates a successful call. @@ -1537,7 +1579,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' parameters: kbn_xsrf: schema: @@ -1553,7 +1596,8 @@ components: required: true schema: type: string - example: default + examples: + - default rule_id: in: path name: ruleId @@ -1561,7 +1605,8 @@ components: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 alert_id: in: path name: alertId @@ -1569,7 +1614,8 @@ components: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 schemas: filter: type: object @@ -1579,8 +1625,9 @@ components: type: object properties: alias: - type: string - nullable: true + type: + - string + - 'null' controlledBy: type: string disabled: @@ -1615,18 +1662,22 @@ components: - onActionGroupChange - onActiveAlert - onThrottleInterval - example: onActiveAlert + examples: + - onActiveAlert throttle: - type: string + type: + - string + - 'null' description: | The throttle interval, which defines how often an alert generates repeated actions. It is specified in seconds, minutes, hours, or days and is applicable only if `notify_when` is set to `onThrottleInterval`. NOTE: You cannot specify the throttle interval at both the rule and action level. The recommended method is to set it for each action. If you set it at the rule level then update the rule in Kibana, it is automatically changed to use action-specific values. - nullable: true default: null - example: 10m + examples: + - 10m actions: - type: array + type: + - array + - 'null' default: [] - nullable: true items: type: object required: @@ -1661,12 +1712,12 @@ components: description: Defines the days of the week that the action can run, represented as an array of numbers. For example, `1` represents Monday. An empty array is equivalent to specifying all the days of the week. items: type: integer - example: - - 1 - - 2 - - 3 - - 4 - - 5 + examples: + - - 1 + - 2 + - 3 + - 4 + - 5 hours: type: object description: | @@ -1675,20 +1726,24 @@ components: end: type: string description: The end of the time frame in 24-hour notation (`hh:mm`). - example: '17:00' + examples: + - '17:00' start: type: string description: The start of the time frame in 24-hour notation (`hh:mm`). - example: '08:00' + examples: + - '08:00' timezone: type: string description: | The ISO time zone for the `hours` values. Values such as `UTC` and `UTC+1` also work but lack built-in daylight savings time support and are not recommended. - example: Europe/Madrid + examples: + - Europe/Madrid connector_type_id: type: string description: The type of connector. This property appears in responses but cannot be set in requests. - example: .server-log + examples: + - .server-log readOnly: true frequency: type: object @@ -1709,11 +1764,13 @@ components: type: string description: | The group name, which affects when the action runs (for example, when the threshold is met or when the alert is recovered). Each rule type has a list of valid action group names. If you don't need to group actions, set to `default`. - example: default + examples: + - default id: type: string description: The identifier for the connector saved object. - example: 9dca3e00-74f5-11ed-9801-35303b735aef + examples: + - 9dca3e00-74f5-11ed-9801-35303b735aef params: type: object description: The parameters for the action, which are sent to the connector. The `params` are handled as Mustache templates and passed a default set of context. @@ -1721,7 +1778,8 @@ components: uuid: type: string description: A universally unique identifier (UUID) for the action. - example: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 + examples: + - 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 consumer: type: string description: | @@ -1739,7 +1797,8 @@ components: properties: interval: type: string - example: 1m + examples: + - 1m tags: type: array description: The tags for the rule. @@ -2170,7 +2229,8 @@ components: description: | The size of the time window (in `timeWindowUnit` units), which determines how far back to search for documents. Generally it should be a value higher than the rule check interval to avoid gaps in detection. type: integer - example: 5 + examples: + - 5 timewindowunit: description: | The type of units for the time window: seconds, minutes, hours, or days. @@ -2180,7 +2240,8 @@ components: - m - h - d - example: m + examples: + - m size: description: | The number of documents to pass to the configured actions when the threshold condition is met. @@ -2200,7 +2261,8 @@ components: type: array items: type: integer - example: 4000 + examples: + - 4000 thresholdcomparator: description: The comparison function for the threshold. For example, "is above", "is above or equals", "is below", "is below or equals", "is between", and "is not between". type: string @@ -2211,7 +2273,8 @@ components: - <= - between - notBetween - example: '>' + examples: + - '>' params_es_query_rule: oneOf: - type: object @@ -2248,12 +2311,14 @@ components: type: string enum: - esqlQuery - example: esqlQuery + examples: + - esqlQuery size: type: integer description: | When `searchType` is `esqlQuery`, this property is required but it does not affect the rule behavior. - example: 0 + examples: + - 0 termSize: $ref: '#/components/schemas/termsize' threshold: @@ -2270,7 +2335,8 @@ components: The comparison function for the threshold. When `searchType` is `esqlQuery`, this property is required and must be set to ">". Since the `threshold` value must be `0`, the result is that an alert occurs whenever the query returns results. enum: - '>' - example: '>' + examples: + - '>' timeField: $ref: '#/components/schemas/timefield' timeWindowSize: @@ -2315,7 +2381,8 @@ components: properties: language: type: string - example: kuery + examples: + - kuery query: type: string searchType: @@ -2323,7 +2390,8 @@ components: type: string enum: - searchSource - example: searchSource + examples: + - searchSource size: $ref: '#/components/schemas/size' termField: @@ -2375,7 +2443,8 @@ components: enum: - esQuery default: esQuery - example: esQuery + examples: + - esQuery size: $ref: '#/components/schemas/size' termField: @@ -4357,48 +4426,60 @@ components: api_key_created_by_user: type: boolean description: Indicates whether the API key that is associated with the rule was created by the user. - example: false + examples: + - false api_key_owner: - type: string + type: + - string + - 'null' description: | The owner of the API key that is associated with the rule and used to run background tasks. - nullable: true - example: elastic + examples: + - elastic consumer: type: string description: The application or feature that owns the rule. For example, `alerts`, `apm`, `discover`, `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, `securitySolution`, `siem`, `stackAlerts`, or `uptime`. - example: alerts + examples: + - alerts created_at: type: string description: The date and time that the rule was created. format: date-time - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' created_by: - type: string + type: + - string + - 'null' description: The identifier for the user that created the rule. - nullable: true - example: elastic + examples: + - elastic enabled: type: boolean description: Indicates whether the rule is currently enabled. - example: true + examples: + - true execution_status: type: object properties: last_duration: type: integer - example: 55 + examples: + - 55 last_execution_date: type: string format: date-time - example: '2022-12-06T00:13:43.890Z' + examples: + - '2022-12-06T00:13:43.890Z' status: type: string - example: ok + examples: + - ok id: type: string description: The identifier for the rule. - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef last_run: type: object properties: @@ -4415,39 +4496,49 @@ components: type: integer outcome: type: string - example: succeeded + examples: + - succeeded outcome_msg: - type: array + type: + - array + - 'null' items: type: string - nullable: true outcome_order: type: integer warning: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null muted_alert_ids: - type: array - nullable: true + type: + - array + - 'null' items: type: string mute_all: type: boolean - example: false + examples: + - false name: type: string description: The name of the rule. - example: cluster_health_rule + examples: + - cluster_health_rule next_run: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: '2022-12-06T00:14:43.818Z' + examples: + - '2022-12-06T00:14:43.818Z' notify_when: - type: string + type: + - string + - 'null' description: Indicates how often alerts generate actions. - nullable: true params: type: object description: The parameters for the rule. @@ -4459,7 +4550,8 @@ components: type: string description: | The identifier for the type of rule. For example, `.es-query`, `.index-threshold`, `logs.alert.document.count`, `monitoring_alert_cluster_health`, `siem.thresholdRule`, or `xpack.ml.anomaly_detection_alert`. - example: monitoring_alert_cluster_health + examples: + - monitoring_alert_cluster_health running: type: boolean description: Indicates whether the rule is running. @@ -4467,7 +4559,8 @@ components: $ref: '#/components/schemas/schedule' scheduled_task_id: type: string - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef tags: $ref: '#/components/schemas/tags' throttle: @@ -4475,26 +4568,31 @@ components: updated_at: type: string description: The date and time that the rule was updated most recently. - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' updated_by: - type: string + type: + - string + - 'null' description: The identifier for the user that updated this rule most recently. - nullable: true - example: elastic + examples: + - elastic 401_response: type: object title: Unsuccessful rule API response properties: error: type: string - example: Unauthorized + examples: + - Unauthorized enum: - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 enum: - 401 404_response: @@ -4502,15 +4600,18 @@ components: properties: error: type: string - example: Not Found + examples: + - Not Found enum: - Not Found message: type: string - example: Saved object [alert/caaad6d0-920c-11ed-b36a-874bd1548a00] not found + examples: + - Saved object [alert/caaad6d0-920c-11ed-b36a-874bd1548a00] not found statusCode: type: integer - example: 404 + examples: + - 404 enum: - 404 update_rule_request: @@ -4528,7 +4629,8 @@ components: name: type: string description: The name of the rule. - example: cluster_health_rule + examples: + - cluster_health_rule notify_when: $ref: '#/components/schemas/notify_when' params: @@ -4569,53 +4671,66 @@ components: type: object alertTypeId: type: string - example: .index-threshold + examples: + - .index-threshold apiKeyOwner: - type: string - nullable: true - example: elastic + type: + - string + - 'null' + examples: + - elastic createdAt: type: string description: The date and time that the alert was created. format: date-time - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' createdBy: type: string description: The identifier for the user that created the alert. - example: elastic + examples: + - elastic enabled: type: boolean description: Indicates whether the alert is currently enabled. - example: true + examples: + - true executionStatus: type: object properties: lastExecutionDate: type: string format: date-time - example: '2022-12-06T00:13:43.890Z' + examples: + - '2022-12-06T00:13:43.890Z' status: type: string - example: ok + examples: + - ok id: type: string description: The identifier for the alert. - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef muteAll: type: boolean - example: false + examples: + - false mutedInstanceIds: - type: array - nullable: true + type: + - array + - 'null' items: type: string name: type: string description: The name of the alert. - example: my alert + examples: + - my alert notifyWhen: type: string - example: onActionGroupChange + examples: + - onActionGroupChange params: type: object additionalProperties: true @@ -4626,22 +4741,27 @@ components: type: string scheduledTaskId: type: string - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef tags: type: array items: type: string throttle: - type: string - nullable: true + type: + - string + - 'null' updatedAt: type: string - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' updatedBy: - type: string + type: + - string + - 'null' description: The identifier for the user that updated this alert most recently. - nullable: true - example: elastic + examples: + - elastic examples: create_es_query_esql_rule_request: summary: Create an Elasticsearch query rule that uses Elasticsearch Query Language (ES|QL). diff --git a/x-pack/plugins/alerting/docs/openapi/components/parameters/alert_id.yaml b/x-pack/plugins/alerting/docs/openapi/components/parameters/alert_id.yaml index 27427e1ec6758..3ae77530b04d5 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/parameters/alert_id.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/parameters/alert_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the alert. The identifier is generated by the rul required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 \ No newline at end of file + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/parameters/rule_id.yaml b/x-pack/plugins/alerting/docs/openapi/components/parameters/rule_id.yaml index 4b5d14e207353..18cadc0e5d7e6 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/parameters/rule_id.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/parameters/rule_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the rule. required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 \ No newline at end of file + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/parameters/space_id.yaml b/x-pack/plugins/alerting/docs/openapi/components/parameters/space_id.yaml index 0a9fba457e3e7..45787e844caec 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/parameters/space_id.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/parameters/space_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the space. If `/s/` and the identifier are omitte required: true schema: type: string - example: default + examples: + - default diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/401_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/401_response.yaml index c6044998f8649..ed5e2a823bc0f 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/401_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/401_response.yaml @@ -3,13 +3,15 @@ title: Unsuccessful rule API response properties: error: type: string - example: Unauthorized + examples: + - Unauthorized enum: - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 enum: - 401 \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/404_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/404_response.yaml index 1b8a118703ecb..875307d5a3893 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/404_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/404_response.yaml @@ -2,14 +2,17 @@ type: object properties: error: type: string - example: Not Found + examples: + - Not Found enum: - Not Found message: type: string - example: "Saved object [alert/caaad6d0-920c-11ed-b36a-874bd1548a00] not found" + examples: + - "Saved object [alert/caaad6d0-920c-11ed-b36a-874bd1548a00] not found" statusCode: type: integer - example: 404 + examples: + - 404 enum: - 404 \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml index ee11bead01350..4297900d7a95f 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml @@ -1,6 +1,7 @@ -type: array +type: + - "array" + - "null" default: [] -nullable: true items: type: object required: @@ -37,7 +38,8 @@ items: description: Defines the days of the week that the action can run, represented as an array of numbers. For example, `1` represents Monday. An empty array is equivalent to specifying all the days of the week. items: type: integer - example: [1,2,3,4,5] + examples: + - [1,2,3,4,5] hours: type: object description: > @@ -47,21 +49,25 @@ items: end: type: string description: The end of the time frame in 24-hour notation (`hh:mm`). - example: 17:00 + examples: + - 17:00 start: type: string description: The start of the time frame in 24-hour notation (`hh:mm`). - example: 08:00 + examples: + - 08:00 timezone: type: string description: > The ISO time zone for the `hours` values. Values such as `UTC` and `UTC+1` also work but lack built-in daylight savings time support and are not recommended. - example: Europe/Madrid + examples: + - Europe/Madrid connector_type_id: type: string description: The type of connector. This property appears in responses but cannot be set in requests. - example: .server-log + examples: + - .server-log readOnly: true frequency: type: object @@ -87,11 +93,13 @@ items: The group name, which affects when the action runs (for example, when the threshold is met or when the alert is recovered). Each rule type has a list of valid action group names. If you don't need to group actions, set to `default`. - example: default + examples: + - default id: type: string description: The identifier for the connector saved object. - example: 9dca3e00-74f5-11ed-9801-35303b735aef + examples: + - 9dca3e00-74f5-11ed-9801-35303b735aef params: type: object description: The parameters for the action, which are sent to the connector. The `params` are handled as Mustache templates and passed a default set of context. @@ -99,4 +107,5 @@ items: uuid: type: string description: A universally unique identifier (UUID) for the action. - example: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 + examples: + - 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/alert_response_properties.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/alert_response_properties.yaml index 06fa627311e75..744e4ead6c94d 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/alert_response_properties.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/alert_response_properties.yaml @@ -7,53 +7,66 @@ properties: type: object alertTypeId: type: string - example: ".index-threshold" + examples: + - ".index-threshold" apiKeyOwner: - type: string - nullable: true - example: elastic + type: + - "string" + - "null" + examples: + - elastic createdAt: type: string description: The date and time that the alert was created. format: date-time - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' createdBy: type: string description: The identifier for the user that created the alert. - example: elastic + examples: + - elastic enabled: type: boolean description: Indicates whether the alert is currently enabled. - example: true + examples: + - true executionStatus: type: object properties: lastExecutionDate: type: string format: date-time - example: '2022-12-06T00:13:43.890Z' + examples: + - '2022-12-06T00:13:43.890Z' status: type: string - example: ok + examples: + - ok id: type: string description: The identifier for the alert. - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef muteAll: type: boolean - example: false + examples: + - false mutedInstanceIds: - type: array - nullable: true + type: + - "array" + - "null" items: type: string name: type: string description: The name of the alert. - example: my alert + examples: + - my alert notifyWhen: type: string - example: onActionGroupChange + examples: + - onActionGroupChange params: type: object additionalProperties: true @@ -64,19 +77,24 @@ properties: type: string scheduledTaskId: type: string - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef tags: type: array items: type: string throttle: - type: string - nullable: true + type: + - "string" + - "null" updatedAt: type: string - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' updatedBy: - type: string + type: + - "string" + - "null" description: The identifier for the user that updated this alert most recently. - nullable: true - example: elastic \ No newline at end of file + examples: + - elastic \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/filter.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/filter.yaml index cb6a77c215682..ba8507f87f051 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/filter.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/filter.yaml @@ -5,8 +5,9 @@ properties: type: object properties: alias: - type: string - nullable: true + type: + - "string" + - "null" controlledBy: type: string disabled: diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/notify_when.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/notify_when.yaml index 0dcd244fc33e4..bb68967b6f5cb 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/notify_when.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/notify_when.yaml @@ -8,4 +8,5 @@ enum: - onActionGroupChange - onActiveAlert - onThrottleInterval -example: onActiveAlert \ No newline at end of file +examples: + - onActiveAlert \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/params_es_query_rule.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/params_es_query_rule.yaml index 99b6a6f393a32..f51cbce979ab2 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/params_es_query_rule.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/params_es_query_rule.yaml @@ -35,12 +35,14 @@ oneOf: type: string enum: - esqlQuery - example: esqlQuery + examples: + - esqlQuery size: type: integer description: > When `searchType` is `esqlQuery`, this property is required but it does not affect the rule behavior. - example: 0 + examples: + - 0 termSize: $ref: 'termsize.yaml' threshold: @@ -60,7 +62,8 @@ oneOf: Since the `threshold` value must be `0`, the result is that an alert occurs whenever the query returns results. enum: - ">" - example: ">" + examples: + - ">" timeField: $ref: 'timefield.yaml' timeWindowSize: @@ -105,7 +108,8 @@ oneOf: properties: language: type: string - example: kuery + examples: + - kuery query: type: string searchType: @@ -113,7 +117,8 @@ oneOf: type: string enum: - searchSource - example: searchSource + examples: + - searchSource size: $ref: 'size.yaml' termField: @@ -165,7 +170,8 @@ oneOf: enum: - esQuery default: esQuery - example: esQuery + examples: + - esQuery size: $ref: 'size.yaml' termField: diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml index 13f62ba63e229..51310c87b6c5c 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml @@ -25,48 +25,60 @@ properties: api_key_created_by_user: type: boolean description: Indicates whether the API key that is associated with the rule was created by the user. - example: false + examples: + - false api_key_owner: - type: string + type: + - "string" + - "null" description: > The owner of the API key that is associated with the rule and used to run background tasks. - nullable: true - example: elastic + examples: + - elastic consumer: type: string description: The application or feature that owns the rule. For example, `alerts`, `apm`, `discover`, `infrastructure`, `logs`, `metrics`, `ml`, `monitoring`, `securitySolution`, `siem`, `stackAlerts`, or `uptime`. - example: alerts + examples: + - alerts created_at: type: string description: The date and time that the rule was created. format: date-time - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' created_by: - type: string + type: + - "string" + - "null" description: The identifier for the user that created the rule. - nullable: true - example: elastic + examples: + - elastic enabled: type: boolean description: Indicates whether the rule is currently enabled. - example: true + examples: + - true execution_status: type: object properties: last_duration: type: integer - example: 55 + examples: + - 55 last_execution_date: type: string format: date-time - example: '2022-12-06T00:13:43.890Z' + examples: + - '2022-12-06T00:13:43.890Z' status: type: string - example: ok + examples: + - ok id: type: string description: The identifier for the rule. - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef last_run: type: object properties: @@ -83,39 +95,49 @@ properties: type: integer outcome: type: string - example: succeeded + examples: + - succeeded outcome_msg: - type: array + type: + - "array" + - "null" items: type: string - nullable: true outcome_order: type: integer warning: - type: string - nullable: true - example: null + type: + - "string" + - "null" + examples: + - null muted_alert_ids: - type: array - nullable: true + type: + - "array" + - "null" items: type: string mute_all: type: boolean - example: false + examples: + - false name: type: string description: The name of the rule. - example: cluster_health_rule + examples: + - cluster_health_rule next_run: - type: string + type: + - "string" + - "null" format: date-time - nullable: true - example: '2022-12-06T00:14:43.818Z' + examples: + - '2022-12-06T00:14:43.818Z' notify_when: - type: string + type: + - "string" + - "null" description: Indicates how often alerts generate actions. - nullable: true params: type: object description: The parameters for the rule. @@ -127,7 +149,8 @@ properties: type: string description: > The identifier for the type of rule. For example, `.es-query`, `.index-threshold`, `logs.alert.document.count`, `monitoring_alert_cluster_health`, `siem.thresholdRule`, or `xpack.ml.anomaly_detection_alert`. - example: monitoring_alert_cluster_health + examples: + - monitoring_alert_cluster_health running: type: boolean description: Indicates whether the rule is running. @@ -135,7 +158,8 @@ properties: $ref: 'schedule.yaml' scheduled_task_id: type: string - example: b530fed0-74f5-11ed-9801-35303b735aef + examples: + - b530fed0-74f5-11ed-9801-35303b735aef tags: $ref: 'tags.yaml' throttle: @@ -143,9 +167,12 @@ properties: updated_at: type: string description: The date and time that the rule was updated most recently. - example: '2022-12-05T23:36:58.284Z' + examples: + - '2022-12-05T23:36:58.284Z' updated_by: - type: string + type: + - "string" + - "null" description: The identifier for the user that updated this rule most recently. - nullable: true - example: elastic \ No newline at end of file + examples: + - elastic \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/schedule.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/schedule.yaml index 57ddf84ceb413..75e98d9a8d193 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/schedule.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/schedule.yaml @@ -3,4 +3,5 @@ description: The check interval, which specifies how frequently the rule conditi properties: interval: type: string - example: 1m \ No newline at end of file + examples: + - 1m \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/threshold.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/threshold.yaml index 4d646f637522d..7060ecf4e91a0 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/threshold.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/threshold.yaml @@ -4,4 +4,5 @@ description: > type: array items: type: integer - example: 4000 \ No newline at end of file + examples: + - 4000 \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/thresholdcomparator.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/thresholdcomparator.yaml index 3459365ee0a1d..dd39d4c0bdc3a 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/thresholdcomparator.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/thresholdcomparator.yaml @@ -7,4 +7,5 @@ enum: - "<=" - between - notBetween -example: ">" \ No newline at end of file +examples: + - ">" \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/throttle.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/throttle.yaml index 19d8e621cdaf1..f45573dac8abb 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/throttle.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/throttle.yaml @@ -1,9 +1,11 @@ -type: string +type: + - "string" + - "null" description: > The throttle interval, which defines how often an alert generates repeated actions. It is specified in seconds, minutes, hours, or days and is applicable only if `notify_when` is set to `onThrottleInterval`. NOTE: You cannot specify the throttle interval at both the rule and action level. The recommended method is to set it for each action. If you set it at the rule level then update the rule in Kibana, it is automatically changed to use action-specific values. -nullable: true default: null -example: 10m \ No newline at end of file +examples: + - 10m \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowsize.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowsize.yaml index 7271f62f8dac2..137ae56a91672 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowsize.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowsize.yaml @@ -2,4 +2,5 @@ description: > The size of the time window (in `timeWindowUnit` units), which determines how far back to search for documents. Generally it should be a value higher than the rule check interval to avoid gaps in detection. type: integer -example: 5 \ No newline at end of file +examples: + - 5 \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowunit.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowunit.yaml index c0f2d458ae0e8..bc2cbf1bd3e1c 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowunit.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/timewindowunit.yaml @@ -6,4 +6,5 @@ enum: - m - h - d -example: "m" \ No newline at end of file +examples: + - "m" \ No newline at end of file diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/update_rule_request.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/update_rule_request.yaml index 58b6049aa1077..63293f76ca710 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/update_rule_request.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/update_rule_request.yaml @@ -12,7 +12,8 @@ properties: name: type: string description: The name of the rule. - example: cluster_health_rule + examples: + - cluster_health_rule notify_when: $ref: 'notify_when.yaml' params: diff --git a/x-pack/plugins/alerting/docs/openapi/entrypoint.yaml b/x-pack/plugins/alerting/docs/openapi/entrypoint.yaml index 5b3d70e78069d..39c46ca8513f9 100644 --- a/x-pack/plugins/alerting/docs/openapi/entrypoint.yaml +++ b/x-pack/plugins/alerting/docs/openapi/entrypoint.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Alerting description: OpenAPI schema for alerting endpoints - version: '0.1' + version: '0.2' contact: name: Alerting Team license: @@ -68,7 +68,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' security: - basicAuth: [] - apiKeyAuth: [] diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@_health.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@_health.yaml index 5b856e24ca997..25ae1cb0b9fc6 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@_health.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@_health.yaml @@ -28,7 +28,8 @@ get: properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -36,14 +37,16 @@ get: timestamp: type: string format: date-time - example: "2023-01-13T01:28:00.280Z" + examples: + - "2023-01-13T01:28:00.280Z" execution_health: type: object description: The timestamp and status of the rule run. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -51,14 +54,16 @@ get: timestamp: type: string format: date-time - example: "2023-01-13T01:28:00.280Z" + examples: + - "2023-01-13T01:28:00.280Z" read_health: type: object description: The timestamp and status of the rule reading events. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -66,15 +71,18 @@ get: timestamp: type: string format: date-time - example: "2023-01-13T01:28:00.280Z" + examples: + - "2023-01-13T01:28:00.280Z" has_permanent_encryption_key: type: boolean description: If `false`, the encrypted saved object plugin does not have a permanent encryption key. - example: true + examples: + - true is_sufficiently_secure: type: boolean description: If `false`, security is enabled but TLS is not. - example: true + examples: + - true examples: getAlertingHealthResponse: $ref: '../components/examples/get_health_response.yaml' diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}.yaml index a4d624110014c..96c5973c570c8 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}.yaml @@ -90,7 +90,8 @@ post: required: true schema: type: string - example: ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 + examples: + - ac4e6b90-6be7-11eb-ba0d-9b1c1f912d74 requestBody: required: true content: diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule_types.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule_types.yaml index 1dba3e085e2b7..41ec2aeadbe34 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule_types.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule_types.yaml @@ -186,14 +186,16 @@ get: minimum_license_required: description: The subscriptions required to use the rule type. type: string - example: basic + examples: + - basic name: description: The descriptive name of the rule type. type: string producer: description: An identifier for the application that produces this rule type. type: string - example: stackAlerts + examples: + - stackAlerts recovery_action_group: description: An action group to use when an alert goes from an active state to an inactive one. type: object @@ -204,7 +206,8 @@ get: type: string rule_task_timeout: type: string - example: 5m + examples: + - 5m examples: getRuleTypesResponse: $ref: '../components/examples/get_rule_types_response.yaml' diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rules@_find.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rules@_find.yaml index f512a0660f181..8055b4b5310a5 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rules@_find.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rules@_find.yaml @@ -19,7 +19,8 @@ get: schema: type: string default: OR - example: OR + examples: + - OR - name: fields in: query description: The fields to return in the `attributes` key of the response. @@ -53,14 +54,16 @@ get: schema: type: integer default: 1 - example: 1 + examples: + - 1 - name: per_page in: query description: The number of rules to return per page. schema: type: integer default: 20 - example: 20 + examples: + - 20 - name: search in: query description: An Elasticsearch simple_query_string query that filters the objects in the response. @@ -91,7 +94,8 @@ get: - asc - desc default: desc - example: asc + examples: + - asc responses: '200': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_find.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_find.yaml index 32dcbbf218a34..2cc8acdf5c5ac 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_find.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_find.yaml @@ -17,7 +17,8 @@ get: schema: type: string default: OR - example: OR + examples: + - OR - name: fields in: query description: The fields to return in the `attributes` key of the response. @@ -51,14 +52,16 @@ get: schema: type: integer default: 1 - example: 1 + examples: + - 1 - name: per_page in: query description: The number of alerts to return per page. schema: type: integer default: 20 - example: 20 + examples: + - 20 - name: search in: query description: An Elasticsearch `simple_query_string` query that filters the alerts in the response. @@ -89,7 +92,8 @@ get: - asc - desc default: desc - example: asc + examples: + - asc responses: '200': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_health.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_health.yaml index eba22ac1b4092..593977bd384d3 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_health.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@_health.yaml @@ -26,7 +26,8 @@ get: properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -34,14 +35,16 @@ get: timestamp: type: string format: date-time - example: "2023-01-13T01:28:00.280Z" + examples: + - "2023-01-13T01:28:00.280Z" executionHealth: type: object description: The timestamp and status of the alert execution. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -49,14 +52,16 @@ get: timestamp: type: string format: date-time - example: "2023-01-13T01:28:00.280Z" + examples: + - "2023-01-13T01:28:00.280Z" readHealth: type: object description: The timestamp and status of the alert reading events. properties: status: type: string - example: ok + examples: + - ok enum: - error - ok @@ -64,15 +69,18 @@ get: timestamp: type: string format: date-time - example: "2023-01-13T01:28:00.280Z" + examples: + - "2023-01-13T01:28:00.280Z" hasPermanentEncryptionKey: type: boolean description: If `false`, the encrypted saved object plugin does not have a permanent encryption key. - example: true + examples: + - true isSufficientlySecure: type: boolean description: If `false`, security is enabled but TLS is not. - example: true + examples: + - true '401': description: Authorization information is missing or invalid. content: diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}.yaml index 4af612fc150c5..48a1b12984b4c 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}.yaml @@ -16,7 +16,8 @@ delete: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. @@ -42,7 +43,8 @@ get: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '200': description: Indicates a successful call. @@ -72,7 +74,8 @@ post: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 - $ref: '../components/parameters/space_id.yaml' requestBody: required: true @@ -146,7 +149,8 @@ post: interval: type: string description: The interval format specifies the interval in seconds, minutes, hours or days at which the alert should execute. - example: "10s" + examples: + - "10s" tags: type: array items: @@ -189,7 +193,8 @@ put: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 requestBody: required: true content: @@ -251,7 +256,8 @@ put: interval: type: string description: The interval format specifies the interval in seconds, minutes, hours or days at which the alert should execute. - example: "1d" + examples: + - "1d" tags: type: array items: diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_disable.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_disable.yaml index 62fc4de90cae9..a383c71ed0eae 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_disable.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_disable.yaml @@ -14,7 +14,8 @@ post: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_enable.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_enable.yaml index 85ede004c1890..19b782ea3cccb 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_enable.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_enable.yaml @@ -14,7 +14,8 @@ post: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_mute_all.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_mute_all.yaml index 6507cf6da6a18..64c28317025a4 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_mute_all.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_mute_all.yaml @@ -14,7 +14,8 @@ post: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_unmute_all.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_unmute_all.yaml index 17c48dae2677b..63fa1d2aa50fa 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_unmute_all.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@_unmute_all.yaml @@ -14,7 +14,8 @@ post: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 responses: '204': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_mute.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_mute.yaml index 439445aa29a82..0f2620aff6a1e 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_mute.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_mute.yaml @@ -14,14 +14,16 @@ post: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 - in: path name: alertInstanceId description: An identifier for the alert instance. required: true schema: type: string - example: dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 + examples: + - dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 responses: '204': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_unmute.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_unmute.yaml index 3a7fe8dc1d31a..7b1b6abeab392 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_unmute.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerts@alert@{alertid}@alert_instance@{alertinstanceid}@_unmute.yaml @@ -14,14 +14,16 @@ post: required: true schema: type: string - example: 41893910-6bca-11eb-9e0d-85d233e3ee35 + examples: + - 41893910-6bca-11eb-9e0d-85d233e3ee35 - in: path name: alertInstanceId description: An identifier for the alert instance. required: true schema: type: string - example: dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 + examples: + - dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 responses: '204': description: Indicates a successful call. diff --git a/x-pack/plugins/alerting/server/application/alerts_filter_query/constants.ts b/x-pack/plugins/alerting/server/application/alerts_filter_query/constants.ts new file mode 100644 index 0000000000000..bce6890c22f2c --- /dev/null +++ b/x-pack/plugins/alerting/server/application/alerts_filter_query/constants.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const filterStateStore = { + APP_STATE: 'appState', + GLOBAL_STATE: 'globalState', +} as const; + +export type FilterStateStore = typeof filterStateStore[keyof typeof filterStateStore]; diff --git a/x-pack/plugins/alerting/server/application/alerts_filter_query/schemas/alerts_filter_query_schemas.ts b/x-pack/plugins/alerting/server/application/alerts_filter_query/schemas/alerts_filter_query_schemas.ts new file mode 100644 index 0000000000000..bf5a24b6e4399 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/alerts_filter_query/schemas/alerts_filter_query_schemas.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 { schema } from '@kbn/config-schema'; +import { filterStateStore } from '../constants'; + +export const alertsFilterQuerySchema = schema.object({ + kql: schema.string(), + filters: schema.arrayOf( + schema.object({ + query: schema.maybe(schema.recordOf(schema.string(), schema.any())), + meta: schema.recordOf(schema.string(), schema.any()), + $state: schema.maybe( + schema.object({ + store: schema.oneOf([ + schema.literal(filterStateStore.APP_STATE), + schema.literal(filterStateStore.GLOBAL_STATE), + ]), + }) + ), + }) + ), + dsl: schema.maybe(schema.string()), +}); diff --git a/x-pack/plugins/alerting/server/application/alerts_filter_query/schemas/index.ts b/x-pack/plugins/alerting/server/application/alerts_filter_query/schemas/index.ts new file mode 100644 index 0000000000000..5042e3e8265a6 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/alerts_filter_query/schemas/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 { alertsFilterQuerySchema } from './alerts_filter_query_schemas'; diff --git a/x-pack/plugins/alerting/server/application/alerts_filter_query/types/alerts_filter_query.ts b/x-pack/plugins/alerting/server/application/alerts_filter_query/types/alerts_filter_query.ts new file mode 100644 index 0000000000000..926d27e89fa94 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/alerts_filter_query/types/alerts_filter_query.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TypeOf } from '@kbn/config-schema'; +import { alertsFilterQuerySchema } from '../schemas/alerts_filter_query_schemas'; + +export type AlertsFilterQuery = TypeOf; diff --git a/x-pack/plugins/alerting/server/application/alerts_filter_query/types/index.ts b/x-pack/plugins/alerting/server/application/alerts_filter_query/types/index.ts new file mode 100644 index 0000000000000..2553fd0005904 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/alerts_filter_query/types/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { AlertsFilterQuery } from './alerts_filter_query'; diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/constants.ts b/x-pack/plugins/alerting/server/application/maintenance_window/constants.ts index caa1616d10a7c..4b5920d645584 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/constants.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/constants.ts @@ -13,8 +13,12 @@ export const maintenanceWindowStatus = { } as const; export const maintenanceWindowCategoryIdTypes = { - KIBANA: 'kibana', OBSERVABILITY: 'observability', SECURITY_SOLUTION: 'securitySolution', MANAGEMENT: 'management', } as const; + +export const filterStateStore = { + APP_STATE: 'appState', + GLOBAL_STATE: 'globalState', +} as const; diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/lib/generate_maintenance_window_events.ts b/x-pack/plugins/alerting/server/application/maintenance_window/lib/generate_maintenance_window_events.ts index 99f8e99f3f5e3..78227dab5864a 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/lib/generate_maintenance_window_events.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/lib/generate_maintenance_window_events.ts @@ -8,7 +8,8 @@ import _ from 'lodash'; import moment from 'moment-timezone'; import { RRule, Weekday } from '@kbn/rrule'; -import { RRuleParams, MaintenanceWindowSOAttributes, DateRange } from '../../../../common'; +import { RRuleParams, DateRange } from '../../../../common'; +import { MaintenanceWindow } from '../types'; export interface GenerateMaintenanceWindowEventsParams { rRule: RRuleParams; @@ -58,7 +59,7 @@ export const shouldRegenerateEvents = ({ rRule, duration, }: { - maintenanceWindow: MaintenanceWindowSOAttributes; + maintenanceWindow: MaintenanceWindow; rRule?: RRuleParams; duration?: number; }): boolean => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts index 1de657bdfd6ef..af04b62bfc7d9 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.test.ts @@ -133,6 +133,124 @@ describe('MaintenanceWindowClient - create', () => { ); }); + it('should create maintenance window with scoped query', async () => { + jest.useFakeTimers().setSystemTime(new Date('2023-02-26T00:00:00.000Z')); + + const mockMaintenanceWindow = getMockMaintenanceWindow({ + expirationDate: moment(new Date()).tz('UTC').add(1, 'year').toISOString(), + }); + + savedObjectsClient.create.mockResolvedValueOnce({ + attributes: mockMaintenanceWindow, + version: '123', + id: 'test-id', + } as unknown as SavedObject); + + await createMaintenanceWindow(mockContext, { + data: { + title: mockMaintenanceWindow.title, + duration: mockMaintenanceWindow.duration, + rRule: mockMaintenanceWindow.rRule as CreateMaintenanceWindowParams['data']['rRule'], + categoryIds: ['observability', 'securitySolution'], + scopedQuery: { + kql: "_id: '1234'", + filters: [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'kibana.alert.action_group', + field: 'kibana.alert.action_group', + params: { + query: 'test', + }, + type: 'phrase', + }, + $state: { + store: 'appState', + }, + query: { + match_phrase: { + 'kibana.alert.action_group': 'test', + }, + }, + }, + ], + }, + }, + }); + + expect(savedObjectsClient.create).toHaveBeenLastCalledWith( + MAINTENANCE_WINDOW_SAVED_OBJECT_TYPE, + expect.objectContaining({ + title: mockMaintenanceWindow.title, + duration: mockMaintenanceWindow.duration, + rRule: mockMaintenanceWindow.rRule, + enabled: true, + expirationDate: moment(new Date()).tz('UTC').add(1, 'year').toISOString(), + categoryIds: ['observability', 'securitySolution'], + ...updatedMetadata, + }), + { + id: expect.any(String), + } + ); + + expect( + (savedObjectsClient.create.mock.calls[0][1] as MaintenanceWindow).scopedQuery!.kql + ).toEqual(`_id: '1234'`); + + expect( + (savedObjectsClient.create.mock.calls[0][1] as MaintenanceWindow).scopedQuery!.filters[0] + ).toEqual({ + $state: { store: 'appState' }, + meta: { + alias: null, + disabled: false, + field: 'kibana.alert.action_group', + key: 'kibana.alert.action_group', + negate: false, + params: { query: 'test' }, + type: 'phrase', + }, + query: { match_phrase: { 'kibana.alert.action_group': 'test' } }, + }); + + expect( + (savedObjectsClient.create.mock.calls[0][1] as MaintenanceWindow).scopedQuery!.dsl + ).toMatchInlineSnapshot( + `"{\\"bool\\":{\\"must\\":[],\\"filter\\":[{\\"bool\\":{\\"should\\":[{\\"match\\":{\\"_id\\":\\"'1234'\\"}}],\\"minimum_should_match\\":1}},{\\"match_phrase\\":{\\"kibana.alert.action_group\\":\\"test\\"}}],\\"should\\":[],\\"must_not\\":[]}}"` + ); + }); + + it('should throw if trying to create a maintenance window with invalid scoped query', async () => { + jest.useFakeTimers().setSystemTime(new Date('2023-02-26T00:00:00.000Z')); + + const mockMaintenanceWindow = getMockMaintenanceWindow({ + expirationDate: moment(new Date()).tz('UTC').add(1, 'year').toISOString(), + }); + + await expect(async () => { + await createMaintenanceWindow(mockContext, { + data: { + title: mockMaintenanceWindow.title, + duration: mockMaintenanceWindow.duration, + rRule: mockMaintenanceWindow.rRule as CreateMaintenanceWindowParams['data']['rRule'], + categoryIds: ['observability', 'securitySolution'], + scopedQuery: { + kql: 'invalid: ', + filters: [], + }, + }, + }); + }).rejects.toThrowErrorMatchingInlineSnapshot(` + "Error validating create maintenance scoped query - Expected \\"(\\", \\"{\\", value, whitespace but end of input found. + invalid: + ---------^" + `); + }); + it('should throw if trying to create a maintenance window with invalid category ids', async () => { jest.useFakeTimers().setSystemTime(new Date('2023-02-26T00:00:00.000Z')); diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts index b8fba87b2fc18..78f5e885874b0 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/create_maintenance_window.ts @@ -8,6 +8,7 @@ import moment from 'moment'; import Boom from '@hapi/boom'; import { SavedObjectsUtils } from '@kbn/core/server'; +import { buildEsQuery, Filter } from '@kbn/es-query'; import { generateMaintenanceWindowEvents } from '../../lib/generate_maintenance_window_events'; import type { MaintenanceWindowClientContext } from '../../../../../common'; import type { MaintenanceWindow } from '../../types'; @@ -25,7 +26,7 @@ export async function createMaintenanceWindow( ): Promise { const { data } = params; const { savedObjectsClient, getModificationMetadata, logger } = context; - const { title, duration, rRule, categoryIds } = data; + const { title, duration, rRule, categoryIds, scopedQuery } = data; try { createMaintenanceWindowParamsSchema.validate(params); @@ -33,6 +34,25 @@ export async function createMaintenanceWindow( throw Boom.badRequest(`Error validating create maintenance window data - ${error.message}`); } + let scopedQueryWithGeneratedValue = scopedQuery; + try { + if (scopedQuery) { + const dsl = JSON.stringify( + buildEsQuery( + undefined, + [{ query: scopedQuery.kql, language: 'kuery' }], + scopedQuery.filters as Filter[] + ) + ); + scopedQueryWithGeneratedValue = { + ...scopedQuery, + dsl, + }; + } + } catch (error) { + throw Boom.badRequest(`Error validating create maintenance scoped query - ${error.message}`); + } + const id = SavedObjectsUtils.generateId(); const expirationDate = moment().utc().add(1, 'year').toISOString(); const modificationMetadata = await getModificationMetadata(); @@ -43,6 +63,7 @@ export async function createMaintenanceWindow( enabled: true, expirationDate, categoryIds, + scopedQuery: scopedQueryWithGeneratedValue, rRule: rRule as MaintenanceWindow['rRule'], duration, events, diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/schemas/create_maintenance_window_params_schema.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/schemas/create_maintenance_window_params_schema.ts index dcb9150f2385b..b55a4871d0b6f 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/schemas/create_maintenance_window_params_schema.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/create/schemas/create_maintenance_window_params_schema.ts @@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema'; import { maintenanceWindowCategoryIdsSchema } from '../../../schemas'; import { rRuleRequestSchema } from '../../../../r_rule/schemas'; +import { alertsFilterQuerySchema } from '../../../../alerts_filter_query/schemas'; export const createMaintenanceWindowParamsSchema = schema.object({ data: schema.object({ @@ -15,5 +16,6 @@ export const createMaintenanceWindowParamsSchema = schema.object({ duration: schema.number(), rRule: rRuleRequestSchema, categoryIds: maintenanceWindowCategoryIdsSchema, + scopedQuery: schema.maybe(schema.nullable(alertsFilterQuerySchema)), }), }); diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/schemas/update_maintenance_window_params_schema.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/schemas/update_maintenance_window_params_schema.ts index 84120a5ee8c44..1aca8ab24fcda 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/schemas/update_maintenance_window_params_schema.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/schemas/update_maintenance_window_params_schema.ts @@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema'; import { maintenanceWindowCategoryIdsSchema } from '../../../schemas'; import { rRuleRequestSchema } from '../../../../r_rule/schemas'; +import { alertsFilterQuerySchema } from '../../../../alerts_filter_query/schemas'; export const updateMaintenanceWindowParamsSchema = schema.object({ id: schema.string(), @@ -17,5 +18,6 @@ export const updateMaintenanceWindowParamsSchema = schema.object({ duration: schema.maybe(schema.number()), rRule: schema.maybe(rRuleRequestSchema), categoryIds: maintenanceWindowCategoryIdsSchema, + scopedQuery: schema.maybe(schema.nullable(alertsFilterQuerySchema)), }), }); diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts index 966808fed57f2..4caef4eca1ba1 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts @@ -207,6 +207,172 @@ describe('MaintenanceWindowClient - update', () => { ); }); + it('should update maintenance window with scoped query', async () => { + jest.useFakeTimers().setSystemTime(new Date(firstTimestamp)); + + const modifiedEvents = [ + { gte: '2023-03-26T00:00:00.000Z', lte: '2023-03-26T00:12:34.000Z' }, + { gte: '2023-04-01T23:00:00.000Z', lte: '2023-04-01T23:43:21.000Z' }, + ]; + const mockMaintenanceWindow = getMockMaintenanceWindow({ + rRule: { + tzid: 'CET', + dtstart: '2023-03-26T00:00:00.000Z', + freq: Frequency.WEEKLY, + count: 5, + } as MaintenanceWindow['rRule'], + events: modifiedEvents, + expirationDate: moment(new Date(firstTimestamp)).tz('UTC').add(2, 'week').toISOString(), + }); + + savedObjectsClient.get.mockResolvedValue({ + attributes: mockMaintenanceWindow, + version: '123', + id: 'test-id', + } as unknown as SavedObject); + + savedObjectsClient.create.mockResolvedValue({ + attributes: { + ...mockMaintenanceWindow, + ...updatedAttributes, + ...updatedMetadata, + }, + id: 'test-id', + } as unknown as SavedObject); + + await updateMaintenanceWindow(mockContext, { + id: 'test-id', + data: { + scopedQuery: { + kql: "_id: '1234'", + filters: [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'kibana.alert.action_group', + field: 'kibana.alert.action_group', + params: { + query: 'test', + }, + type: 'phrase', + }, + $state: { + store: 'appState', + }, + query: { + match_phrase: { + 'kibana.alert.action_group': 'test', + }, + }, + }, + ], + }, + }, + }); + + expect( + (savedObjectsClient.create.mock.calls[0][1] as MaintenanceWindow).scopedQuery!.kql + ).toEqual(`_id: '1234'`); + + expect( + (savedObjectsClient.create.mock.calls[0][1] as MaintenanceWindow).scopedQuery!.filters[0] + ).toEqual({ + $state: { store: 'appState' }, + meta: { + alias: null, + disabled: false, + field: 'kibana.alert.action_group', + key: 'kibana.alert.action_group', + negate: false, + params: { query: 'test' }, + type: 'phrase', + }, + query: { match_phrase: { 'kibana.alert.action_group': 'test' } }, + }); + + expect( + (savedObjectsClient.create.mock.calls[0][1] as MaintenanceWindow).scopedQuery!.dsl + ).toMatchInlineSnapshot( + `"{\\"bool\\":{\\"must\\":[],\\"filter\\":[{\\"bool\\":{\\"should\\":[{\\"match\\":{\\"_id\\":\\"'1234'\\"}}],\\"minimum_should_match\\":1}},{\\"match_phrase\\":{\\"kibana.alert.action_group\\":\\"test\\"}}],\\"should\\":[],\\"must_not\\":[]}}"` + ); + }); + + it('should remove maintenance window with scoped query', async () => { + jest.useFakeTimers().setSystemTime(new Date(firstTimestamp)); + + const modifiedEvents = [ + { gte: '2023-03-26T00:00:00.000Z', lte: '2023-03-26T00:12:34.000Z' }, + { gte: '2023-04-01T23:00:00.000Z', lte: '2023-04-01T23:43:21.000Z' }, + ]; + const mockMaintenanceWindow = getMockMaintenanceWindow({ + rRule: { + tzid: 'CET', + dtstart: '2023-03-26T00:00:00.000Z', + freq: Frequency.WEEKLY, + count: 5, + } as MaintenanceWindow['rRule'], + events: modifiedEvents, + expirationDate: moment(new Date(firstTimestamp)).tz('UTC').add(2, 'week').toISOString(), + }); + + savedObjectsClient.get.mockResolvedValue({ + attributes: mockMaintenanceWindow, + version: '123', + id: 'test-id', + } as unknown as SavedObject); + + savedObjectsClient.create.mockResolvedValue({ + attributes: { + ...mockMaintenanceWindow, + ...updatedAttributes, + ...updatedMetadata, + }, + id: 'test-id', + } as unknown as SavedObject); + + await updateMaintenanceWindow(mockContext, { + id: 'test-id', + data: { + scopedQuery: null, + }, + }); + + expect( + (savedObjectsClient.create.mock.calls[0][1] as MaintenanceWindow).scopedQuery + ).toBeNull(); + }); + + it('should throw if updating a maintenance window with invalid scoped query', async () => { + jest.useFakeTimers().setSystemTime(new Date(firstTimestamp)); + const mockMaintenanceWindow = getMockMaintenanceWindow({ + expirationDate: moment(new Date(firstTimestamp)).tz('UTC').subtract(1, 'year').toISOString(), + }); + + savedObjectsClient.get.mockResolvedValueOnce({ + attributes: mockMaintenanceWindow, + version: '123', + id: 'test-id', + } as unknown as SavedObject); + + await expect(async () => { + await updateMaintenanceWindow(mockContext, { + id: 'test-id', + data: { + scopedQuery: { + kql: 'invalid: ', + filters: [], + }, + }, + }); + }).rejects.toThrowErrorMatchingInlineSnapshot(` + "Error validating update maintenance scoped query - Expected \\"(\\", \\"{\\", value, whitespace but end of input found. + invalid: + ---------^" + `); + }); + it('should throw if updating a maintenance window that has expired', async () => { jest.useFakeTimers().setSystemTime(new Date(firstTimestamp)); const mockMaintenanceWindow = getMockMaintenanceWindow({ diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts index f10381defc9b9..6b7ab69cc8070 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts @@ -7,6 +7,7 @@ import moment from 'moment'; import Boom from '@hapi/boom'; +import { buildEsQuery, Filter } from '@kbn/es-query'; import type { MaintenanceWindowClientContext } from '../../../../../common'; import type { MaintenanceWindow } from '../../types'; import { @@ -45,7 +46,7 @@ async function updateWithOCC( ): Promise { const { savedObjectsClient, getModificationMetadata, logger } = context; const { id, data } = params; - const { title, enabled, duration, rRule, categoryIds } = data; + const { title, enabled, duration, rRule, categoryIds, scopedQuery } = data; try { updateMaintenanceWindowParamsSchema.validate(params); @@ -53,6 +54,25 @@ async function updateWithOCC( throw Boom.badRequest(`Error validating update maintenance window data - ${error.message}`); } + let scopedQueryWithGeneratedValue = scopedQuery; + try { + if (scopedQuery) { + const dsl = JSON.stringify( + buildEsQuery( + undefined, + [{ query: scopedQuery.kql, language: 'kuery' }], + scopedQuery.filters as Filter[] + ) + ); + scopedQueryWithGeneratedValue = { + ...scopedQuery, + dsl, + }; + } + } catch (error) { + throw Boom.badRequest(`Error validating update maintenance scoped query - ${error.message}`); + } + try { const { attributes, @@ -88,6 +108,9 @@ async function updateWithOCC( ...(title ? { title } : {}), ...(rRule ? { rRule: rRule as MaintenanceWindow['rRule'] } : {}), ...(categoryIds !== undefined ? { categoryIds } : {}), + ...(scopedQueryWithGeneratedValue !== undefined + ? { scopedQuery: scopedQueryWithGeneratedValue } + : {}), ...(typeof duration === 'number' ? { duration } : {}), ...(typeof enabled === 'boolean' ? { enabled } : {}), expirationDate, diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/schemas/maintenance_window_schemas.ts b/x-pack/plugins/alerting/server/application/maintenance_window/schemas/maintenance_window_schemas.ts index 080f5b1bbe676..cf9b69454aa9e 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/schemas/maintenance_window_schemas.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/schemas/maintenance_window_schemas.ts @@ -8,6 +8,7 @@ import { schema } from '@kbn/config-schema'; import { maintenanceWindowStatus, maintenanceWindowCategoryIdTypes } from '../constants'; import { rRuleSchema } from '../../r_rule/schemas'; +import { alertsFilterQuerySchema } from '../../alerts_filter_query/schemas'; export const maintenanceWindowEventSchema = schema.object({ gte: schema.string(), @@ -47,4 +48,5 @@ export const maintenanceWindowSchema = schema.object({ schema.literal(maintenanceWindowStatus.ARCHIVED), ]), categoryIds: maintenanceWindowCategoryIdsSchema, + scopedQuery: schema.maybe(schema.nullable(alertsFilterQuerySchema)), }); diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_attributes_to_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_attributes_to_maintenance_window.ts index 53996f29694f4..6a2f25ce18dd9 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_attributes_to_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_attributes_to_maintenance_window.ts @@ -40,5 +40,6 @@ export const transformMaintenanceWindowAttributesToMaintenanceWindow = ( eventEndTime, status, ...(attributes.categoryIds !== undefined ? { categoryIds: attributes.categoryIds } : {}), + ...(attributes.scopedQuery !== undefined ? { scopedQuery: attributes.scopedQuery } : {}), }; }; diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_to_maintenance_window_attributes.ts b/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_to_maintenance_window_attributes.ts index 35865f38aa9b2..9d26443bdc07d 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_to_maintenance_window_attributes.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/transforms/transform_maintenance_window_to_maintenance_window_attributes.ts @@ -25,5 +25,8 @@ export const transformMaintenanceWindowToMaintenanceWindowAttributes = ( ...(maintenanceWindow.categoryIds !== undefined ? { categoryIds: maintenanceWindow.categoryIds } : {}), + ...(maintenanceWindow.scopedQuery !== undefined + ? { scopedQuery: maintenanceWindow.scopedQuery } + : {}), }; }; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts index 294945ad82037..996f67448c7f8 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts @@ -489,7 +489,7 @@ async function updateRuleAttributesAndParamsInMemory( context, operations, rule: ruleDomain, - ruleActions, + ruleActions: ruleActions as RuleDomain['actions'], // TODO (http-versioning) Remove this cast once we fix injectReferencesIntoActions ruleType, }); diff --git a/x-pack/plugins/alerting/server/application/rule/schemas/action_schemas.ts b/x-pack/plugins/alerting/server/application/rule/schemas/action_schemas.ts index 579f41adb0424..7cbadb6199081 100644 --- a/x-pack/plugins/alerting/server/application/rule/schemas/action_schemas.ts +++ b/x-pack/plugins/alerting/server/application/rule/schemas/action_schemas.ts @@ -7,31 +7,10 @@ import { schema } from '@kbn/config-schema'; import { notifyWhenSchema } from './notify_when_schema'; -import { filterStateStore } from '../constants'; +import { alertsFilterQuerySchema } from '../../alerts_filter_query/schemas'; export const actionParamsSchema = schema.recordOf(schema.string(), schema.maybe(schema.any())); -const actionAlertsFilterQueryFiltersSchema = schema.arrayOf( - schema.object({ - query: schema.maybe(schema.recordOf(schema.string(), schema.any())), - meta: schema.recordOf(schema.string(), schema.any()), - $state: schema.maybe( - schema.object({ - store: schema.oneOf([ - schema.literal(filterStateStore.APP_STATE), - schema.literal(filterStateStore.GLOBAL_STATE), - ]), - }) - ), - }) -); - -const actionDomainAlertsFilterQuerySchema = schema.object({ - kql: schema.string(), - filters: actionAlertsFilterQueryFiltersSchema, - dsl: schema.maybe(schema.string()), -}); - const actionAlertsFilterTimeFrameSchema = schema.object({ days: schema.arrayOf( schema.oneOf([ @@ -52,7 +31,7 @@ const actionAlertsFilterTimeFrameSchema = schema.object({ }); const actionDomainAlertsFilterSchema = schema.object({ - query: schema.maybe(actionDomainAlertsFilterQuerySchema), + query: schema.maybe(alertsFilterQuerySchema), timeframe: schema.maybe(actionAlertsFilterTimeFrameSchema), }); @@ -76,17 +55,8 @@ export const actionDomainSchema = schema.object({ useAlertDataAsTemplate: schema.maybe(schema.boolean()), }); -/** - * Sanitized (non-domain) action schema, returned by rules clients for other solutions - */ -const actionAlertsFilterQuerySchema = schema.object({ - kql: schema.string(), - filters: actionAlertsFilterQueryFiltersSchema, - dsl: schema.maybe(schema.string()), -}); - export const actionAlertsFilterSchema = schema.object({ - query: schema.maybe(actionAlertsFilterQuerySchema), + query: schema.maybe(alertsFilterQuerySchema), timeframe: schema.maybe(actionAlertsFilterTimeFrameSchema), }); diff --git a/x-pack/plugins/alerting/server/data/alerts_filter_query/constants.ts b/x-pack/plugins/alerting/server/data/alerts_filter_query/constants.ts new file mode 100644 index 0000000000000..bce6890c22f2c --- /dev/null +++ b/x-pack/plugins/alerting/server/data/alerts_filter_query/constants.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const filterStateStore = { + APP_STATE: 'appState', + GLOBAL_STATE: 'globalState', +} as const; + +export type FilterStateStore = typeof filterStateStore[keyof typeof filterStateStore]; diff --git a/x-pack/plugins/alerting/server/data/alerts_filter_query/types/alerts_filter_query_attributes.ts b/x-pack/plugins/alerting/server/data/alerts_filter_query/types/alerts_filter_query_attributes.ts new file mode 100644 index 0000000000000..f740d8070abf2 --- /dev/null +++ b/x-pack/plugins/alerting/server/data/alerts_filter_query/types/alerts_filter_query_attributes.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FilterStateStore } from '../constants'; + +export interface AlertsFilterAttributes { + query?: Record; + meta: Record; + $state?: { + store: FilterStateStore; + }; +} + +export interface AlertsFilterQueryAttributes { + kql: string; + filters: AlertsFilterAttributes[]; + dsl?: string; +} diff --git a/x-pack/plugins/alerting/server/data/alerts_filter_query/types/index.ts b/x-pack/plugins/alerting/server/data/alerts_filter_query/types/index.ts new file mode 100644 index 0000000000000..6258f925b6e79 --- /dev/null +++ b/x-pack/plugins/alerting/server/data/alerts_filter_query/types/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { AlertsFilterQueryAttributes } from './alerts_filter_query_attributes'; diff --git a/x-pack/plugins/alerting/server/data/maintenance_window/types/maintenance_window_attributes.ts b/x-pack/plugins/alerting/server/data/maintenance_window/types/maintenance_window_attributes.ts index 91f4e95172551..afb217abaf139 100644 --- a/x-pack/plugins/alerting/server/data/maintenance_window/types/maintenance_window_attributes.ts +++ b/x-pack/plugins/alerting/server/data/maintenance_window/types/maintenance_window_attributes.ts @@ -6,7 +6,8 @@ */ import { RRuleAttributes } from '../../r_rule/types'; -import { MaintenanceWindowCategoryIdTypes } from '../constants'; +import type { MaintenanceWindowCategoryIdTypes } from '../constants'; +import { AlertsFilterQueryAttributes } from '../../alerts_filter_query/types'; export interface MaintenanceWindowEventAttributes { gte: string; @@ -25,4 +26,5 @@ export interface MaintenanceWindowAttributes { createdAt: string; updatedAt: string; categoryIds?: MaintenanceWindowCategoryIdTypes[] | null; + scopedQuery?: AlertsFilterQueryAttributes | null; } diff --git a/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts b/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts index aa8adda873cde..19a669e6bd33e 100644 --- a/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts +++ b/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts @@ -6,7 +6,6 @@ */ import type { SavedObjectAttributes } from '@kbn/core/server'; -import { Filter } from '@kbn/es-query'; import { IsoWeekday } from '../../../../common'; import { ruleNotifyWhenAttributes, @@ -16,6 +15,7 @@ import { ruleExecutionStatusWarningReasonAttributes, } from '../constants'; import { RRuleAttributes } from '../../r_rule/types'; +import { AlertsFilterQueryAttributes } from '../../alerts_filter_query/types'; export type RuleNotifyWhenAttributes = typeof ruleNotifyWhenAttributes[keyof typeof ruleNotifyWhenAttributes]; @@ -115,11 +115,7 @@ interface AlertsFilterTimeFrameAttributes { } interface AlertsFilterAttributes { - query?: { - kql: string; - filters: Filter[]; - dsl: string; - }; + query?: AlertsFilterQueryAttributes; timeframe?: AlertsFilterTimeFrameAttributes; } diff --git a/x-pack/plugins/alerting/server/lib/license_state.ts b/x-pack/plugins/alerting/server/lib/license_state.ts index c774673934ebf..99be775f7c3c6 100644 --- a/x-pack/plugins/alerting/server/lib/license_state.ts +++ b/x-pack/plugins/alerting/server/lib/license_state.ts @@ -13,7 +13,7 @@ import { capitalize } from 'lodash'; import { Observable, Subscription } from 'rxjs'; import { LicensingPluginStart } from '@kbn/licensing-plugin/server'; import { ILicense, LicenseType } from '@kbn/licensing-plugin/common/types'; -import { PLUGIN } from '../constants/plugin'; +import { PLUGIN } from '../../common/constants/plugin'; import { getRuleTypeFeatureUsageName } from './get_rule_type_feature_usage_name'; import { RuleType, diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/transforms/transform_create_body/v1.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/transforms/transform_create_body/v1.ts index 03627c258c5eb..6eaa77fc78624 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/transforms/transform_create_body/v1.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/create/transforms/transform_create_body/v1.ts @@ -16,5 +16,6 @@ export const transformCreateBody = ( duration: createBody.duration, rRule: createBody.r_rule, categoryIds: createBody.category_ids, + scopedQuery: createBody.scoped_query, }; }; diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/transforms/transform_update_body/v1.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/transforms/transform_update_body/v1.ts index 9da852bd6ebff..96c4e92d4934e 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/transforms/transform_update_body/v1.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/transforms/transform_update_body/v1.ts @@ -11,12 +11,21 @@ import { UpdateMaintenanceWindowParams } from '../../../../../../application/mai export const transformUpdateBody = ( updateBody: UpdateMaintenanceWindowRequestBodyV1 ): UpdateMaintenanceWindowParams['data'] => { - const { title, enabled, duration, r_rule: rRule, category_ids: categoryIds } = updateBody; + const { + title, + enabled, + duration, + r_rule: rRule, + category_ids: categoryIds, + scoped_query: scopedQuery, + } = updateBody; + return { ...(title !== undefined ? { title } : {}), ...(enabled !== undefined ? { enabled } : {}), ...(duration !== undefined ? { duration } : {}), ...(rRule !== undefined ? { rRule } : {}), ...(categoryIds !== undefined ? { categoryIds } : {}), + ...(scopedQuery !== undefined ? { scopedQuery } : {}), }; }; diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/transforms/transform_maintenance_window_to_response/v1.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/transforms/transform_maintenance_window_to_response/v1.ts index e6e0fb9a6aa42..2d21576773c29 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/transforms/transform_maintenance_window_to_response/v1.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/transforms/transform_maintenance_window_to_response/v1.ts @@ -29,5 +29,8 @@ export const transformMaintenanceWindowToResponse = ( ...(maintenanceWindow.categoryIds !== undefined ? { category_ids: maintenanceWindow.categoryIds } : {}), + ...(maintenanceWindow.scopedQuery !== undefined + ? { scoped_query: maintenanceWindow.scopedQuery } + : {}), }; }; diff --git a/x-pack/plugins/alerting/server/rule_type_registry.test.ts b/x-pack/plugins/alerting/server/rule_type_registry.test.ts index 8e01e7d05cbd1..709533bb898f2 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.test.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.test.ts @@ -782,6 +782,7 @@ describe('Create Lifecycle', () => { "defaultScheduleInterval": undefined, "doesSetRecoveryContext": false, "enabledInLicense": false, + "fieldsForAAD": undefined, "hasAlertsMappings": true, "hasFieldsForAAD": false, "id": "test", diff --git a/x-pack/plugins/alerting/server/rule_type_registry.ts b/x-pack/plugins/alerting/server/rule_type_registry.ts index d73d28950970e..fd32e58335e38 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.ts @@ -419,6 +419,7 @@ export class RuleTypeRegistry { name, minimumLicenseRequired ).isValid, + fieldsForAAD, hasFieldsForAAD: Boolean(fieldsForAAD), hasAlertsMappings: !!alerts, validLegacyConsumers, diff --git a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.ts b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.ts index d0ddc6b2f53cf..dbe1da9988851 100644 --- a/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.ts +++ b/x-pack/plugins/apm/common/agent_configuration/setting_definitions/index.ts @@ -12,7 +12,7 @@ import { PathReporter } from 'io-ts/lib/PathReporter'; import { AgentName } from '../../../typings/es_schemas/ui/fields/agent'; import { booleanRt } from '../runtime_types/boolean_rt'; import { getIntegerRt } from '../runtime_types/integer_rt'; -import { isRumOrMobileAgent } from '../../agent_name'; +import { isRumOrMobileAgentName } from '../../agent_name'; import { floatRt } from '../runtime_types/float_rt'; import { RawSettingDefinition, SettingDefinition } from './types'; import { generalSettings } from './general_settings'; @@ -106,7 +106,7 @@ export function filterByAgent(agentName?: AgentName) { // only options that apply to every agent (ignoring RUM) should be returned if (setting.excludeAgents) { - return setting.excludeAgents.every(isRumOrMobileAgent); + return setting.excludeAgents.every(isRumOrMobileAgentName); } return true; diff --git a/x-pack/plugins/apm/common/agent_name.test.ts b/x-pack/plugins/apm/common/agent_name.test.ts deleted file mode 100644 index 972ecb39fcecd..0000000000000 --- a/x-pack/plugins/apm/common/agent_name.test.ts +++ /dev/null @@ -1,213 +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 { - isJavaAgentName, - isRumAgentName, - isIosAgentName, - isAndroidAgentName, - isMobileAgentName, - isServerlessAgent, - isAWSLambdaAgent, - isAzureFunctionsAgent, -} from './agent_name'; - -import { ServerlessType } from './serverless'; - -describe('agent name helpers', () => { - describe('isJavaAgentName', () => { - describe('when the agent name is java', () => { - it('returns true', () => { - expect(isJavaAgentName('java')).toEqual(true); - }); - }); - - describe('when the agent name is opentelemetry/java', () => { - it('returns true', () => { - expect(isJavaAgentName('opentelemetry/java')).toEqual(true); - }); - }); - - describe('when the agent name is not java', () => { - it('returns false', () => { - expect(isJavaAgentName('not java')).toEqual(false); - }); - }); - }); - - describe('isRumAgentName', () => { - describe('when the agent name is js-base', () => { - it('returns true', () => { - expect(isRumAgentName('js-base')).toEqual(true); - }); - }); - - describe('when the agent name is rum-js', () => { - it('returns true', () => { - expect(isRumAgentName('rum-js')).toEqual(true); - }); - }); - - describe('when the agent name is opentelemetry/webjs', () => { - it('returns true', () => { - expect(isRumAgentName('opentelemetry/webjs')).toEqual(true); - }); - }); - - describe('when the agent name is something else', () => { - it('returns false', () => { - expect(isRumAgentName('not rum')).toEqual(false); - }); - }); - }); - - describe('isIosAgentName', () => { - describe('when the agent name is iOS/swift', () => { - it('returns true', () => { - expect(isIosAgentName('iOS/swift')).toEqual(true); - }); - }); - - describe('when the agent name is ios/swift', () => { - it('returns true', () => { - expect(isIosAgentName('ios/swift')).toEqual(true); - }); - }); - - describe('when the agent name is opentelemetry/swift', () => { - it('returns true', () => { - expect(isIosAgentName('opentelemetry/swift')).toEqual(false); - }); - }); - - describe('when the agent name is something else', () => { - it('returns false', () => { - expect(isIosAgentName('not ios')).toEqual(false); - }); - }); - }); - - describe('isAndroidAgentName', () => { - describe('when the agent name is android/java', () => { - it('returns true', () => { - expect(isAndroidAgentName('android/java')).toEqual(true); - }); - }); - - describe('when the agent name is opentelemetry/java', () => { - it('returns false', () => { - expect(isAndroidAgentName('opentelemetry/java')).toEqual(false); - }); - }); - - describe('when the agent name is something else', () => { - it('returns false', () => { - expect(isAndroidAgentName('not android')).toEqual(false); - }); - }); - }); - - describe('isMobileAgentName', () => { - describe('when the agent name is android/java', () => { - it('returns true', () => { - expect(isMobileAgentName('android/java')).toEqual(true); - }); - }); - - describe('when the agent name is iOS/swift', () => { - it('returns true', () => { - expect(isMobileAgentName('iOS/swift')).toEqual(true); - }); - }); - - describe('when the agent name is ios/swift', () => { - it('returns true', () => { - expect(isMobileAgentName('ios/swift')).toEqual(true); - }); - }); - - describe('when the agent name is opentelemetry/swift', () => { - it('returns true', () => { - expect(isMobileAgentName('opentelemetry/swift')).toEqual(false); - }); - }); - - describe('when the agent name is opentelemetry/java', () => { - it('returns false', () => { - expect(isMobileAgentName('opentelemetry/java')).toEqual(false); - }); - }); - - describe('when the agent name is something else', () => { - it('returns false', () => { - expect(isMobileAgentName('not mobile')).toEqual(false); - }); - }); - }); - - describe('isServerlessAgent', () => { - describe('when the serverlessType is AWS_LAMBDA', () => { - it('returns true', () => { - expect(isServerlessAgent(ServerlessType.AWS_LAMBDA)).toEqual(true); - }); - }); - - describe('when the serverlessType is AZURE_FUNCTIONS', () => { - it('returns true', () => { - expect(isServerlessAgent(ServerlessType.AZURE_FUNCTIONS)).toEqual(true); - }); - }); - - describe('when the serverlessType is undefined', () => { - it('returns false', () => { - expect(isServerlessAgent(undefined)).toEqual(false); - }); - }); - }); - - describe('isAWSLambdaAgent', () => { - describe('when the serverlessType is AWS_LAMBDA', () => { - it('returns true', () => { - expect(isAWSLambdaAgent(ServerlessType.AWS_LAMBDA)).toEqual(true); - }); - }); - - describe('when the serverlessType is AZURE_FUNCTIONS', () => { - it('returns true', () => { - expect(isAWSLambdaAgent(ServerlessType.AZURE_FUNCTIONS)).toEqual(false); - }); - }); - - describe('when the serverlessType is undefined', () => { - it('returns false', () => { - expect(isAWSLambdaAgent(undefined)).toEqual(false); - }); - }); - }); - - describe('isAzureFunctionsAgent', () => { - describe('when the serverlessType is AZURE_FUNCTIONS', () => { - it('returns true', () => { - expect(isAzureFunctionsAgent(ServerlessType.AZURE_FUNCTIONS)).toEqual( - true - ); - }); - }); - - describe('when the serverlessType is AWS_LAMBDA', () => { - it('returns true', () => { - expect(isAzureFunctionsAgent(ServerlessType.AWS_LAMBDA)).toEqual(false); - }); - }); - - describe('when the serverlessType is undefined', () => { - it('returns false', () => { - expect(isAzureFunctionsAgent(undefined)).toEqual(false); - }); - }); - }); -}); diff --git a/x-pack/plugins/apm/common/agent_name.ts b/x-pack/plugins/apm/common/agent_name.ts index 7782cc044e950..608fdf4975353 100644 --- a/x-pack/plugins/apm/common/agent_name.ts +++ b/x-pack/plugins/apm/common/agent_name.ts @@ -4,110 +4,20 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import { - AgentName, - OpenTelemetryAgentName, -} from '../typings/es_schemas/ui/fields/agent'; -import { ServerlessType } from './serverless'; - -/* - * Agent names can be any string. This list only defines the official agents - * that we might want to target specifically eg. linking to their documentation - * & telemetry reporting. Support additional agent types by appending - * definitions in mappings.json (for telemetry), the AgentName type, and the - * AGENT_NAMES array. - */ - -export const OPEN_TELEMETRY_AGENT_NAMES: AgentName[] = [ - 'otlp', - 'opentelemetry/cpp', - 'opentelemetry/dotnet', - 'opentelemetry/erlang', - 'opentelemetry/go', - 'opentelemetry/java', - 'opentelemetry/nodejs', - 'opentelemetry/php', - 'opentelemetry/python', - 'opentelemetry/ruby', - 'opentelemetry/rust', - 'opentelemetry/swift', - 'opentelemetry/webjs', -]; - -export const AGENT_NAMES: AgentName[] = [ - 'dotnet', - 'go', - 'iOS/swift', - 'java', - 'js-base', - 'nodejs', - 'php', - 'python', - 'ruby', - 'rum-js', - 'android/java', - ...OPEN_TELEMETRY_AGENT_NAMES, -]; - -export function isOpenTelemetryAgentName( - agentName: string -): agentName is OpenTelemetryAgentName { - return OPEN_TELEMETRY_AGENT_NAMES.includes(agentName as AgentName); -} - -export const JAVA_AGENT_NAMES: AgentName[] = ['java', 'opentelemetry/java']; - -export function isJavaAgentName( - agentName?: string -): agentName is 'java' | 'opentelemetry/java' { - return JAVA_AGENT_NAMES.includes(agentName! as AgentName); -} - -export const RUM_AGENT_NAMES: AgentName[] = [ - 'js-base', - 'rum-js', - 'opentelemetry/webjs', -]; - -export function isRumAgentName( - agentName?: string -): agentName is 'js-base' | 'rum-js' | 'opentelemetry/webjs' { - return RUM_AGENT_NAMES.includes(agentName! as AgentName); -} - -export function isMobileAgentName(agentName?: string) { - return isIosAgentName(agentName) || isAndroidAgentName(agentName); -} - -export function isRumOrMobileAgent(agentName?: string) { - return isRumAgentName(agentName) || isMobileAgentName(agentName); -} - -export function isIosAgentName(agentName?: string) { - const lowercased = agentName && agentName.toLowerCase(); - return lowercased === 'ios/swift'; -} - -export function isJRubyAgent(agentName?: string, runtimeName?: string) { - return agentName === 'ruby' && runtimeName?.toLowerCase() === 'jruby'; -} - -export function isServerlessAgent(serverlessType?: ServerlessType) { - return ( - isAWSLambdaAgent(serverlessType) || isAzureFunctionsAgent(serverlessType) - ); -} - -export function isAWSLambdaAgent(serverlessType?: ServerlessType) { - return serverlessType === ServerlessType.AWS_LAMBDA; -} - -export function isAzureFunctionsAgent(serverlessType?: ServerlessType) { - return serverlessType === ServerlessType.AZURE_FUNCTIONS; -} - -export function isAndroidAgentName(agentName?: string) { - const lowercased = agentName && agentName.toLowerCase(); - return lowercased === 'android/java'; -} +export { + OPEN_TELEMETRY_AGENT_NAMES, + AGENT_NAMES, + isOpenTelemetryAgentName, + JAVA_AGENT_NAMES, + isJavaAgentName, + RUM_AGENT_NAMES, + isRumAgentName, + isRumOrMobileAgentName, + isMobileAgentName, + isIosAgentName, + isJRubyAgentName, + isServerlessAgentName, + isAWSLambdaAgentName, + isAzureFunctionsAgentName, + isAndroidAgentName, +} from '@kbn/elastic-agent-utils'; diff --git a/x-pack/plugins/apm/common/data_source.ts b/x-pack/plugins/apm/common/data_source.ts index f3450fe775429..93d8261473692 100644 --- a/x-pack/plugins/apm/common/data_source.ts +++ b/x-pack/plugins/apm/common/data_source.ts @@ -14,7 +14,8 @@ type AnyApmDocumentType = | ApmDocumentType.TransactionEvent | ApmDocumentType.ServiceDestinationMetric | ApmDocumentType.ServiceSummaryMetric - | ApmDocumentType.ErrorEvent; + | ApmDocumentType.ErrorEvent + | ApmDocumentType.SpanEvent; export interface ApmDataSource< TDocumentType extends AnyApmDocumentType = AnyApmDocumentType diff --git a/x-pack/plugins/apm/common/data_view_constants.ts b/x-pack/plugins/apm/common/data_view_constants.ts index b448918f8facf..c50966399ad22 100644 --- a/x-pack/plugins/apm/common/data_view_constants.ts +++ b/x-pack/plugins/apm/common/data_view_constants.ts @@ -5,5 +5,11 @@ * 2.0. */ -// value of const needs to be backwards compatible -export const APM_STATIC_DATA_VIEW_ID = 'apm_static_index_pattern_id'; +export const DO_NOT_USE_LEGACY_APM_STATIC_DATA_VIEW_ID = + 'apm_static_index_pattern_id'; + +const APM_STATIC_DATA_VIEW_ID_PREFIX = 'apm_static_data_view_id'; + +export function getDataViewId(spaceId: string) { + return `${APM_STATIC_DATA_VIEW_ID_PREFIX}_${spaceId}`; +} diff --git a/x-pack/plugins/apm/common/document_type.ts b/x-pack/plugins/apm/common/document_type.ts index 92a17c3125a96..e8a29e8d08c43 100644 --- a/x-pack/plugins/apm/common/document_type.ts +++ b/x-pack/plugins/apm/common/document_type.ts @@ -12,6 +12,7 @@ export enum ApmDocumentType { ServiceDestinationMetric = 'serviceDestinationMetric', ServiceSummaryMetric = 'serviceSummaryMetric', ErrorEvent = 'error', + SpanEvent = 'span', } export type ApmServiceTransactionDocumentType = diff --git a/x-pack/plugins/apm/common/service_inventory.ts b/x-pack/plugins/apm/common/service_inventory.ts index b3eeb1cbf8faf..f758bc083cf78 100644 --- a/x-pack/plugins/apm/common/service_inventory.ts +++ b/x-pack/plugins/apm/common/service_inventory.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { AgentName } from '../typings/es_schemas/ui/fields/agent'; +import { AgentName } from '@kbn/elastic-agent-utils'; import { ServiceHealthStatus } from './service_health_status'; export interface ServiceListItem { diff --git a/x-pack/plugins/apm/common/utils/kuery_utils.test.ts b/x-pack/plugins/apm/common/utils/kuery_utils.test.ts new file mode 100644 index 0000000000000..556a0f4968fd6 --- /dev/null +++ b/x-pack/plugins/apm/common/utils/kuery_utils.test.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { toKueryFilterFormat, mergeKueries } from './kuery_utils'; + +describe('toKueryFilterFormat', () => { + it('returns a single value', () => { + expect(toKueryFilterFormat('key', ['foo'])).toEqual(`key : "foo"`); + }); + + it('returns multiple values default separator', () => { + expect(toKueryFilterFormat('key', ['foo', 'bar', 'baz'])).toEqual( + `key : "foo" OR key : "bar" OR key : "baz"` + ); + }); + + it('returns multiple values custom separator', () => { + expect(toKueryFilterFormat('key', ['foo', 'bar', 'baz'], 'AND')).toEqual( + `key : "foo" AND key : "bar" AND key : "baz"` + ); + }); + + it('return empty string when no hostname', () => { + expect(toKueryFilterFormat('key', [])).toEqual(''); + }); + + describe('mergeKueries', () => { + it('returns empty string when both kueries are empty', () => { + expect(mergeKueries(['', ''])).toEqual(''); + }); + + it('returns only first kuery when second is empty', () => { + expect(mergeKueries(['host.name: "foo"', ''])).toEqual( + 'host.name: "foo"' + ); + }); + + it('returns second kuery when first is empty', () => { + expect(mergeKueries(['', 'host.name: "foo"'])).toEqual( + 'host.name: "foo"' + ); + }); + + it('returns merged kueries with default separator', () => { + expect( + mergeKueries([ + 'host.name: "foo" OR host.name: "bar"', + 'process.id: "1"', + ]) + ).toEqual('host.name: "foo" OR host.name: "bar" AND process.id: "1"'); + }); + + it('uses custom separator', () => { + expect( + mergeKueries(['host.name: "foo"', 'process.id: "1"'], 'OR') + ).toEqual('host.name: "foo" OR process.id: "1"'); + }); + }); +}); diff --git a/x-pack/plugins/apm/common/utils/kuery_utils.ts b/x-pack/plugins/apm/common/utils/kuery_utils.ts new file mode 100644 index 0000000000000..1caf154a0d5fa --- /dev/null +++ b/x-pack/plugins/apm/common/utils/kuery_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. + */ + +import { isEmpty } from 'lodash'; + +type Separator = 'OR' | 'AND'; + +export const toKueryFilterFormat = ( + key: string, + values: string[], + separator: Separator = 'OR' +) => values.map((value) => `${key} : "${value}"`).join(` ${separator} `); + +export const mergeKueries = (filters: string[], separator: Separator = 'AND') => + filters.filter((filter) => !isEmpty(filter)).join(` ${separator} `); diff --git a/x-pack/plugins/apm/common/utils/to_kuery_filter_format.test.ts b/x-pack/plugins/apm/common/utils/to_kuery_filter_format.test.ts deleted file mode 100644 index 0a1e01d8404f7..0000000000000 --- a/x-pack/plugins/apm/common/utils/to_kuery_filter_format.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { toKueryFilterFormat } from './to_kuery_filter_format'; - -describe('toKueryFilterFormat', () => { - it('returns a single value', () => { - expect(toKueryFilterFormat('key', ['foo'])).toEqual(`key : "foo"`); - }); - - it('returns multiple values default separator', () => { - expect(toKueryFilterFormat('key', ['foo', 'bar', 'baz'])).toEqual( - `key : "foo" OR key : "bar" OR key : "baz"` - ); - }); - - it('returns multiple values custom separator', () => { - expect(toKueryFilterFormat('key', ['foo', 'bar', 'baz'], 'AND')).toEqual( - `key : "foo" AND key : "bar" AND key : "baz"` - ); - }); - - it('return empty string when no hostname', () => { - expect(toKueryFilterFormat('key', [])).toEqual(''); - }); -}); diff --git a/x-pack/plugins/apm/public/components/app/diagnostics/apm_documents_tab.tsx b/x-pack/plugins/apm/public/components/app/diagnostics/apm_documents_tab.tsx index d4776c8995c43..03fcd2610f23b 100644 --- a/x-pack/plugins/apm/public/components/app/diagnostics/apm_documents_tab.tsx +++ b/x-pack/plugins/apm/public/components/app/diagnostics/apm_documents_tab.tsx @@ -13,20 +13,23 @@ import { EuiText, EuiToolTip, } from '@elastic/eui'; -import React, { useState, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { orderBy } from 'lodash'; -import { useApmParams } from '../../../hooks/use_apm_params'; +import React, { useMemo, useState } from 'react'; import { asBigNumber, asInteger } from '../../../../common/utils/formatters'; -import { APM_STATIC_DATA_VIEW_ID } from '../../../../common/data_view_constants'; import type { ApmEvent } from '../../../../server/routes/diagnostics/bundle/get_apm_events'; -import { useDiagnosticsContext } from './context/use_diagnostics'; +import { useApmParams } from '../../../hooks/use_apm_params'; +import { useDataViewId } from '../../../hooks/use_data_view_id'; import { ApmPluginStartDeps } from '../../../plugin'; import { SearchBar } from '../../shared/search_bar/search_bar'; +import { useDiagnosticsContext } from './context/use_diagnostics'; export function DiagnosticsApmDocuments() { const { diagnosticsBundle, isImported } = useDiagnosticsContext(); const { discover } = useKibana().services; + const dataViewId = useDataViewId(); + const [sortField, setSortField] = useState('name'); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('asc'); const { @@ -103,7 +106,7 @@ export function DiagnosticsApmDocuments() { language: 'kuery', query: item.kuery, }, - dataViewId: APM_STATIC_DATA_VIEW_ID, + dataViewId, timeRange: rangeTo && rangeFrom ? { @@ -123,13 +126,37 @@ export function DiagnosticsApmDocuments() { {isImported && diagnosticsBundle ? ( <> - From: {new Date(diagnosticsBundle.params.start).toISOString()} + {i18n.translate( + 'xpack.apm.diagnosticsApmDocuments.from:BadgeLabel', + { + defaultMessage: 'From: {date}', + values: { + date: new Date(diagnosticsBundle.params.start).toISOString(), + }, + } + )} - To: {new Date(diagnosticsBundle.params.end).toISOString()} + {i18n.translate('xpack.apm.diagnosticsApmDocuments.to:BadgeLabel', { + defaultMessage: 'To: {date}', + values: { + date: new Date(diagnosticsBundle.params.end).toISOString(), + }, + })} - Filter: {diagnosticsBundle?.params.kuery ?? Empty} + {i18n.translate( + 'xpack.apm.diagnosticsApmDocuments.filter:BadgeLabel', + { defaultMessage: 'Filter:' } + )} + {diagnosticsBundle?.params.kuery ?? ( + + {i18n.translate( + 'xpack.apm.diagnosticsApmDocuments.em.emptyLabel', + { defaultMessage: 'Empty' } + )} + + )} @@ -183,7 +210,13 @@ function IntervalDocCount({ - ({asBigNumber(interval.eventDocCount)} events) + {i18n.translate('xpack.apm.intervalDocCount.TextLabel', { + defaultMessage: + '({docCount} {docCount, plural, one {event} other {events}})', + values: { + docCount: asBigNumber(interval.eventDocCount), + }, + })}
    diff --git a/x-pack/plugins/apm/public/components/app/metrics/index.tsx b/x-pack/plugins/apm/public/components/app/metrics/index.tsx index 5f290b4d4af86..0c70b6fd48d7f 100644 --- a/x-pack/plugins/apm/public/components/app/metrics/index.tsx +++ b/x-pack/plugins/apm/public/components/app/metrics/index.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { isJavaAgentName, - isJRubyAgent, - isAWSLambdaAgent, + isJRubyAgentName, + isAWSLambdaAgentName, } from '../../../../common/agent_name'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; import { ServerlessMetrics } from './serverless_metrics'; @@ -20,7 +20,7 @@ import { hasDashboardFile } from './static_dashboard/helper'; export function Metrics() { const { agentName, runtimeName, serverlessType } = useApmServiceContext(); - const isAWSLambda = isAWSLambdaAgent(serverlessType); + const isAWSLambda = isAWSLambdaAgentName(serverlessType); if (isAWSLambda) { return ; @@ -44,7 +44,7 @@ export function Metrics() { if ( !isAWSLambda && - (isJavaAgentName(agentName) || isJRubyAgent(agentName, runtimeName)) + (isJavaAgentName(agentName) || isJRubyAgentName(agentName, runtimeName)) ) { return ; } diff --git a/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/helper.ts b/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/helper.ts index a6d22ea7b6a55..780e4387b0e10 100644 --- a/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/helper.ts +++ b/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/helper.ts @@ -6,7 +6,6 @@ */ import type { DashboardPanelMap } from '@kbn/dashboard-plugin/common'; -import { APM_STATIC_DATA_VIEW_ID } from '../../../../../common/data_view_constants'; import { AGENT_NAME_DASHBOARD_FILE_MAPPING, loadDashboardFile, @@ -29,7 +28,8 @@ function getDashboardFile({ agentName }: MetricsDashboardProps) { } export async function getDashboardPanelMap( - props: MetricsDashboardProps + props: MetricsDashboardProps, + dataViewId: string ): Promise { const dashboardFile = getDashboardFile(props); const panelsRawObj = !!dashboardFile @@ -42,7 +42,7 @@ export async function getDashboardPanelMap( const panelsStr: string = ( panelsRawObj.attributes.panelsJSON as string - ).replaceAll('APM_STATIC_DATA_VIEW_ID', APM_STATIC_DATA_VIEW_ID); + ).replaceAll('APM_STATIC_DATA_VIEW_ID', dataViewId); const panelsRawObjects = JSON.parse(panelsStr) as any[]; diff --git a/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/index.tsx b/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/index.tsx index 50bda742eb377..29ebf34cca44f 100644 --- a/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/index.tsx +++ b/x-pack/plugins/apm/public/components/app/metrics/static_dashboard/index.tsx @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { controlGroupInputBuilder } from '@kbn/controls-plugin/public'; import { getDefaultControlGroupInput } from '@kbn/controls-plugin/common'; import { NotificationsStart } from '@kbn/core/public'; -import { APM_STATIC_DATA_VIEW_ID } from '../../../../../common/data_view_constants'; +import { useDataViewId } from '../../../../hooks/use_data_view_id'; import { ENVIRONMENT_ALL, ENVIRONMENT_NOT_DEFINED, @@ -28,11 +28,11 @@ import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plug import { useApmDataView } from '../../../../hooks/use_apm_data_view'; import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; import { useApmParams } from '../../../../hooks/use_apm_params'; - import { getDashboardPanelMap, MetricsDashboardProps } from './helper'; export function JsonMetricsDashboard(dashboardProps: MetricsDashboardProps) { const [dashboard, setDashboard] = useState(); + const dataViewId = useDataViewId(); const { query: { environment, kuery, rangeFrom, rangeTo }, @@ -65,7 +65,7 @@ export function JsonMetricsDashboard(dashboardProps: MetricsDashboardProps) { return ( - getCreationOptions(dashboardProps, notifications) + getCreationOptions(dashboardProps, notifications, dataViewId) } ref={setDashboard} /> @@ -74,20 +74,21 @@ export function JsonMetricsDashboard(dashboardProps: MetricsDashboardProps) { async function getCreationOptions( dashboardProps: MetricsDashboardProps, - notifications: NotificationsStart + notifications: NotificationsStart, + dataViewId: string ): Promise { try { const builder = controlGroupInputBuilder; const controlGroupInput = getDefaultControlGroupInput(); await builder.addDataControlFromField(controlGroupInput, { - dataViewId: APM_STATIC_DATA_VIEW_ID, + dataViewId, title: 'Node name', fieldName: 'service.node.name', width: 'medium', grow: true, }); - const panels = await getDashboardPanelMap(dashboardProps); + const panels = await getDashboardPanelMap(dashboardProps, dataViewId); if (!panels) { throw new Error('Failed parsing dashboard panels.'); diff --git a/x-pack/plugins/apm/public/components/app/metrics_details/index.tsx b/x-pack/plugins/apm/public/components/app/metrics_details/index.tsx index ffcba4d838971..99d3d8830ceb9 100644 --- a/x-pack/plugins/apm/public/components/app/metrics_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/metrics_details/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ import React from 'react'; -import { isAWSLambdaAgent } from '../../../../common/agent_name'; +import { isAWSLambdaAgentName } from '../../../../common/agent_name'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; import { useApmParams } from '../../../hooks/use_apm_params'; import { ServerlessMetricsDetails } from './serverless_metrics_details'; @@ -17,7 +17,7 @@ export function MetricsDetails() { } = useApmParams('/services/{serviceName}/metrics/{id}'); const { serverlessType } = useApmServiceContext(); - if (isAWSLambdaAgent(serverlessType)) { + if (isAWSLambdaAgentName(serverlessType)) { return ; } diff --git a/x-pack/plugins/apm/public/components/app/metrics_details/service_node_metrics/index.tsx b/x-pack/plugins/apm/public/components/app/metrics_details/service_node_metrics/index.tsx index 28865a8ad5f15..46f5045dc43e6 100644 --- a/x-pack/plugins/apm/public/components/app/metrics_details/service_node_metrics/index.tsx +++ b/x-pack/plugins/apm/public/components/app/metrics_details/service_node_metrics/index.tsx @@ -22,6 +22,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; import React from 'react'; +import { ApmDocumentType } from '../../../../../common/document_type'; import { getServiceNodeName, SERVICE_NODE_NAME_MISSING, @@ -33,6 +34,7 @@ import { ChartPointerEventContextProvider } from '../../../../context/chart_poin import { useApmParams } from '../../../../hooks/use_apm_params'; import { useApmRouter } from '../../../../hooks/use_apm_router'; import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; +import { usePreferredDataSourceAndBucketSize } from '../../../../hooks/use_preferred_data_source_and_bucket_size'; import { useServiceMetricChartsFetcher } from '../../../../hooks/use_service_metric_charts_fetcher'; import { useTimeRange } from '../../../../hooks/use_time_range'; import { truncate, unit } from '../../../../utils/style'; @@ -83,9 +85,17 @@ export function ServiceNodeMetrics({ serviceNodeName }: Props) { environment, }); + const preferred = usePreferredDataSourceAndBucketSize({ + start, + end, + kuery, + type: ApmDocumentType.ServiceTransactionMetric, + numBuckets: 100, + }); + const { data: { host, containerId } = INITIAL_DATA, status } = useFetcher( (callApmApi) => { - if (start && end) { + if (start && end && preferred) { return callApmApi( 'GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata', { @@ -96,13 +106,15 @@ export function ServiceNodeMetrics({ serviceNodeName }: Props) { start, end, environment, + documentType: preferred.source.documentType, + rollupInterval: preferred.source.rollupInterval, }, }, } ); } }, - [kuery, serviceName, serviceNodeName, start, end, environment] + [kuery, serviceName, serviceNodeName, start, end, environment, preferred] ); const { docLinks } = useApmPluginContext().core; diff --git a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx index b046511d6ce64..f4c530b47acc2 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/embedded_map.tsx @@ -23,6 +23,7 @@ import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { EuiText } from '@elastic/eui'; import type { Filter } from '@kbn/es-query'; +import { useDataViewId } from '../../../../../hooks/use_data_view_id'; import { ApmPluginStartDeps } from '../../../../../plugin'; import { getLayerList } from './map_layers/get_layer_list'; import { MapTypes } from '../../../../../../common/mobile/constants'; @@ -40,6 +41,7 @@ function EmbeddedMapComponent({ filters: Filter[]; }) { const [error, setError] = useState(); + const dataViewId = useDataViewId(); const [embeddable, setEmbeddable] = useState< MapEmbeddable | ErrorEmbeddable | undefined @@ -128,7 +130,7 @@ function EmbeddedMapComponent({ useEffect(() => { const setLayerList = async () => { if (embeddable && !isErrorEmbeddable(embeddable)) { - const layerList = await getLayerList({ selectedMap, maps }); + const layerList = await getLayerList({ selectedMap, maps, dataViewId }); await Promise.all([ embeddable.setLayerList(layerList), embeddable.reload(), @@ -137,7 +139,7 @@ function EmbeddedMapComponent({ }; setLayerList(); - }, [embeddable, selectedMap, maps]); + }, [embeddable, selectedMap, maps, dataViewId]); useEffect(() => { if (embeddable) { diff --git a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_http_requests_map_layer_list.ts b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_http_requests_map_layer_list.ts index 8954626546290..728658817b27a 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_http_requests_map_layer_list.ts +++ b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_http_requests_map_layer_list.ts @@ -24,7 +24,6 @@ import { SPAN_SUBTYPE, SPAN_TYPE, } from '../../../../../../../common/es_fields/apm'; -import { APM_STATIC_DATA_VIEW_ID } from '../../../../../../../common/data_view_constants'; import { getLayerStyle, PalleteColors } from './get_map_layer_style'; import { MobileSpanSubtype, @@ -48,7 +47,10 @@ const label = i18n.translate( } ); -export async function getHttpRequestsLayerList(maps?: MapsStartApi) { +export async function getHttpRequestsLayerList( + maps: MapsStartApi | undefined, + dataViewId: string +) { const whereQuery = { language: 'kuery', query: `${PROCESSOR_EVENT}:${ProcessorEvent.span} and ${SPAN_SUBTYPE}:${MobileSpanSubtype.Http} and ${SPAN_TYPE}:${MobileSpanType.External}`, @@ -72,7 +74,7 @@ export async function getHttpRequestsLayerList(maps?: MapsStartApi) { }, ], whereQuery, - indexPatternId: APM_STATIC_DATA_VIEW_ID, + indexPatternId: dataViewId, applyGlobalQuery: true, applyGlobalTime: true, applyForceRefresh: true, @@ -114,7 +116,7 @@ export async function getHttpRequestsLayerList(maps?: MapsStartApi) { }, ], whereQuery, - indexPatternId: APM_STATIC_DATA_VIEW_ID, + indexPatternId: dataViewId, applyGlobalQuery: true, applyGlobalTime: true, applyForceRefresh: true, diff --git a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_layer_list.ts b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_layer_list.ts index 152f1874b143b..d9f1d023fbf64 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_layer_list.ts +++ b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_layer_list.ts @@ -10,19 +10,21 @@ import { getHttpRequestsLayerList } from './get_http_requests_map_layer_list'; import { getSessionMapLayerList } from './get_session_map_layer_list'; import { MapTypes } from '../../../../../../../common/mobile/constants'; -export async function getLayerList({ +export function getLayerList({ selectedMap, maps, + dataViewId, }: { selectedMap: MapTypes; - maps?: MapsStartApi; + maps: MapsStartApi | undefined; + dataViewId: string; }): Promise { switch (selectedMap) { case MapTypes.Http: - return await getHttpRequestsLayerList(maps); + return getHttpRequestsLayerList(maps, dataViewId); case MapTypes.Session: - return await getSessionMapLayerList(maps); + return getSessionMapLayerList(maps, dataViewId); default: - return await getHttpRequestsLayerList(maps); + return getHttpRequestsLayerList(maps, dataViewId); } } diff --git a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_session_map_layer_list.ts b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_session_map_layer_list.ts index a0d2b80b218fd..be86b5da710a8 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_session_map_layer_list.ts +++ b/x-pack/plugins/apm/public/components/app/mobile/service_overview/geo_map/map_layers/get_session_map_layer_list.ts @@ -21,7 +21,6 @@ import { CLIENT_GEO_REGION_ISO_CODE, SESSION_ID, } from '../../../../../../../common/es_fields/apm'; -import { APM_STATIC_DATA_VIEW_ID } from '../../../../../../../common/data_view_constants'; import { getLayerStyle, PalleteColors } from './get_map_layer_style'; interface VectorLayerDescriptor extends BaseVectorLayerDescriptor { @@ -40,7 +39,10 @@ const label = i18n.translate( defaultMessage: 'Sessions', } ); -export async function getSessionMapLayerList(maps?: MapsStartApi) { +export async function getSessionMapLayerList( + maps: MapsStartApi | undefined, + dataViewId: string +) { const basemapLayerDescriptor = await maps?.createLayerDescriptors?.createBasemapLayerDescriptor(); @@ -59,7 +61,7 @@ export async function getSessionMapLayerList(maps?: MapsStartApi) { label, }, ], - indexPatternId: APM_STATIC_DATA_VIEW_ID, + indexPatternId: dataViewId, applyGlobalQuery: true, applyGlobalTime: true, applyForceRefresh: true, @@ -101,7 +103,7 @@ export async function getSessionMapLayerList(maps?: MapsStartApi) { label, }, ], - indexPatternId: APM_STATIC_DATA_VIEW_ID, + indexPatternId: dataViewId, applyGlobalQuery: true, applyGlobalTime: true, applyForceRefresh: true, diff --git a/x-pack/plugins/apm/public/components/app/profiling_overview/index.tsx b/x-pack/plugins/apm/public/components/app/profiling_overview/index.tsx index 6c6bd7a356d78..cdd9699ebadc1 100644 --- a/x-pack/plugins/apm/public/components/app/profiling_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/profiling_overview/index.tsx @@ -17,7 +17,9 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { EmbeddableProfilingSearchBar } from '@kbn/observability-shared-plugin/public'; import React, { useMemo } from 'react'; +import { useHistory } from 'react-router-dom'; import { ApmDocumentType } from '../../../../common/document_type'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useLocalStorage } from '../../../hooks/use_local_storage'; @@ -25,17 +27,19 @@ import { usePreferredDataSourceAndBucketSize } from '../../../hooks/use_preferre import { useProfilingPlugin } from '../../../hooks/use_profiling_plugin'; import { useTimeRange } from '../../../hooks/use_time_range'; import { ApmPluginStartDeps } from '../../../plugin'; +import { push } from '../../shared/links/url_helpers'; import { ProfilingFlamegraph } from './profiling_flamegraph'; import { ProfilingTopNFunctions } from './profiling_top_functions'; export function ProfilingOverview() { + const history = useHistory(); const { services } = useKibana(); const { path: { serviceName }, query: { rangeFrom, rangeTo, environment, kuery }, } = useApmParams('/services/{serviceName}/profiling'); const { isProfilingAvailable } = useProfilingPlugin(); - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + const { start, end, refreshTimeRange } = useTimeRange({ rangeFrom, rangeTo }); const preferred = usePreferredDataSourceAndBucketSize({ start, end, @@ -43,6 +47,7 @@ export function ProfilingOverview() { type: ApmDocumentType.TransactionMetric, numBuckets: 20, }); + const [ apmUniversalProfilingShowCallout, setAPMUniversalProfilingShowCallout, @@ -67,6 +72,7 @@ export function ProfilingOverview() { end={end} environment={environment} dataSource={preferred?.source} + kuery={kuery} /> ), @@ -87,12 +93,13 @@ export function ProfilingOverview() { startIndex={0} endIndex={10} dataSource={preferred?.source} + kuery={kuery} /> ), }, ]; - }, [end, environment, preferred?.source, serviceName, start]); + }, [end, environment, kuery, preferred?.source, serviceName, start]); if (!isProfilingAvailable) { return null; @@ -147,6 +154,22 @@ export function ProfilingOverview() { )} + { + push(history, { + query: { + kuery: next.query, + rangeFrom: next.dateRange.from, + rangeTo: next.dateRange.to, + }, + }); + }} + onRefresh={refreshTimeRange} + /> + ; + kuery: string; } export function ProfilingFlamegraph({ @@ -44,6 +48,7 @@ export function ProfilingFlamegraph({ serviceName, environment, dataSource, + kuery, }: Props) { const { profilingLocators } = useProfilingPlugin(); @@ -61,13 +66,14 @@ export function ProfilingFlamegraph({ environment, documentType: dataSource.documentType, rollupInterval: dataSource.rollupInterval, + kuery, }, }, } ); } }, - [dataSource, serviceName, start, end, environment] + [dataSource, serviceName, start, end, environment, kuery] ); const hostNamesKueryFormat = toKueryFilterFormat( @@ -86,7 +92,7 @@ export function ProfilingFlamegraph({ {i18n.translate('xpack.apm.profiling.flamegraph.link', { diff --git a/x-pack/plugins/apm/public/components/app/profiling_overview/profiling_top_functions.tsx b/x-pack/plugins/apm/public/components/app/profiling_overview/profiling_top_functions.tsx index 0c2a225040728..7b428802fbfc1 100644 --- a/x-pack/plugins/apm/public/components/app/profiling_overview/profiling_top_functions.tsx +++ b/x-pack/plugins/apm/public/components/app/profiling_overview/profiling_top_functions.tsx @@ -9,13 +9,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { EmbeddableFunctions } from '@kbn/observability-shared-plugin/public'; import React from 'react'; +import { ApmDataSourceWithSummary } from '../../../../common/data_source'; +import { ApmDocumentType } from '../../../../common/document_type'; import { HOST_NAME } from '../../../../common/es_fields/apm'; -import { toKueryFilterFormat } from '../../../../common/utils/to_kuery_filter_format'; +import { + mergeKueries, + toKueryFilterFormat, +} from '../../../../common/utils/kuery_utils'; import { isPending, useFetcher } from '../../../hooks/use_fetcher'; import { useProfilingPlugin } from '../../../hooks/use_profiling_plugin'; import { HostnamesFilterWarning } from './host_names_filter_warning'; -import { ApmDataSourceWithSummary } from '../../../../common/data_source'; -import { ApmDocumentType } from '../../../../common/document_type'; interface Props { serviceName: string; @@ -27,6 +30,7 @@ interface Props { dataSource?: ApmDataSourceWithSummary< ApmDocumentType.TransactionMetric | ApmDocumentType.TransactionEvent >; + kuery: string; } export function ProfilingTopNFunctions({ @@ -37,6 +41,7 @@ export function ProfilingTopNFunctions({ startIndex, endIndex, dataSource, + kuery, }: Props) { const { profilingLocators } = useProfilingPlugin(); @@ -56,13 +61,23 @@ export function ProfilingTopNFunctions({ endIndex, documentType: dataSource.documentType, rollupInterval: dataSource.rollupInterval, + kuery, }, }, } ); } }, - [dataSource, serviceName, start, end, environment, startIndex, endIndex] + [ + dataSource, + serviceName, + start, + end, + environment, + startIndex, + endIndex, + kuery, + ] ); const hostNamesKueryFormat = toKueryFilterFormat( @@ -81,7 +96,7 @@ export function ProfilingTopNFunctions({ {i18n.translate('xpack.apm.profiling.topnFunctions.link', { diff --git a/x-pack/plugins/apm/public/components/app/service_groups/service_group_save/service_list_preview.tsx b/x-pack/plugins/apm/public/components/app/service_groups/service_group_save/service_list_preview.tsx index 66105c106805a..39f8ba7068abc 100644 --- a/x-pack/plugins/apm/public/components/app/service_groups/service_group_save/service_list_preview.tsx +++ b/x-pack/plugins/apm/public/components/app/service_groups/service_group_save/service_list_preview.tsx @@ -10,11 +10,11 @@ import { EuiFlexGroup, EuiFlexItem, } from '@elastic/eui'; +import { AgentIcon } from '@kbn/custom-icons'; import { i18n } from '@kbn/i18n'; import { orderBy } from 'lodash'; import React, { useCallback, useMemo, useState } from 'react'; import { ValuesType } from 'utility-types'; -import { AgentIcon } from '../../../shared/agent_icon'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { unit } from '../../../../utils/style'; import { EnvironmentBadge } from '../../../shared/environment_badge'; @@ -93,7 +93,7 @@ export function ServiceListPreview({ items, isLoading }: Props) { content={ - + {serviceName} 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 081a24ceb4427..b3e36fc8bebb9 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 @@ -327,6 +327,7 @@ export function ServiceList({ } = useApmParams('/services'); const { kuery } = query; + const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ kuery, }); diff --git a/x-pack/plugins/apm/public/components/app/service_map/icons.ts b/x-pack/plugins/apm/public/components/app/service_map/icons.ts index 187a84cb6cca6..f784a737f8d67 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/icons.ts +++ b/x-pack/plugins/apm/public/components/app/service_map/icons.ts @@ -5,13 +5,13 @@ * 2.0. */ +import { getAgentIcon } from '@kbn/custom-icons'; import cytoscape from 'cytoscape'; import { AGENT_NAME, SPAN_SUBTYPE, SPAN_TYPE, } from '../../../../common/es_fields/apm'; -import { getAgentIcon } from '../../shared/agent_icon/get_agent_icon'; import { getSpanIcon } from '../../shared/span_icon/get_span_icon'; export function iconForNode(node: cytoscape.NodeSingular) { 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 4a4e79b39c8e9..55972ede6e560 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 @@ -20,7 +20,7 @@ import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; import { isOpenTelemetryAgentName, isRumAgentName, - isServerlessAgent, + isServerlessAgentName, } from '../../../../common/agent_name'; import { AnnotationsContextProvider } from '../../../context/annotations/annotations_context'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; @@ -60,7 +60,7 @@ export function ServiceOverview() { const { start, end } = useTimeRange({ rangeFrom, rangeTo }); const isRumAgent = isRumAgentName(agentName); const isOpenTelemetryAgent = isOpenTelemetryAgentName(agentName as AgentName); - const isServerless = isServerlessAgent(serverlessType); + const isServerless = isServerlessAgentName(serverlessType); const dependenciesLink = router.link('/services/{serviceName}/dependencies', { path: { diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx index fac65a4485766..09b9e461ca1c0 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx @@ -6,6 +6,11 @@ */ import { EuiFlexGroup, EuiFlexItem, EuiSkeletonText } from '@elastic/eui'; +import { + CloudProvider, + getAgentIcon, + getCloudProviderIcon, +} from '@kbn/custom-icons'; import { i18n } from '@kbn/i18n'; import { get } from 'lodash'; import React from 'react'; @@ -36,10 +41,9 @@ import { import { isPending } from '../../../../hooks/use_fetcher'; import { useTheme } from '../../../../hooks/use_theme'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; -import { getAgentIcon } from '../../../shared/agent_icon/get_agent_icon'; import { KeyValueFilterList } from '../../../shared/key_value_filter_list'; import { pushNewItemToKueryBar } from '../../../shared/kuery_bar/utils'; -import { getCloudIcon, getContainerIcon } from '../../../shared/service_icons'; +import { getContainerIcon } from '../../../shared/service_icons'; import { useInstanceDetailsFetcher } from './use_instance_details_fetcher'; type ServiceInstanceDetails = @@ -175,7 +179,7 @@ export function InstanceDetails({ 'xpack.apm.serviceOverview.instanceTable.details.cloudTitle', { defaultMessage: 'Cloud' } )} - icon={getCloudIcon(data.cloud?.provider)} + icon={getCloudProviderIcon(data.cloud?.provider as CloudProvider)} keyValueList={cloudDetailsKeyValuePairs} onClickFilter={addKueryBarFilter} /> diff --git a/x-pack/plugins/apm/public/components/app/settings/agent_explorer/agent_list/index.tsx b/x-pack/plugins/apm/public/components/app/settings/agent_explorer/agent_list/index.tsx index 665d454c440fb..10d2cec27ee16 100644 --- a/x-pack/plugins/apm/public/components/app/settings/agent_explorer/agent_list/index.tsx +++ b/x-pack/plugins/apm/public/components/app/settings/agent_explorer/agent_list/index.tsx @@ -12,6 +12,7 @@ import { EuiIcon, EuiToolTip, } from '@elastic/eui'; +import { AgentIcon } from '@kbn/custom-icons'; import { i18n } from '@kbn/i18n'; import { isEmpty } from 'lodash'; import React, { useMemo, useState } from 'react'; @@ -20,7 +21,6 @@ import { AgentExplorerFieldName } from '../../../../../../common/agent_explorer' import { AgentName } from '../../../../../../typings/es_schemas/ui/fields/agent'; import { useApmPluginContext } from '../../../../../context/apm_plugin/use_apm_plugin_context'; import { APIReturnType } from '../../../../../services/rest/create_call_apm_api'; -import { AgentIcon } from '../../../../shared/agent_icon'; import { EnvironmentBadge } from '../../../../shared/environment_badge'; import { ItemsBadge } from '../../../../shared/item_badge'; import { ITableColumn, ManagedTable } from '../../../../shared/managed_table'; @@ -67,7 +67,10 @@ export function getAgentsColumns({ onAgentSelected(agent)} display={isSelected ? 'base' : 'empty'} @@ -96,7 +99,7 @@ export function getAgentsColumns({ content={ - + {serviceName} diff --git a/x-pack/plugins/apm/public/components/app/top_traces_overview/index.tsx b/x-pack/plugins/apm/public/components/app/top_traces_overview/index.tsx index 486a54b400098..3c314f6389770 100644 --- a/x-pack/plugins/apm/public/components/app/top_traces_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/top_traces_overview/index.tsx @@ -19,12 +19,12 @@ export function TopTracesOverview() { const { query: { environment, kuery, rangeFrom, rangeTo }, } = useApmParams('/traces'); + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ kuery, }); - const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const response = useProgressiveFetcher( (callApmApi) => { if (start && end) { diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx index 1c3ea3bf7e5f0..0b9a1190b1e15 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx @@ -18,7 +18,7 @@ import { AggregatedTransactionsBadge } from '../../shared/aggregated_transaction import { TransactionCharts } from '../../shared/charts/transaction_charts'; import { replace } from '../../shared/links/url_helpers'; import { TransactionDetailsTabs } from './transaction_details_tabs'; -import { isServerlessAgent } from '../../../../common/agent_name'; +import { isServerlessAgentName } from '../../../../common/agent_name'; import { useLocalStorage } from '../../../hooks/use_local_storage'; import { SloCallout } from '../../shared/slo_callout'; @@ -63,7 +63,7 @@ export function TransactionDetails() { [apmRouter, path, query, transactionName] ); - const isServerless = isServerlessAgent(serverlessType); + const isServerless = isServerlessAgentName(serverlessType); const [sloCalloutDismissed, setSloCalloutDismissed] = useLocalStorage( 'apm.sloCalloutDismissed', false diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx index 69ed7a63b0c5b..abd6aee61f407 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx @@ -13,10 +13,11 @@ import { useCriticalPathFeatureEnabledSetting } from '../../../../../hooks/use_c import { TechnicalPreviewBadge } from '../../../../shared/technical_preview_badge'; import { Waterfall } from './waterfall'; import { - IWaterfall, + type IWaterfall, WaterfallLegendType, } from './waterfall/waterfall_helpers/waterfall_helpers'; import { WaterfallLegends } from './waterfall_legends'; +import { MissingTransactionWarning } from './waterfall/missing_transaction_warning'; interface Props { waterfallItemId?: string; @@ -38,7 +39,7 @@ export function WaterfallContainer({ if (!waterfall) { return null; } - const { legends, items } = waterfall; + const { legends, items, hasOrphanTraceItems } = waterfall; // Service colors are needed to color the dot in the error popover const serviceLegends = legends.filter( @@ -108,7 +109,19 @@ export function WaterfallContainer({ ) : null} - + + + + + {hasOrphanTraceItems ? ( + + + + ) : null} + + + {i18n.translate( + 'xpack.apm.transactionDetails.agentMissingTransactionLabel', + { + defaultMessage: 'Incomplete trace', + } + )} + + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.test.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.test.ts index df028ee3c8f78..208102b415e57 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.test.ts +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.test.ts @@ -16,6 +16,7 @@ import { IWaterfallTransaction, IWaterfallError, IWaterfallSpanOrTransaction, + getHasOrphanTraceItems, } from './waterfall_helpers'; import { APMError } from '../../../../../../../../typings/es_schemas/ui/apm_error'; import { @@ -717,4 +718,46 @@ describe('waterfall_helpers', () => { expect(getClockSkew(child, parent)).toBe(0); }); }); + + describe('getHasOrphanTraceItems', () => { + const myTransactionItem = { + processor: { event: 'transaction' }, + trace: { id: 'myTrace' }, + transaction: { + id: 'myTransactionId1', + }, + } as WaterfallTransaction; + + it('should return false if there are no orphan items', () => { + const traceItems: Array = [ + myTransactionItem, + { + processor: { event: 'span' }, + span: { + id: 'mySpanId', + }, + parent: { + id: 'myTransactionId1', + }, + } as WaterfallSpan, + ]; + expect(getHasOrphanTraceItems(traceItems)).toBe(false); + }); + + it('should return true if there are orphan items', () => { + const traceItems: Array = [ + myTransactionItem, + { + processor: { event: 'span' }, + span: { + id: 'myOrphanSpanId', + }, + parent: { + id: 'myNotExistingTransactionId1', + }, + } as WaterfallSpan, + ]; + expect(getHasOrphanTraceItems(traceItems)).toBe(true); + }); + }); }); diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts index 62a3ddb434ee6..b197859ff1083 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts @@ -48,6 +48,7 @@ export interface IWaterfall { totalErrorsCount: number; traceDocsTotal: number; maxTraceItems: number; + hasOrphanTraceItems: boolean; } interface IWaterfallItemBase { @@ -191,7 +192,7 @@ export function getClockSkew( case 'error': case 'span': return parentItem.skew; - // transaction is the inital entry in a service. Calculate skew for this, and it will be propogated to all child spans + // transaction is the initial entry in a service. Calculate skew for this, and it will be propagated to all child spans case 'transaction': { const parentStart = parentItem.doc.timestamp.us + parentItem.skew; @@ -415,6 +416,22 @@ function getErrorCountByParentId( }, {}); } +export const getHasOrphanTraceItems = ( + traceDocs: Array +) => { + const waterfallItemsIds = new Set( + traceDocs.map((doc) => + doc.processor.event === 'span' + ? (doc?.span as WaterfallSpan['span']).id + : doc?.transaction?.id + ) + ); + + return traceDocs.some( + (item) => item.parent?.id && !waterfallItemsIds.has(item.parent.id) + ); +}; + export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { const { traceItems, entryTransaction } = apiResponse; if (isEmpty(traceItems.traceDocs) || !entryTransaction) { @@ -429,6 +446,7 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { totalErrorsCount: 0, traceDocsTotal: 0, maxTraceItems: 0, + hasOrphanTraceItems: false, }; } @@ -464,6 +482,8 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { const duration = getWaterfallDuration(items); const legends = getLegends(items); + const hasOrphanTraceItems = getHasOrphanTraceItems(traceItems.traceDocs); + return { entryWaterfallTransaction, rootWaterfallTransaction, @@ -478,5 +498,6 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { totalErrorsCount: traceItems.errorDocs.length, traceDocsTotal: traceItems.traceDocsTotal, maxTraceItems: traceItems.maxTraceItems, + hasOrphanTraceItems, }; } 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 9981533eead4f..372138c1273a9 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 @@ -8,7 +8,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer } from '@elastic/eui'; import React from 'react'; import { useHistory } from 'react-router-dom'; -import { isServerlessAgent } from '../../../../common/agent_name'; +import { isServerlessAgentName } from '../../../../common/agent_name'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useLocalStorage } from '../../../hooks/use_local_storage'; @@ -48,7 +48,7 @@ export function TransactionOverview() { replace(history, { query: { transactionType } }); } - const isServerless = isServerlessAgent(serverlessType); + const isServerless = isServerlessAgentName(serverlessType); const [sloCalloutDismissed, setSloCalloutDismissed] = useLocalStorage( 'apm.sloCalloutDismissed', diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/agent_instructions_accordion.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/agent_instructions_accordion.tsx index 3e4ddc36413c2..237b31219c820 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/agent_instructions_accordion.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_agents/agent_instructions_accordion.tsx @@ -18,12 +18,12 @@ import { i18n } from '@kbn/i18n'; import React, { ComponentType } from 'react'; import styled from 'styled-components'; import { Markdown, useKibana } from '@kbn/kibana-react-plugin/public'; +import { AgentIcon } from '@kbn/custom-icons'; import { AgentRuntimeAttachmentProps, CreateAgentInstructions, } from './agent_instructions_mappings'; import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; -import { AgentIcon } from '../../shared/agent_icon'; import type { NewPackagePolicy, PackagePolicy, diff --git a/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx b/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx index 56deaaa2e6d6e..f2601e392b276 100644 --- a/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/service_detail/index.tsx @@ -371,9 +371,7 @@ export const serviceDetailRoute = { }), element: , searchBarOptions: { - showTimeComparison: false, - showTransactionTypeSelector: false, - showQueryInput: false, + hidden: true, }, }), }, diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx index b5261eb55826f..fa5e43980ce14 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx @@ -24,10 +24,10 @@ import { useHistory } from 'react-router-dom'; import { isMobileAgentName, isRumAgentName, - isAWSLambdaAgent, - isAzureFunctionsAgent, - isServerlessAgent, - isRumOrMobileAgent, + isAWSLambdaAgentName, + isAzureFunctionsAgentName, + isServerlessAgentName, + isRumOrMobileAgentName, } from '../../../../../common/agent_name'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; import { ApmServiceContextProvider } from '../../../../context/apm_service/apm_service_context'; @@ -185,13 +185,13 @@ export function isMetricsTabHidden({ serverlessType?: ServerlessType; isAwsLambdaEnabled?: boolean; }) { - if (isAWSLambdaAgent(serverlessType)) { + if (isAWSLambdaAgentName(serverlessType)) { return !isAwsLambdaEnabled; } return ( !agentName || isRumAgentName(agentName) || - isAzureFunctionsAgent(serverlessType) + isAzureFunctionsAgentName(serverlessType) ); } @@ -207,7 +207,7 @@ export function isInfraTabHidden({ return ( !agentName || isRumAgentName(agentName) || - isServerlessAgent(serverlessType) || + isServerlessAgentName(serverlessType) || !isInfraTabAvailable ); } @@ -320,7 +320,7 @@ function useTabs({ selectedTab }: { selectedTab: Tab['key'] }) { label: i18n.translate('xpack.apm.serviceDetails.metricsTabLabel', { defaultMessage: 'Metrics', }), - append: isServerlessAgent(serverlessType) && ( + append: isServerlessAgentName(serverlessType) && ( ), hidden: isMetricsTabHidden({ @@ -364,13 +364,13 @@ function useTabs({ selectedTab }: { selectedTab: Tab['key'] }) { label: i18n.translate('xpack.apm.home.serviceLogsTabLabel', { defaultMessage: 'Logs', }), - append: isServerlessAgent(serverlessType) && ( + append: isServerlessAgentName(serverlessType) && ( ), hidden: !agentName || isRumAgentName(agentName) || - isAzureFunctionsAgent(serverlessType), + isAzureFunctionsAgentName(serverlessType), }, { key: 'alerts', @@ -408,8 +408,8 @@ function useTabs({ selectedTab }: { selectedTab: Tab['key'] }) { }), hidden: !isProfilingAvailable || - isRumOrMobileAgent(agentName) || - isAWSLambdaAgent(serverlessType), + isRumOrMobileAgentName(agentName) || + isAWSLambdaAgentName(serverlessType), append: ( {i18n.translate('xpack.apm.universalProfiling.newLabel', { diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/agent_icon.stories.tsx b/x-pack/plugins/apm/public/components/shared/agent_icon/agent_icon.stories.tsx deleted file mode 100644 index be4dad7f1642a..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/agent_icon/agent_icon.stories.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiCard, - EuiFlexGroup, - EuiFlexItem, - EuiImage, - EuiToolTip, -} from '@elastic/eui'; -import type { Story } from '@storybook/react'; -import React from 'react'; -import { AGENT_NAMES } from '../../../../common/agent_name'; -import { getAgentIcon } from './get_agent_icon'; -import { AgentIcon } from '.'; -import { MockApmPluginStorybook } from '../../../context/apm_plugin/mock_apm_plugin_storybook'; - -export default { - title: 'shared/AgentIcon', - component: AgentIcon, -}; - -export const List: Story = () => { - return ( - - - {AGENT_NAMES.map((agentName) => { - return ( - - -

    - - - -

    - - } - title={agentName} - description={ -
    - - - -
    - } - /> -
    - ); - })} -
    -
    - ); -}; diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/get_serverless_icon.ts b/x-pack/plugins/apm/public/components/shared/agent_icon/get_serverless_icon.ts deleted file mode 100644 index 70af655b9f34d..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/agent_icon/get_serverless_icon.ts +++ /dev/null @@ -1,25 +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 defaultIcon from '../span_icon/icons/default.svg'; -import lambdaIcon from './icons/lambda.svg'; -import azureFunctionsIcon from './icons/functions.svg'; -import { ServerlessType } from '../../../../common/serverless'; - -type ServerlessIcons = Record; - -const serverlessIcons: ServerlessIcons = { - 'aws.lambda': lambdaIcon, - 'azure.functions': azureFunctionsIcon, -}; - -export function getServerlessIcon(serverlessType?: ServerlessType) { - if (!serverlessType) { - return defaultIcon; - } - return serverlessIcons[serverlessType] ?? defaultIcon; -} diff --git a/x-pack/plugins/apm/public/components/shared/agent_icon/index.tsx b/x-pack/plugins/apm/public/components/shared/agent_icon/index.tsx deleted file mode 100644 index b995e2bbe7cfa..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/agent_icon/index.tsx +++ /dev/null @@ -1,25 +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 { EuiIcon, EuiIconProps } from '@elastic/eui'; -import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; -import { getAgentIcon } from './get_agent_icon'; -import { useTheme } from '../../../hooks/use_theme'; - -interface Props { - agentName?: AgentName; - size?: EuiIconProps['size']; -} - -export function AgentIcon(props: Props) { - const { agentName, size = 'l' } = props; - const theme = useTheme(); - const icon = getAgentIcon(agentName, theme.darkMode); - - return ; -} diff --git a/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/critical_path_flamegraph_tooltip.tsx b/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/critical_path_flamegraph_tooltip.tsx index e4687719cdfc3..3551bffd07f04 100644 --- a/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/critical_path_flamegraph_tooltip.tsx +++ b/x-pack/plugins/apm/public/components/shared/critical_path_flamegraph/critical_path_flamegraph_tooltip.tsx @@ -14,6 +14,7 @@ import { import React from 'react'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { i18n } from '@kbn/i18n'; +import { AgentIcon } from '@kbn/custom-icons'; import type { CriticalPathResponse } from '../../../../server/routes/traces/get_aggregated_critical_path'; import { AGENT_NAME, @@ -25,7 +26,6 @@ import { TRANSACTION_TYPE, } from '../../../../common/es_fields/apm'; import { SpanIcon } from '../span_icon'; -import { AgentIcon } from '../agent_icon'; import { asPercent } from '../../../../common/utils/formatters'; export function CriticalPathFlamegraphTooltip({ @@ -86,7 +86,7 @@ export function CriticalPathFlamegraphTooltip({ - + {metadata[SERVICE_NAME]} diff --git a/x-pack/plugins/apm/public/components/shared/links/apm/service_link/index.tsx b/x-pack/plugins/apm/public/components/shared/links/apm/service_link/index.tsx index c3474f18d794c..4cf6363811f8f 100644 --- a/x-pack/plugins/apm/public/components/shared/links/apm/service_link/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/links/apm/service_link/index.tsx @@ -6,6 +6,7 @@ */ import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiText } from '@elastic/eui'; +import { AgentIcon } from '@kbn/custom-icons'; import { i18n } from '@kbn/i18n'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; import { TypeOf } from '@kbn/typed-react-router-config'; @@ -16,7 +17,6 @@ import { AgentName } from '../../../../../../typings/es_schemas/ui/fields/agent' import { useApmRouter } from '../../../../../hooks/use_apm_router'; import { truncate, unit } from '../../../../../utils/style'; import { ApmRoutes } from '../../../../routing/apm_route_config'; -import { AgentIcon } from '../../../agent_icon'; import { PopoverTooltip } from '../../../popover_tooltip'; import { TruncateWithTooltip } from '../../../truncate_with_tooltip'; import { OTHER_SERVICE_NAME, MaxGroupsMessage } from '../max_groups_message'; @@ -88,7 +88,7 @@ export function ServiceLink({ > - + {serviceName} diff --git a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx index dccce740b62d3..1f066d1322eb6 100644 --- a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx +++ b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_link.tsx @@ -12,7 +12,7 @@ import React from 'react'; import { useLocation } from 'react-router-dom'; import rison from '@kbn/rison'; import url from 'url'; -import { APM_STATIC_DATA_VIEW_ID } from '../../../../../common/data_view_constants'; +import { useDataViewId } from '../../../../hooks/use_data_view_id'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; import { getTimepickerRisonData } from '../rison_helpers'; @@ -37,16 +37,18 @@ export const getDiscoverHref = ({ basePath, location, query, + dataViewId, }: { basePath: IBasePath; location: Location; query: Props['query']; + dataViewId: string; }) => { const risonQuery = { _g: getTimepickerRisonData(location.search), _a: { ...query._a, - index: APM_STATIC_DATA_VIEW_ID, + index: dataViewId, }, }; @@ -62,11 +64,13 @@ export const getDiscoverHref = ({ export function DiscoverLink({ query = {}, ...rest }: Props) { const { core } = useApmPluginContext(); const location = useLocation(); + const dataViewId = useDataViewId(); const href = getDiscoverHref({ basePath: core.http.basePath, query, location, + dataViewId, }); return ; diff --git a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx index dfd14e3a172b9..f4d95a87df5dc 100644 --- a/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/links/discover_links/discover_links.integration.test.tsx @@ -35,7 +35,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:'processor.event:\\"transaction\\" AND transaction.id:\\"8b60bd32ecc6e150\\" AND trace.id:\\"8b60bd32ecc6e1506735a8b6cfcf175c\\"'))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'processor.event:\\"transaction\\" AND transaction.id:\\"8b60bd32ecc6e150\\" AND trace.id:\\"8b60bd32ecc6e1506735a8b6cfcf175c\\"'))"` ); }); @@ -55,7 +55,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:'span.id:\\"test-span-id\\"'))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'span.id:\\"test-span-id\\"'))"` ); }); @@ -77,7 +77,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\"'),sort:('@timestamp':desc))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\"'),sort:('@timestamp':desc))"` ); }); @@ -100,7 +100,7 @@ describe('DiscoverLinks', () => { ); expect(href).toMatchInlineSnapshot( - `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\" AND some:kuery-string'),sort:('@timestamp':desc))"` + `"/basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now/w,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:'service.name:\\"service-name\\" AND error.grouping_key:\\"grouping-key\\" AND some:kuery-string'),sort:('@timestamp':desc))"` ); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx index a77c6b9c7c604..3ce8e3032db69 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx @@ -7,12 +7,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { + CloudProvider, + getAgentIcon, + getCloudProviderIcon, + getServerlessIcon, +} from '@kbn/custom-icons'; import React, { ReactChild, useState } from 'react'; import { useTheme } from '../../../hooks/use_theme'; import { ContainerType } from '../../../../common/service_metadata'; import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; -import { getAgentIcon } from '../agent_icon/get_agent_icon'; -import { getServerlessIcon } from '../agent_icon/get_serverless_icon'; import { CloudDetails } from './cloud_details'; import { ServerlessDetails } from './serverless_details'; import { ContainerDetails } from './container_details'; @@ -21,7 +25,6 @@ import { IconPopover } from './icon_popover'; import { ServiceDetails } from './service_details'; import { ServerlessType } from '../../../../common/serverless'; import { isOpenTelemetryAgentName } from '../../../../common/agent_name'; -import openTelemetryIcon from '../agent_icon/icons/opentelemetry.svg'; interface Props { serviceName: string; @@ -30,12 +33,6 @@ interface Props { end: string; } -const cloudIcons: Record = { - gcp: 'logoGCP', - aws: 'logoAWS', - azure: 'logoAzure', -}; - function getServerlessTitle(serverlessType?: ServerlessType): string { switch (serverlessType) { case ServerlessType.AWS_LAMBDA: { @@ -56,12 +53,6 @@ function getServerlessTitle(serverlessType?: ServerlessType): string { } } -export function getCloudIcon(provider?: string) { - if (provider) { - return cloudIcons[provider]; - } -} - export function getContainerIcon(container?: ContainerType) { if (!container) { return; @@ -155,7 +146,7 @@ export function ServiceIcons({ start, end, serviceName, environment }: Props) { { key: 'opentelemetry', icon: { - type: openTelemetryIcon, + type: getAgentIcon('opentelemetry', theme.darkMode), }, isVisible: !!icons?.agentName && isOpenTelemetryAgentName(icons.agentName), @@ -197,7 +188,7 @@ export function ServiceIcons({ start, end, serviceName, environment }: Props) { { key: 'cloud', icon: { - type: getCloudIcon(icons?.cloudProvider), + type: getCloudProviderIcon(icons?.cloudProvider as CloudProvider), }, isVisible: !!icons?.cloudProvider, title: i18n.translate('xpack.apm.serviceIcons.cloud', { diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/get_span_icon.ts b/x-pack/plugins/apm/public/components/shared/span_icon/get_span_icon.ts index 5c719d51d457e..8952c7b789777 100644 --- a/x-pack/plugins/apm/public/components/shared/span_icon/get_span_icon.ts +++ b/x-pack/plugins/apm/public/components/shared/span_icon/get_span_icon.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { getAgentIcon } from '@kbn/custom-icons'; import { maybe } from '../../../../common/utils/maybe'; import awsIcon from './icons/aws.svg'; import cassandraIcon from './icons/cassandra.svg'; @@ -22,7 +23,6 @@ import mysqlIcon from './icons/mysql.svg'; import postgresqlIcon from './icons/postgresql.svg'; import redisIcon from './icons/redis.svg'; import websocketIcon from './icons/websocket.svg'; -import javaIcon from '../agent_icon/icons/java.svg'; import dynamodbIcon from './icons/dynamo_db.svg'; import sThreeIcon from './icons/s3.svg'; import snsIcon from './icons/sns.svg'; @@ -70,7 +70,7 @@ export const spanTypeIcons: { messaging: { azurequeue: storageQueueIcon, azureservicebus: serviceBusIcon, - jms: javaIcon, + jms: getAgentIcon('java'), kafka: kafkaIcon, sns: snsIcon, sqs: sqsIcon, diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts index fe8cb9d68fdfb..7d7a720f27cfc 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts @@ -77,6 +77,7 @@ describe('Transaction action menu', () => { rangeFrom: 'now-24h', rangeTo: 'now', environment: 'ENVIRONMENT_ALL', + dataViewId: 'apm_static_data_view_id_default', }) ).toEqual([ [ @@ -113,7 +114,7 @@ describe('Transaction action menu', () => { { key: 'sampleDocument', label: 'View transaction in Discover', - href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', + href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', condition: true, }, ], @@ -145,6 +146,7 @@ describe('Transaction action menu', () => { rangeFrom: 'now-24h', rangeTo: 'now', environment: 'ENVIRONMENT_ALL', + dataViewId: 'apm_static_data_view_id_default', }) ).toEqual([ [ @@ -200,7 +202,7 @@ describe('Transaction action menu', () => { { key: 'sampleDocument', label: 'View transaction in Discover', - href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', + href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', condition: true, }, ], @@ -232,6 +234,7 @@ describe('Transaction action menu', () => { rangeFrom: 'now-24h', rangeTo: 'now', environment: 'ENVIRONMENT_ALL', + dataViewId: 'apm_static_data_view_id_default', }) ).toEqual([ [ @@ -286,7 +289,7 @@ describe('Transaction action menu', () => { { key: 'sampleDocument', label: 'View transaction in Discover', - href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', + href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_data_view_id_default,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', condition: true, }, ], diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts index a944a80a458f7..b50bbd5239ccb 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts @@ -55,6 +55,7 @@ export const getSections = ({ allDatasetsLocator, logsLocator, nodeLogsLocator, + dataViewId, }: { transaction?: Transaction; basePath: IBasePath; @@ -68,6 +69,7 @@ export const getSections = ({ allDatasetsLocator: LocatorPublic; logsLocator: LocatorPublic; nodeLogsLocator: LocatorPublic; + dataViewId: string; }) => { if (!transaction) return []; @@ -271,6 +273,7 @@ export const getSections = ({ basePath, query: getDiscoverQuery(transaction), location, + dataViewId, }), condition: true, }, diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.tsx index 02664e370b9c3..7895fdf7d059d 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/transaction_action_menu.tsx @@ -32,6 +32,7 @@ import { NodeLogsLocatorParams, } from '@kbn/logs-shared-plugin/common'; import type { ProfilingLocators } from '@kbn/observability-shared-plugin/public'; +import { useDataViewId } from '../../../hooks/use_data_view_id'; import { useAnyOfApmParams } from '../../../hooks/use_apm_params'; import { ApmFeatureFlagName } from '../../../../common/apm_feature_flags'; import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; @@ -138,6 +139,7 @@ function ActionMenuSections({ const { core, uiActions, share } = useApmPluginContext(); const location = useLocation(); const apmRouter = useApmRouter(); + const dataViewId = useDataViewId(); const allDatasetsLocator = share.url.locators.get( ALL_DATASETS_LOCATOR_ID @@ -173,6 +175,7 @@ function ActionMenuSections({ allDatasetsLocator, logsLocator, nodeLogsLocator, + dataViewId, }); const externalMenuItems = useAsync(() => { diff --git a/x-pack/plugins/apm/public/hooks/use_apm_data_view.ts b/x-pack/plugins/apm/public/hooks/use_apm_data_view.ts index 2f2d14714e513..57ad95dce2a5a 100644 --- a/x-pack/plugins/apm/public/hooks/use_apm_data_view.ts +++ b/x-pack/plugins/apm/public/hooks/use_apm_data_view.ts @@ -12,11 +12,11 @@ import { useEffect, useState } from 'react'; import { ApmPluginStartDeps } from '../plugin'; import { callApmApi } from '../services/rest/create_call_apm_api'; -async function getApmDataViewTitle() { - const res = await callApmApi('GET /internal/apm/data_view/title', { +async function getApmDataViewIndexPattern() { + const res = await callApmApi('GET /internal/apm/data_view/index_pattern', { signal: null, }); - return res.apmDataViewTitle; + return res.apmDataViewIndexPattern; } export function useApmDataView() { @@ -25,11 +25,11 @@ export function useApmDataView() { useEffect(() => { async function fetchDataView() { - const title = await getApmDataViewTitle(); + const indexPattern = await getApmDataViewIndexPattern(); try { const displayError = false; return await services.dataViews.create( - { title }, + { title: indexPattern }, undefined, displayError ); diff --git a/x-pack/plugins/apm/public/hooks/use_data_view_id.tsx b/x-pack/plugins/apm/public/hooks/use_data_view_id.tsx new file mode 100644 index 0000000000000..3390471ff60e7 --- /dev/null +++ b/x-pack/plugins/apm/public/hooks/use_data_view_id.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { useEffect, useState } from 'react'; +import { getDataViewId } from '../../common/data_view_constants'; +import { ApmPluginStartDeps } from '../plugin'; + +export function useDataViewId() { + const [dataViewId, setDataViewId] = useState( + getDataViewId('default') + ); + const { spaces } = useKibana().services; + + useEffect(() => { + const fetchSpaceId = async () => { + const space = await spaces?.getActiveSpace(); + setDataViewId(getDataViewId(space?.id ?? 'default')); + }; + + fetchSpaceId(); + }, [spaces]); + + return dataViewId; +} diff --git a/x-pack/plugins/apm/public/hooks/use_fallback_to_transactions_fetcher.tsx b/x-pack/plugins/apm/public/hooks/use_fallback_to_transactions_fetcher.tsx index f1d30f4237071..6ffebcb95f2aa 100644 --- a/x-pack/plugins/apm/public/hooks/use_fallback_to_transactions_fetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/use_fallback_to_transactions_fetcher.tsx @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { getKueryWithMobileFilters } from '../../common/utils/get_kuery_with_mobile_filters'; import { useApmParams } from './use_apm_params'; import { useFetcher } from './use_fetcher'; @@ -33,11 +34,17 @@ export function useFallbackToTransactionsFetcher({ kuery }: { kuery: string }) { const { data = { fallbackToTransactions: false } } = useFetcher( (callApmApi) => { - return callApmApi('GET /internal/apm/fallback_to_transactions', { - params: { - query: { kuery: kueryWithFilters, start, end }, - }, - }); + if (start && end) { + return callApmApi('GET /internal/apm/fallback_to_transactions', { + params: { + query: { + kuery: kueryWithFilters, + start, + end, + }, + }, + }); + } }, [kueryWithFilters, start, end] ); diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts index fc6cfe8d3ee47..e27486c1e6454 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts @@ -6,10 +6,7 @@ */ import { DeepPartial } from 'utility-types'; -import { - AgentName, - ElasticAgentName, -} from '../../../typings/es_schemas/ui/fields/agent'; +import { AgentName, ElasticAgentName } from '@kbn/elastic-agent-utils'; import { RollupInterval } from '../../../common/rollup'; export interface TimeframeMap { diff --git a/x-pack/plugins/apm/server/lib/connections/get_connection_stats/get_stats.ts b/x-pack/plugins/apm/server/lib/connections/get_connection_stats/get_stats.ts index 346921960f92d..4524d5121b78d 100644 --- a/x-pack/plugins/apm/server/lib/connections/get_connection_stats/get_stats.ts +++ b/x-pack/plugins/apm/server/lib/connections/get_connection_stats/get_stats.ts @@ -9,7 +9,6 @@ import { sum } from 'lodash'; import objectHash from 'object-hash'; import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { rangeQuery } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; import { getOffsetInMs } from '../../../../common/utils/get_offset_in_ms'; import { ENVIRONMENT_NOT_DEFINED } from '../../../../common/environment_filter_values'; @@ -28,6 +27,8 @@ import { import { getBucketSize } from '../../../../common/utils/get_bucket_size'; import { EventOutcome } from '../../../../common/event_outcome'; import { NodeType } from '../../../../common/connections'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; import { excludeRumExitSpansQuery } from '../exclude_rum_exit_spans_query'; import { APMEventClient } from '../../helpers/create_es_client/create_apm_event_client'; import { getDocumentTypeFilterForServiceDestinationStatistics } from '../../helpers/spans/get_is_using_service_destination_metrics'; @@ -55,7 +56,12 @@ export const getStats = async ({ const response = await apmEventClient.search('get_connection_stats', { apm: { - events: [ProcessorEvent.metric], + sources: [ + { + documentType: ApmDocumentType.ServiceDestinationMetric, + rollupInterval: RollupInterval.OneMinute, + }, + ], }, body: { track_total_hits: true, diff --git a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/get_request_base.ts b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/get_request_base.ts index 1046a2ad47cfe..85ac6689f5df8 100644 --- a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/get_request_base.ts +++ b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/get_request_base.ts @@ -57,9 +57,9 @@ export function getRequestBase(options: { if ('sources' in options.apm) { options.apm.sources.forEach((source) => { - const { getQuery } = getConfigForDocumentType(source.documentType); - if (getQuery) { - filters.push(getQuery(source.rollupInterval)); + const documentTypeConfig = getConfigForDocumentType(source.documentType); + if ('getQuery' in documentTypeConfig) { + filters.push(documentTypeConfig.getQuery(source.rollupInterval)); } }); } diff --git a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts index fcac29b1d57d5..53e4c91f384f3 100644 --- a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts +++ b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts @@ -62,13 +62,11 @@ type APMEventTermsEnumRequest = APMEventWrapper; type APMEventEqlSearchRequest = APMEventWrapper; type APMEventFieldCapsRequest = APMEventWrapper; -// These keys shoul all be `ProcessorEvent.x`, but until TypeScript 4.2 we're inlining them here. -// See https://github.com/microsoft/TypeScript/issues/37888 type TypeOfProcessorEvent = { - error: APMError; - transaction: Transaction; - span: Span; - metric: Metric; + [ProcessorEvent.error]: APMError; + [ProcessorEvent.transaction]: Transaction; + [ProcessorEvent.span]: Span; + [ProcessorEvent.metric]: Metric; }[T]; type TypedLogEventSearchResponse = @@ -77,15 +75,13 @@ type TypedLogEventSearchResponse = type TypedSearchResponse = InferSearchResponseOf< TypeOfProcessorEvent< - ValuesType< - TParams['apm'] extends { events: ProcessorEvent[] } - ? TParams['apm']['events'] - : TParams['apm'] extends { sources: ApmDataSource[] } - ? ProcessorEventOfDocumentType< - ValuesType['documentType'] - > - : never - > + TParams['apm'] extends { events: ProcessorEvent[] } + ? ValuesType + : TParams['apm'] extends { sources: ApmDataSource[] } + ? ProcessorEventOfDocumentType< + ValuesType['documentType'] + > + : never >, TParams >; diff --git a/x-pack/plugins/apm/server/lib/helpers/create_es_client/document_type.ts b/x-pack/plugins/apm/server/lib/helpers/create_es_client/document_type.ts index a3f5ff8d5683c..bcafd76b8e222 100644 --- a/x-pack/plugins/apm/server/lib/helpers/create_es_client/document_type.ts +++ b/x-pack/plugins/apm/server/lib/helpers/create_es_client/document_type.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { ApmDocumentType } from '../../../../common/document_type'; import { @@ -33,18 +32,11 @@ function getDefaultFilter( ]; } -const documentTypeConfigMap: Record< - ApmDocumentType, - { - processorEvent: ProcessorEvent; - getQuery?: (rollupInterval: RollupInterval) => QueryDslQueryContainer; - rollupIntervals: RollupInterval[]; - } -> = { +const documentTypeConfigMap = { [ApmDocumentType.ServiceTransactionMetric]: { processorEvent: ProcessorEvent.metric, - getQuery: (rollupInterval) => ({ + getQuery: (rollupInterval: RollupInterval) => ({ bool: { filter: getDefaultFilter('service_transaction', rollupInterval), }, @@ -53,7 +45,7 @@ const documentTypeConfigMap: Record< }, [ApmDocumentType.ServiceSummaryMetric]: { processorEvent: ProcessorEvent.metric, - getQuery: (rollupInterval) => ({ + getQuery: (rollupInterval: RollupInterval) => ({ bool: { filter: getDefaultFilter('service_summary', rollupInterval), }, @@ -62,7 +54,7 @@ const documentTypeConfigMap: Record< }, [ApmDocumentType.TransactionMetric]: { processorEvent: ProcessorEvent.metric, - getQuery: (rollupInterval) => ({ + getQuery: (rollupInterval: RollupInterval) => ({ bool: { filter: rollupInterval === RollupInterval.OneMinute @@ -79,7 +71,7 @@ const documentTypeConfigMap: Record< [ApmDocumentType.ServiceDestinationMetric]: { processorEvent: ProcessorEvent.metric, rollupIntervals: defaultRollupIntervals, - getQuery: (rollupInterval) => ({ + getQuery: (rollupInterval: RollupInterval) => ({ bool: { filter: rollupInterval === RollupInterval.OneMinute @@ -92,7 +84,11 @@ const documentTypeConfigMap: Record< processorEvent: ProcessorEvent.error, rollupIntervals: [RollupInterval.None], }, -}; + [ApmDocumentType.SpanEvent]: { + processorEvent: ProcessorEvent.span, + rollupIntervals: [RollupInterval.None], + }, +} as const; type DocumentTypeConfigOf = typeof documentTypeConfigMap[TApmDocumentType]; diff --git a/x-pack/plugins/apm/server/lib/helpers/transactions/__snapshots__/get_is_using_transaction_events.test.ts.snap b/x-pack/plugins/apm/server/lib/helpers/transactions/__snapshots__/get_is_using_transaction_events.test.ts.snap index 325ce29af118d..192df5cc8eb3a 100644 --- a/x-pack/plugins/apm/server/lib/helpers/transactions/__snapshots__/get_is_using_transaction_events.test.ts.snap +++ b/x-pack/plugins/apm/server/lib/helpers/transactions/__snapshots__/get_is_using_transaction_events.test.ts.snap @@ -96,8 +96,11 @@ Array [ "get_has_transactions", Object { "apm": Object { - "events": Array [ - "transaction", + "sources": Array [ + Object { + "documentType": "transactionEvent", + "rollupInterval": "none", + }, ], }, "body": Object { diff --git a/x-pack/plugins/apm/server/lib/helpers/transactions/get_is_using_transaction_events.ts b/x-pack/plugins/apm/server/lib/helpers/transactions/get_is_using_transaction_events.ts index 20832c70d007b..0ba5fb5f92afd 100644 --- a/x-pack/plugins/apm/server/lib/helpers/transactions/get_is_using_transaction_events.ts +++ b/x-pack/plugins/apm/server/lib/helpers/transactions/get_is_using_transaction_events.ts @@ -6,10 +6,11 @@ */ import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { getSearchTransactionsEvents } from '.'; import { APMEventClient } from '../create_es_client/create_apm_event_client'; import { SearchAggregatedTransactionSetting } from '../../../../common/aggregated_transactions'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; import { APMConfig } from '../../..'; export async function getIsUsingTransactionEvents({ @@ -63,7 +64,12 @@ async function getHasTransactions({ }) { const response = await apmEventClient.search('get_has_transactions', { apm: { - events: [ProcessorEvent.transaction], + sources: [ + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: 1, diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index 525b2c5e2cbc5..07010d5f8dc5b 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -11,7 +11,6 @@ import { Logger, Plugin, PluginInitializerContext, - SavedObjectsClient, } from '@kbn/core/server'; import { isEmpty, mapValues } from 'lodash'; import { Dataset } from '@kbn/rule-registry-plugin/server'; @@ -50,7 +49,6 @@ import { scheduleSourceMapMigration } from './routes/source_maps/schedule_source import { createApmSourceMapIndexTemplate } from './routes/source_maps/create_apm_source_map_index_template'; import { addApiKeysToEveryPackagePolicyIfMissing } from './routes/fleet/api_keys/add_api_keys_to_policies_if_missing'; import { apmTutorialCustomIntegration } from '../common/tutorial/tutorials'; -import { APM_STATIC_DATA_VIEW_ID } from '../common/data_view_constants'; export class APMPlugin implements @@ -123,26 +121,6 @@ export class APMPlugin ], }); - // ensure that the APM data view is globally available - getCoreStart() - .then(async (coreStart) => { - const soClient = new SavedObjectsClient( - coreStart.savedObjects.createInternalRepository() - ); - - await soClient.updateObjectsSpaces( - [{ id: APM_STATIC_DATA_VIEW_ID, type: 'index-pattern' }], - ['*'], - [] - ); - }) - .catch((e) => { - this.logger?.error( - 'Failed to make APM data view available globally', - e - ); - }); - const resourcePlugins = mapValues(plugins, (value, key) => { return { setup: value, diff --git a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts index 714f97b1a4801..c3c1d7f124a54 100644 --- a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts +++ b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts @@ -5,20 +5,22 @@ * 2.0. */ -import { createStaticDataView } from './create_static_data_view'; -import * as HistoricalAgentData from '../historical_data/has_historical_agent_data'; +import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; +import { Logger } from '@kbn/core/server'; import { DataViewsService } from '@kbn/data-views-plugin/common'; -import { APMCore } from '../typings'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; -import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; import { APMRouteHandlerResources } from '../apm_routes/register_apm_server_routes'; +import * as HistoricalAgentData from '../historical_data/has_historical_agent_data'; +import { APMCore } from '../typings'; +import { createStaticDataView } from './create_static_data_view'; function getMockedDataViewService(existingDataViewTitle: string) { return { get: jest.fn(() => ({ - title: existingDataViewTitle, + getIndexPattern: () => existingDataViewTitle, })), createAndSave: jest.fn(), + delete: () => {}, } as unknown as DataViewsService; } @@ -36,6 +38,10 @@ const coreMock = { }, } as unknown as APMCore; +const logger = { + info: jest.fn, +} as unknown as Logger; + const apmEventClientMock = { search: jest.fn(), indices: { @@ -55,6 +61,8 @@ describe('createStaticDataView', () => { config: { autoCreateApmDataView: false }, } as APMRouteHandlerResources, dataViewService, + spaceId: 'default', + logger, }); expect(dataViewService.createAndSave).not.toHaveBeenCalled(); }); @@ -73,6 +81,8 @@ describe('createStaticDataView', () => { config: { autoCreateApmDataView: false }, } as APMRouteHandlerResources, dataViewService, + spaceId: 'default', + logger, }); expect(dataViewService.createAndSave).not.toHaveBeenCalled(); }); @@ -92,6 +102,8 @@ describe('createStaticDataView', () => { config: { autoCreateApmDataView: true }, } as APMRouteHandlerResources, dataViewService, + spaceId: 'default', + logger, }); expect(dataViewService.createAndSave).toHaveBeenCalled(); @@ -114,6 +126,8 @@ describe('createStaticDataView', () => { config: { autoCreateApmDataView: true }, } as APMRouteHandlerResources, dataViewService, + spaceId: 'default', + logger, }); expect(dataViewService.get).toHaveBeenCalled(); @@ -143,6 +157,8 @@ describe('createStaticDataView', () => { config: { autoCreateApmDataView: true }, } as APMRouteHandlerResources, dataViewService, + spaceId: 'default', + logger, }); expect(dataViewService.get).toHaveBeenCalled(); diff --git a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts index 715a568eaf6bd..5f2cf097f3e2e 100644 --- a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts +++ b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts @@ -5,18 +5,21 @@ * 2.0. */ -import { SavedObjectsErrorHelpers } from '@kbn/core/server'; +import { Logger, SavedObjectsErrorHelpers } from '@kbn/core/server'; import { DataView, DataViewsService } from '@kbn/data-views-plugin/common'; import { i18n } from '@kbn/i18n'; +import { + DO_NOT_USE_LEGACY_APM_STATIC_DATA_VIEW_ID, + getDataViewId, +} from '../../../common/data_view_constants'; import { TRACE_ID, TRANSACTION_ID, TRANSACTION_DURATION, } from '../../../common/es_fields/apm'; -import { APM_STATIC_DATA_VIEW_ID } from '../../../common/data_view_constants'; import { hasHistoricalAgentData } from '../historical_data/has_historical_agent_data'; import { withApmSpan } from '../../utils/with_apm_span'; -import { getApmDataViewTitle } from './get_apm_data_view_title'; +import { getApmDataViewIndexPattern } from './get_apm_data_view_index_pattern'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; import { APMRouteHandlerResources } from '../apm_routes/register_apm_server_routes'; @@ -29,12 +32,18 @@ export async function createStaticDataView({ dataViewService, resources, apmEventClient, + spaceId, + logger, }: { dataViewService: DataViewsService; resources: APMRouteHandlerResources; apmEventClient: APMEventClient; + spaceId: string; + logger: Logger; }): CreateDataViewResponse { const { config } = resources; + const dataViewId = getDataViewId(spaceId); + logger.info(`create static data view ${dataViewId}`); return withApmSpan('create_static_data_view', async () => { // don't auto-create APM data view if it's been disabled via the config @@ -61,10 +70,13 @@ export async function createStaticDataView({ }; } - const apmDataViewTitle = getApmDataViewTitle(apmEventClient.indices); + const apmDataViewIndexPattern = getApmDataViewIndexPattern( + apmEventClient.indices + ); const shouldCreateOrUpdate = await getShouldCreateOrUpdate({ - apmDataViewTitle, + apmDataViewIndexPattern, dataViewService, + dataViewId, }); if (!shouldCreateOrUpdate) { @@ -72,52 +84,48 @@ export async function createStaticDataView({ created: false, reason: i18n.translate( 'xpack.apm.dataView.alreadyExistsInActiveSpace', - { defaultMessage: 'Dataview already exists in the active space' } + { + defaultMessage: + 'Dataview already exists in the active space and does not need to be updated', + } ), }; } - return await withApmSpan('create_data_view', async () => { - try { - const dataView = await createAndSaveStaticDataView({ - dataViewService, - apmDataViewTitle, - }); - - await addDataViewToAllSpaces(resources); - - return { created: true, dataView }; - } catch (e) { - // if the data view (saved object) already exists a conflict error (code: 409) will be thrown - if (SavedObjectsErrorHelpers.isConflictError(e)) { - return { - created: false, - reason: i18n.translate( - 'xpack.apm.dataView.alreadyExistsInAnotherSpace', - { - defaultMessage: - 'Dataview already exists in another space but is not made available in this space', - } - ), - }; - } + // delete legacy global data view + + const dataView = await createAndSaveStaticDataView({ + dataViewService, + apmDataViewIndexPattern, + dataViewId, + }); + + try { + await dataViewService.delete(DO_NOT_USE_LEGACY_APM_STATIC_DATA_VIEW_ID); + } catch (e) { + // swallow error if caused by the data view (saved object) not existing + if (!SavedObjectsErrorHelpers.isNotFoundError(e)) { throw e; } - }); + } + + return { created: true, dataView }; }); } // only create data view if it doesn't exist or was changed async function getShouldCreateOrUpdate({ dataViewService, - apmDataViewTitle, + apmDataViewIndexPattern, + dataViewId, }: { dataViewService: DataViewsService; - apmDataViewTitle: string; + apmDataViewIndexPattern: string; + dataViewId: string; }) { try { - const existingDataView = await dataViewService.get(APM_STATIC_DATA_VIEW_ID); - return existingDataView.title !== apmDataViewTitle; + const existingDataView = await dataViewService.get(dataViewId); + return existingDataView.getIndexPattern() !== apmDataViewIndexPattern; } catch (e) { // ignore exception if the data view (saved object) is not found if (SavedObjectsErrorHelpers.isNotFoundError(e)) { @@ -128,32 +136,21 @@ async function getShouldCreateOrUpdate({ } } -async function addDataViewToAllSpaces(resources: APMRouteHandlerResources) { - const { request, core } = resources; - const startServices = await core.start(); - const scopedClient = startServices.savedObjects.getScopedClient(request); - - // make data view available across all spaces - return scopedClient.updateObjectsSpaces( - [{ id: APM_STATIC_DATA_VIEW_ID, type: 'index-pattern' }], - ['*'], - [] - ); -} - function createAndSaveStaticDataView({ dataViewService, - apmDataViewTitle, + apmDataViewIndexPattern, + dataViewId, }: { dataViewService: DataViewsService; - apmDataViewTitle: string; + apmDataViewIndexPattern: string; + dataViewId: string; }) { return dataViewService.createAndSave( { allowNoIndex: true, - id: APM_STATIC_DATA_VIEW_ID, + id: dataViewId, name: 'APM', - title: apmDataViewTitle, + title: apmDataViewIndexPattern, timeFieldName: '@timestamp', // link to APM from Discover diff --git a/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_title.test.ts b/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_index_pattern.test.ts similarity index 69% rename from x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_title.test.ts rename to x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_index_pattern.test.ts index a8dc25e493006..e7a0ee915c8cc 100644 --- a/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_title.test.ts +++ b/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_index_pattern.test.ts @@ -6,23 +6,23 @@ */ import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; -import { getApmDataViewTitle } from './get_apm_data_view_title'; +import { getApmDataViewIndexPattern } from './get_apm_data_view_index_pattern'; -describe('getApmDataViewTitle', () => { - it('returns a data view title by combining existing indicies', () => { - const title = getApmDataViewTitle({ +describe('getApmDataViewIndexPattern', () => { + it('returns a data view index pattern by combining existing indices', () => { + const indexPattern = getApmDataViewIndexPattern({ transaction: 'apm-*-transaction-*', span: 'apm-*-span-*', error: 'apm-*-error-*', metric: 'apm-*-metrics-*', } as APMIndices); - expect(title).toBe( + expect(indexPattern).toBe( 'apm-*-transaction-*,apm-*-span-*,apm-*-error-*,apm-*-metrics-*' ); }); it('removes duplicates', () => { - const title = getApmDataViewTitle({ + const title = getApmDataViewIndexPattern({ transaction: 'apm-*', span: 'apm-*', error: 'apm-*', diff --git a/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_title.ts b/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_index_pattern.ts similarity index 87% rename from x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_title.ts rename to x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_index_pattern.ts index 3061a1ac15714..b5c3fa0f73d28 100644 --- a/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_title.ts +++ b/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_index_pattern.ts @@ -8,7 +8,7 @@ import { uniq } from 'lodash'; import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; -export function getApmDataViewTitle(apmIndices: APMIndices) { +export function getApmDataViewIndexPattern(apmIndices: APMIndices) { return uniq([ apmIndices.transaction, apmIndices.span, diff --git a/x-pack/plugins/apm/server/routes/data_view/route.ts b/x-pack/plugins/apm/server/routes/data_view/route.ts index 388884c4f5761..429b74c99e63a 100644 --- a/x-pack/plugins/apm/server/routes/data_view/route.ts +++ b/x-pack/plugins/apm/server/routes/data_view/route.ts @@ -5,22 +5,32 @@ * 2.0. */ +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import { CreateDataViewResponse, createStaticDataView, } from './create_static_data_view'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; -import { getApmDataViewTitle } from './get_apm_data_view_title'; +import { getApmDataViewIndexPattern } from './get_apm_data_view_index_pattern'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; const staticDataViewRoute = createApmServerRoute({ endpoint: 'POST /internal/apm/data_view/static', options: { tags: ['access:apm'] }, handler: async (resources): CreateDataViewResponse => { - const { context, plugins, request } = resources; + const { context, plugins, request, logger } = resources; const apmEventClient = await getApmEventClient(resources); const coreContext = await context.core; + // get name of selected (name)space + const spacesStart = await plugins.spaces?.start(); + const spaceId = + spacesStart?.spacesService.getSpaceId(request) ?? DEFAULT_SPACE_ID; + + if (!spaceId) { + throw new Error('No spaceId found'); + } + const dataViewStart = await plugins.dataViews.start(); const dataViewService = await dataViewStart.dataViewsServiceFactory( coreContext.savedObjects.client, @@ -33,6 +43,8 @@ const staticDataViewRoute = createApmServerRoute({ dataViewService, resources, apmEventClient, + spaceId, + logger, }); return res; @@ -40,13 +52,15 @@ const staticDataViewRoute = createApmServerRoute({ }); const dataViewTitleRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/data_view/title', + endpoint: 'GET /internal/apm/data_view/index_pattern', options: { tags: ['access:apm'] }, - handler: async ({ getApmIndices }): Promise<{ apmDataViewTitle: string }> => { + handler: async ({ + getApmIndices, + }): Promise<{ apmDataViewIndexPattern: string }> => { const apmIndicies = await getApmIndices(); - const apmDataViewTitle = getApmDataViewTitle(apmIndicies); + const apmDataViewIndexPattern = getApmDataViewIndexPattern(apmIndicies); - return { apmDataViewTitle }; + return { apmDataViewIndexPattern }; }, }); diff --git a/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/get_buckets.test.ts.snap b/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/get_buckets.test.ts.snap index 54705647dc6a4..4145b9ae31da1 100644 --- a/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/get_buckets.test.ts.snap +++ b/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/get_buckets.test.ts.snap @@ -6,8 +6,11 @@ Array [ "get_error_distribution_buckets", Object { "apm": Object { - "events": Array [ - "error", + "sources": Array [ + Object { + "documentType": "error", + "rollupInterval": "none", + }, ], }, "body": Object { diff --git a/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/queries.test.ts.snap index a3127ee28c0b8..480283b7a690c 100644 --- a/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/routes/errors/distribution/__snapshots__/queries.test.ts.snap @@ -3,8 +3,11 @@ exports[`error distribution queries fetches an error distribution 1`] = ` Object { "apm": Object { - "events": Array [ - "error", + "sources": Array [ + Object { + "documentType": "error", + "rollupInterval": "none", + }, ], }, "body": Object { @@ -50,8 +53,11 @@ Object { exports[`error distribution queries fetches an error distribution with a group id 1`] = ` Object { "apm": Object { - "events": Array [ - "error", + "sources": Array [ + Object { + "documentType": "error", + "rollupInterval": "none", + }, ], }, "body": Object { diff --git a/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.test.ts b/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.test.ts index 4a3fc6d969cd0..a8994fd4ec2c6 100644 --- a/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.test.ts +++ b/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.test.ts @@ -6,7 +6,8 @@ */ import { getBuckets } from './get_buckets'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; describe('get buckets', () => { let clientSpy: jest.Mock; @@ -42,6 +43,11 @@ describe('get buckets', () => { it('should limit query results to error documents', () => { const query = clientSpy.mock.calls[0][1]; - expect(query.apm.events).toEqual([ProcessorEvent.error]); + expect(query.apm.sources).toEqual([ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ]); }); }); diff --git a/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.ts b/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.ts index 72e9b1c1b2d55..83e9d4475bfb8 100644 --- a/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.ts +++ b/x-pack/plugins/apm/server/routes/errors/distribution/get_buckets.ts @@ -10,8 +10,9 @@ import { kqlQuery, termQuery, } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; +import { ApmDocumentType } from '../../../../common/document_type'; import { ERROR_GROUP_ID, SERVICE_NAME } from '../../../../common/es_fields/apm'; +import { RollupInterval } from '../../../../common/rollup'; import { environmentQuery } from '../../../../common/utils/environment_query'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; @@ -36,7 +37,12 @@ export async function getBuckets({ }) { const params = { apm: { - events: [ProcessorEvent.error], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts b/x-pack/plugins/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts index 31695c0a127d2..41f49959aa70c 100644 --- a/x-pack/plugins/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts +++ b/x-pack/plugins/apm/server/routes/errors/erroneous_transactions/get_top_erroneous_transactions.ts @@ -17,7 +17,6 @@ import { kqlQuery, termQuery, } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { keyBy } from 'lodash'; import { ERROR_GROUP_ID, @@ -28,6 +27,8 @@ import { import { environmentQuery } from '../../../../common/utils/environment_query'; import { getBucketSize } from '../../../../common/utils/get_bucket_size'; import { getOffsetInMs } from '../../../../common/utils/get_offset_in_ms'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; async function getTopErroneousTransactions({ @@ -65,7 +66,12 @@ async function getTopErroneousTransactions({ const res = await apmEventClient.search('get_top_erroneous_transactions', { apm: { - events: [ProcessorEvent.error], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, @@ -112,17 +118,19 @@ async function getTopErroneousTransactions({ return ( res.aggregations?.top_five_transactions.buckets.map( - ({ key, doc_count: docCount, sample, timeseries }) => ({ - transactionName: key as string, - transactionType: sample.hits.hits[0]._source.transaction?.type, - occurrences: docCount, - timeseries: timeseries.buckets.map((timeseriesBucket) => { - return { - x: timeseriesBucket.key + offsetInMs, - y: timeseriesBucket.doc_count, - }; - }), - }) + ({ key, doc_count: docCount, sample, timeseries }) => { + return { + transactionName: key as string, + transactionType: sample.hits.hits[0]._source.transaction?.type, + occurrences: docCount, + timeseries: timeseries.buckets.map((timeseriesBucket) => { + return { + x: timeseriesBucket.key + offsetInMs, + y: timeseriesBucket.doc_count, + }; + }), + }; + } ) ?? [] ); } 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 cf799a47f7dc4..182fe0a1cdd8a 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 @@ -11,7 +11,6 @@ import { rangeQuery, termQuery, } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { ERROR_CULPRIT, ERROR_EXC_HANDLED, @@ -26,6 +25,8 @@ import { import { environmentQuery } from '../../../../common/utils/environment_query'; import { getErrorName } from '../../../lib/helpers/get_error_name'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; export type ErrorGroupMainStatisticsResponse = Array<{ groupId: string; @@ -75,7 +76,12 @@ export async function getErrorGroupMainStatistics({ 'get_error_group_main_statistics', { apm: { - events: [ProcessorEvent.error], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, @@ -128,16 +134,19 @@ export async function getErrorGroupMainStatistics({ ); return ( - response.aggregations?.error_groups.buckets.map((bucket) => ({ - groupId: bucket.key as string, - name: getErrorName(bucket.sample.hits.hits[0]._source), - lastSeen: new Date( - bucket.sample.hits.hits[0]?._source['@timestamp'] - ).getTime(), - occurrences: bucket.doc_count, - culprit: bucket.sample.hits.hits[0]?._source.error.culprit, - handled: bucket.sample.hits.hits[0]?._source.error.exception?.[0].handled, - type: bucket.sample.hits.hits[0]?._source.error.exception?.[0].type, - })) ?? [] + response.aggregations?.error_groups.buckets.map((bucket) => { + return { + groupId: bucket.key as string, + name: getErrorName(bucket.sample.hits.hits[0]._source), + lastSeen: new Date( + bucket.sample.hits.hits[0]._source['@timestamp'] + ).getTime(), + occurrences: bucket.doc_count, + culprit: bucket.sample.hits.hits[0]._source.error.culprit, + handled: + bucket.sample.hits.hits[0]._source.error.exception?.[0].handled, + type: bucket.sample.hits.hits[0]._source.error.exception?.[0].type, + }; + }) ?? [] ); } diff --git a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_sample_ids.ts b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_sample_ids.ts index 2796ec590ad42..0a154d3ad13fa 100644 --- a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_sample_ids.ts +++ b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_sample_ids.ts @@ -6,7 +6,6 @@ */ import { rangeQuery, kqlQuery } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { asMutableArray } from '../../../../common/utils/as_mutable_array'; import { ERROR_GROUP_ID, @@ -16,6 +15,8 @@ import { } from '../../../../common/es_fields/apm'; import { environmentQuery } from '../../../../common/utils/environment_query'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; const ERROR_SAMPLES_SIZE = 10000; @@ -41,9 +42,14 @@ export async function getErrorGroupSampleIds({ start: number; end: number; }): Promise { - const params = { + const resp = await apmEventClient.search('get_error_group_sample_ids', { apm: { - events: [ProcessorEvent.error as const], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: ERROR_SAMPLES_SIZE, @@ -66,13 +72,11 @@ export async function getErrorGroupSampleIds({ { '@timestamp': { order: 'desc' } }, // sort by timestamp to get the most recent error ] as const), }, - }; - - const resp = await apmEventClient.search( - 'get_error_group_sample_ids', - params - ); - const errorSampleIds = resp.hits.hits.map((item) => item._source.error.id); + }); + const errorSampleIds = resp.hits.hits.map((item) => { + const source = item._source; + return source.error.id; + }); return { errorSampleIds, diff --git a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts index cb11c0154be61..348949d3ecca5 100644 --- a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts +++ b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_sample_details.ts @@ -6,9 +6,10 @@ */ import { rangeQuery, kqlQuery } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { ERROR_ID, SERVICE_NAME } from '../../../../common/es_fields/apm'; import { environmentQuery } from '../../../../common/utils/environment_query'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { getTransaction } from '../../transactions/get_transaction'; import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; @@ -38,7 +39,12 @@ export async function getErrorSampleDetails({ }): Promise { const params = { apm: { - events: [ProcessorEvent.error as const], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent as const, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/metrics/serverless/get_serverless_summary.ts b/x-pack/plugins/apm/server/routes/metrics/serverless/get_serverless_summary.ts index 8deb85264e019..b6ea22e03d506 100644 --- a/x-pack/plugins/apm/server/routes/metrics/serverless/get_serverless_summary.ts +++ b/x-pack/plugins/apm/server/routes/metrics/serverless/get_serverless_summary.ts @@ -10,6 +10,7 @@ import { kqlQuery, rangeQuery, } from '@kbn/observability-plugin/server'; +import { ApmDocumentType } from '../../../../common/document_type'; import { FAAS_BILLED_DURATION, FAAS_DURATION, @@ -20,6 +21,7 @@ import { METRIC_SYSTEM_TOTAL_MEMORY, SERVICE_NAME, } from '../../../../common/es_fields/apm'; +import { RollupInterval } from '../../../../common/rollup'; import { environmentQuery } from '../../../../common/utils/environment_query'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { computeUsageAvgScript } from './get_compute_usage_chart'; @@ -52,7 +54,12 @@ async function getServerlessTransactionThroughput({ }) { const params = { apm: { - events: [ProcessorEvent.transaction], + sources: [ + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: true, diff --git a/x-pack/plugins/apm/server/routes/mobile/get_device_os_app.ts b/x-pack/plugins/apm/server/routes/mobile/get_device_os_app.ts index e2194b994b02d..80fae958b6c53 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_device_os_app.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_device_os_app.ts @@ -10,7 +10,6 @@ import { kqlQuery, rangeQuery, } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { DEVICE_MODEL_IDENTIFIER, HOST_OS_VERSION, @@ -19,6 +18,8 @@ import { TRANSACTION_TYPE, } from '../../../common/es_fields/apm'; import { environmentQuery } from '../../../common/utils/environment_query'; +import { ApmDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; export async function getDeviceOSApp({ @@ -42,7 +43,12 @@ export async function getDeviceOSApp({ }) { return await apmEventClient.search('get_mobile_device_os_app', { apm: { - events: [ProcessorEvent.transaction], + sources: [ + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/mobile/get_mobile_crash_rate.ts b/x-pack/plugins/apm/server/routes/mobile/get_mobile_crash_rate.ts index bf498bf704607..e60d0ff15c624 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_mobile_crash_rate.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_mobile_crash_rate.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { kqlQuery, rangeQuery, @@ -23,6 +22,8 @@ import { import { environmentQuery } from '../../../common/utils/environment_query'; import { getOffsetInMs } from '../../../common/utils/get_offset_in_ms'; import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; +import { ApmDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; export interface CrashRateTimeseries { currentPeriod: { timeseries: Coordinate[]; value: Maybe }; @@ -70,7 +71,12 @@ async function getMobileCrashTimeseries({ const response = await apmEventClient.search('get_mobile_crash_rate', { apm: { - events: [ProcessorEvent.error], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/mobile/get_mobile_crashes_by_location.ts b/x-pack/plugins/apm/server/routes/mobile/get_mobile_crashes_by_location.ts index 855ae8fb35d05..e91214af444b1 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_mobile_crashes_by_location.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_mobile_crashes_by_location.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { kqlQuery, rangeQuery, @@ -16,6 +15,8 @@ import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_ev import { getOffsetInMs } from '../../../common/utils/get_offset_in_ms'; import { getBucketSize } from '../../../common/utils/get_bucket_size'; import { environmentQuery } from '../../../common/utils/environment_query'; +import { ApmDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; interface Props { kuery: string; @@ -64,7 +65,12 @@ export async function getCrashesByLocation({ }; const response = await apmEventClient.search('get_mobile_location_crashes', { apm: { - events: [ProcessorEvent.error], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions.ts b/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions.ts index e3ccd83c20bf0..9168101ebc40e 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { kqlQuery, rangeQuery, @@ -23,6 +22,8 @@ import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_ev import { getBucketSize } from '../../../common/utils/get_bucket_size'; import { Coordinate } from '../../../typings/timeseries'; import { Maybe } from '../../../typings/common'; +import { ApmDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; export interface SessionsTimeseries { currentPeriod: { timeseries: Coordinate[]; value: Maybe }; @@ -70,7 +71,12 @@ async function getSessionTimeseries({ const response = await apmEventClient.search('get_mobile_sessions', { apm: { - events: [ProcessorEvent.transaction], + sources: [ + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions_by_location.ts b/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions_by_location.ts index 95ad146f585f0..7543d097d888b 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions_by_location.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_mobile_sessions_by_location.ts @@ -10,12 +10,13 @@ import { kqlQuery, rangeQuery, } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { SERVICE_NAME, SESSION_ID } from '../../../common/es_fields/apm'; import { environmentQuery } from '../../../common/utils/environment_query'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; import { getOffsetInMs } from '../../../common/utils/get_offset_in_ms'; import { getBucketSize } from '../../../common/utils/get_bucket_size'; +import { ApmDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; interface Props { kuery: string; @@ -65,7 +66,12 @@ export async function getSessionsByLocation({ const response = await apmEventClient.search('get_mobile_location_sessions', { apm: { - events: [ProcessorEvent.transaction], + sources: [ + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/mobile/get_nct.ts b/x-pack/plugins/apm/server/routes/mobile/get_nct.ts index 829f40962f84d..f84701ecfb293 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_nct.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_nct.ts @@ -10,12 +10,13 @@ import { kqlQuery, rangeQuery, } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { NETWORK_CONNECTION_TYPE, SERVICE_NAME, } from '../../../common/es_fields/apm'; import { environmentQuery } from '../../../common/utils/environment_query'; +import { ApmDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; export async function getNCT({ @@ -38,7 +39,12 @@ export async function getNCT({ }) { return await apmEventClient.search('get_mobile_nct', { apm: { - events: [ProcessorEvent.span], + sources: [ + { + documentType: ApmDocumentType.SpanEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/profiling/route.ts b/x-pack/plugins/apm/server/routes/profiling/route.ts index 9d5853c288336..16b1b5fd56614 100644 --- a/x-pack/plugins/apm/server/routes/profiling/route.ts +++ b/x-pack/plugins/apm/server/routes/profiling/route.ts @@ -10,11 +10,15 @@ import type { BaseFlameGraph, TopNFunctions } from '@kbn/profiling-utils'; import * as t from 'io-ts'; import { profilingUseLegacyFlamegraphAPI } from '@kbn/observability-plugin/common'; import { HOST_NAME } from '../../../common/es_fields/apm'; -import { toKueryFilterFormat } from '../../../common/utils/to_kuery_filter_format'; +import { + mergeKueries, + toKueryFilterFormat, +} from '../../../common/utils/kuery_utils'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { environmentRt, + kueryRt, rangeRt, serviceTransactionDataSourceRt, } from '../default_api_types'; @@ -28,6 +32,7 @@ const profilingFlamegraphRoute = createApmServerRoute({ rangeRt, environmentRt, serviceTransactionDataSourceRt, + kueryRt, ]), }), options: { tags: ['access:apm'] }, @@ -48,7 +53,7 @@ const profilingFlamegraphRoute = createApmServerRoute({ await plugins.profilingDataAccess?.start(), ]); if (profilingDataAccessStart) { - const { start, end, environment, documentType, rollupInterval } = + const { start, end, environment, documentType, rollupInterval, kuery } = params.query; const { serviceName } = params.path; @@ -71,7 +76,10 @@ const profilingFlamegraphRoute = createApmServerRoute({ esClient: esClient.asCurrentUser, rangeFromMs: start, rangeToMs: end, - kuery: toKueryFilterFormat(HOST_NAME, serviceHostNames), + kuery: mergeKueries([ + `(${toKueryFilterFormat(HOST_NAME, serviceHostNames)})`, + kuery, + ]), useLegacyFlamegraphAPI, }); @@ -91,6 +99,7 @@ const profilingFunctionsRoute = createApmServerRoute({ environmentRt, serviceTransactionDataSourceRt, t.type({ startIndex: toNumberRt, endIndex: toNumberRt }), + kueryRt, ]), }), options: { tags: ['access:apm'] }, @@ -113,6 +122,7 @@ const profilingFunctionsRoute = createApmServerRoute({ endIndex, documentType, rollupInterval, + kuery, } = params.query; const { serviceName } = params.path; @@ -134,7 +144,10 @@ const profilingFunctionsRoute = createApmServerRoute({ esClient: esClient.asCurrentUser, rangeFromMs: start, rangeToMs: end, - kuery: toKueryFilterFormat(HOST_NAME, serviceHostNames), + kuery: mergeKueries([ + `(${toKueryFilterFormat(HOST_NAME, serviceHostNames)})`, + kuery, + ]), startIndex, endIndex, }); diff --git a/x-pack/plugins/apm/server/routes/services/get_service_node_metadata.ts b/x-pack/plugins/apm/server/routes/services/get_service_node_metadata.ts index e327bf1e7cdb7..033e343084783 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_node_metadata.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_node_metadata.ts @@ -6,7 +6,6 @@ */ import { kqlQuery, rangeQuery } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { HOST_NAME, CONTAINER_ID } from '../../../common/es_fields/apm'; import { NOT_AVAILABLE_LABEL } from '../../../common/i18n'; import { SERVICE_NAME, SERVICE_NODE_NAME } from '../../../common/es_fields/apm'; @@ -15,6 +14,8 @@ import { serviceNodeNameQuery, } from '../../../common/utils/environment_query'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; +import { ApmServiceTransactionDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; export interface ServiceNodeMetadataResponse { host: string | number; @@ -29,6 +30,8 @@ export async function getServiceNodeMetadata({ start, end, environment, + documentType, + rollupInterval, }: { kuery: string; serviceName: string; @@ -37,10 +40,17 @@ export async function getServiceNodeMetadata({ start: number; end: number; environment: string; + documentType: ApmServiceTransactionDocumentType; + rollupInterval: RollupInterval; }): Promise { const params = { apm: { - events: [ProcessorEvent.metric], + sources: [ + { + documentType, + rollupInterval, + }, + ], }, body: { track_total_hits: false, @@ -78,14 +88,14 @@ export async function getServiceNodeMetadata({ }, }; - const response = await apmEventClient.search( + const { aggregations } = await apmEventClient.search( 'get_service_node_metadata', params ); return { - host: response.aggregations?.host.buckets[0]?.key || NOT_AVAILABLE_LABEL, + host: aggregations?.host.buckets[0]?.key || NOT_AVAILABLE_LABEL, containerId: - response.aggregations?.containerId.buckets[0]?.key || NOT_AVAILABLE_LABEL, + aggregations?.containerId.buckets[0]?.key || NOT_AVAILABLE_LABEL, }; } diff --git a/x-pack/plugins/apm/server/routes/services/route.ts b/x-pack/plugins/apm/server/routes/services/route.ts index 24dc79ea668b4..0a51a3e88379f 100644 --- a/x-pack/plugins/apm/server/routes/services/route.ts +++ b/x-pack/plugins/apm/server/routes/services/route.ts @@ -368,14 +368,20 @@ const serviceNodeMetadataRoute = createApmServerRoute({ serviceName: t.string, serviceNodeName: t.string, }), - query: t.intersection([kueryRt, rangeRt, environmentRt]), + query: t.intersection([ + kueryRt, + rangeRt, + environmentRt, + serviceTransactionDataSourceRt, + ]), }), options: { tags: ['access:apm'] }, handler: async (resources): Promise => { const apmEventClient = await getApmEventClient(resources); const { params } = resources; const { serviceName, serviceNodeName } = params.path; - const { kuery, start, end, environment } = params.query; + const { kuery, start, end, environment, documentType, rollupInterval } = + params.query; return getServiceNodeMetadata({ kuery, @@ -385,6 +391,8 @@ const serviceNodeMetadataRoute = createApmServerRoute({ start, end, environment, + documentType, + rollupInterval, }); }, }); diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link/__snapshots__/get_transaction.test.ts.snap b/x-pack/plugins/apm/server/routes/settings/custom_link/__snapshots__/get_transaction.test.ts.snap index 3a738243cf5c7..ea8d4318f4c50 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link/__snapshots__/get_transaction.test.ts.snap +++ b/x-pack/plugins/apm/server/routes/settings/custom_link/__snapshots__/get_transaction.test.ts.snap @@ -3,8 +3,11 @@ exports[`custom link get transaction fetches with all filter 1`] = ` Object { "apm": Object { - "events": Array [ - "transaction", + "sources": Array [ + Object { + "documentType": "transactionEvent", + "rollupInterval": "none", + }, ], }, "body": Object { @@ -52,8 +55,11 @@ Object { exports[`custom link get transaction fetches without filter 1`] = ` Object { "apm": Object { - "events": Array [ - "transaction", + "sources": Array [ + Object { + "documentType": "transactionEvent", + "rollupInterval": "none", + }, ], }, "body": Object { diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link/get_transaction.ts b/x-pack/plugins/apm/server/routes/settings/custom_link/get_transaction.ts index d454b447b17f9..58cdd55b2d443 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link/get_transaction.ts +++ b/x-pack/plugins/apm/server/routes/settings/custom_link/get_transaction.ts @@ -7,7 +7,8 @@ import * as t from 'io-ts'; import { compact } from 'lodash'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; import { filterOptionsRt } from './custom_link_types'; import { splitFilterValueByComma } from './helper'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; @@ -29,10 +30,15 @@ export async function getTransaction({ }) ); - const params = { + const resp = await apmEventClient.search('get_transaction_for_custom_link', { terminate_after: 1, apm: { - events: [ProcessorEvent.transaction as const], + sources: [ + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, @@ -43,10 +49,6 @@ export async function getTransaction({ }, }, }, - }; - const resp = await apmEventClient.search( - 'get_transaction_for_custom_link', - params - ); + }); return resp.hits.hits[0]?._source; } diff --git a/x-pack/plugins/apm/server/routes/traces/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/routes/traces/__snapshots__/queries.test.ts.snap index a490aec44a366..d64c33a421e19 100644 --- a/x-pack/plugins/apm/server/routes/traces/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/routes/traces/__snapshots__/queries.test.ts.snap @@ -3,8 +3,11 @@ exports[`trace queries fetches a trace 1`] = ` Object { "apm": Object { - "events": Array [ - "error", + "sources": Array [ + Object { + "documentType": "error", + "rollupInterval": "none", + }, ], }, "body": Object { diff --git a/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts b/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts index a1637b29d8e78..3a3e9b8fe2952 100644 --- a/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts +++ b/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts @@ -55,6 +55,8 @@ import { } from '../../../common/waterfall/typings'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; import { getSpanLinksCountById } from '../span_links/get_linked_children'; +import { ApmDocumentType } from '../../../common/document_type'; +import { RollupInterval } from '../../../common/rollup'; export interface TraceItems { exceedsMax: boolean; @@ -87,7 +89,12 @@ export async function getTraceItems({ const errorResponsePromise = apmEventClient.search('get_errors_docs', { apm: { - events: [ProcessorEvent.error], + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/server/routes/transactions/__snapshots__/queries.test.ts.snap b/x-pack/plugins/apm/server/routes/transactions/__snapshots__/queries.test.ts.snap index 4ff86970a611a..deb1dec096f08 100644 --- a/x-pack/plugins/apm/server/routes/transactions/__snapshots__/queries.test.ts.snap +++ b/x-pack/plugins/apm/server/routes/transactions/__snapshots__/queries.test.ts.snap @@ -3,8 +3,11 @@ exports[`transaction queries fetches a transaction 1`] = ` Object { "apm": Object { - "events": Array [ - "transaction", + "sources": Array [ + Object { + "documentType": "transactionEvent", + "rollupInterval": "none", + }, ], }, "body": Object { diff --git a/x-pack/plugins/apm/server/routes/transactions/get_transaction/index.ts b/x-pack/plugins/apm/server/routes/transactions/get_transaction/index.ts index 77935244361b6..8854f3075e59b 100644 --- a/x-pack/plugins/apm/server/routes/transactions/get_transaction/index.ts +++ b/x-pack/plugins/apm/server/routes/transactions/get_transaction/index.ts @@ -6,10 +6,11 @@ */ import { rangeQuery, termQuery } from '@kbn/observability-plugin/server'; -import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { TRACE_ID, TRANSACTION_ID } from '../../../../common/es_fields/apm'; import { asMutableArray } from '../../../../common/utils/as_mutable_array'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { RollupInterval } from '../../../../common/rollup'; export async function getTransaction({ transactionId, @@ -26,7 +27,12 @@ export async function getTransaction({ }) { const resp = await apmEventClient.search('get_transaction', { apm: { - events: [ProcessorEvent.transaction], + sources: [ + { + documentType: ApmDocumentType.TransactionEvent, + rollupInterval: RollupInterval.None, + }, + ], }, body: { track_total_hits: false, diff --git a/x-pack/plugins/apm/tsconfig.json b/x-pack/plugins/apm/tsconfig.json index 0c0e2780950ea..0acdd619492ce 100644 --- a/x-pack/plugins/apm/tsconfig.json +++ b/x-pack/plugins/apm/tsconfig.json @@ -103,6 +103,8 @@ "@kbn/monaco", "@kbn/shared-svg", "@kbn/deeplinks-observability", + "@kbn/custom-icons", + "@kbn/elastic-agent-utils", "@kbn/shared-ux-link-redirect-app" ], "exclude": ["target/**/*"] diff --git a/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts b/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts index 4f19793004815..5aaba852055bc 100644 --- a/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts +++ b/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts @@ -5,39 +5,13 @@ * 2.0. */ -export type ElasticAgentName = - | 'go' - | 'java' - | 'js-base' - | 'iOS/swift' - | 'rum-js' - | 'nodejs' - | 'python' - | 'dotnet' - | 'ruby' - | 'php' - | 'android/java'; +import type { AgentName } from '@kbn/elastic-agent-utils'; -export type OpenTelemetryAgentName = - | 'otlp' - | 'opentelemetry/cpp' - | 'opentelemetry/dotnet' - | 'opentelemetry/erlang' - | 'opentelemetry/go' - | 'opentelemetry/java' - | 'opentelemetry/nodejs' - | 'opentelemetry/php' - | 'opentelemetry/python' - | 'opentelemetry/ruby' - | 'opentelemetry/rust' - | 'opentelemetry/swift' - | 'opentelemetry/webjs'; - -/* - * Support additional agent types by appending definitions in mappings.json - * (for telemetry) and the AgentName type. - */ -export type AgentName = ElasticAgentName | OpenTelemetryAgentName; +export type { + ElasticAgentName, + OpenTelemetryAgentName, + AgentName, +} from '@kbn/elastic-agent-utils'; export interface Agent { ephemeral_id?: string; diff --git a/x-pack/plugins/asset_manager/common/constants_routes.ts b/x-pack/plugins/asset_manager/common/constants_routes.ts index 969df93d1bc9d..6bbde84cc668b 100644 --- a/x-pack/plugins/asset_manager/common/constants_routes.ts +++ b/x-pack/plugins/asset_manager/common/constants_routes.ts @@ -18,3 +18,4 @@ export const GET_ASSETS_DIFF = base('/assets/diff'); export const GET_HOSTS = base('/assets/hosts'); export const GET_SERVICES = base('/assets/services'); export const GET_CONTAINERS = base('/assets/containers'); +export const GET_PODS = base('/assets/pods'); diff --git a/x-pack/plugins/asset_manager/common/types_api.ts b/x-pack/plugins/asset_manager/common/types_api.ts index dd555c69328e5..8c6d7cf5fb0a1 100644 --- a/x-pack/plugins/asset_manager/common/types_api.ts +++ b/x-pack/plugins/asset_manager/common/types_api.ts @@ -172,6 +172,7 @@ export const assetFiltersSingleKindRT = rt.exact( id: rt.string, ['cloud.provider']: rt.string, ['cloud.region']: rt.string, + ['orchestrator.cluster.name']: rt.string, }) ); @@ -258,3 +259,21 @@ export const getServiceAssetsResponseRT = rt.type({ services: rt.array(assetRT), }); export type GetServiceAssetsResponse = rt.TypeOf; + +/** + * Pods + */ +export const getPodAssetsQueryOptionsRT = rt.intersection([ + rt.strict({ from: assetDateRT }), + rt.partial({ + to: assetDateRT, + size: sizeRT, + stringFilters: rt.string, + filters: assetFiltersSingleKindRT, + }), +]); +export type GetPodAssetsQueryOptions = rt.TypeOf; +export const getPodAssetsResponseRT = rt.type({ + pods: rt.array(assetRT), +}); +export type GetPodAssetsResponse = rt.TypeOf; diff --git a/x-pack/plugins/asset_manager/common/types_client.ts b/x-pack/plugins/asset_manager/common/types_client.ts index 40b3eb5e07e8f..5025bbdceed58 100644 --- a/x-pack/plugins/asset_manager/common/types_client.ts +++ b/x-pack/plugins/asset_manager/common/types_client.ts @@ -19,6 +19,7 @@ export interface SharedAssetsOptionsPublic { export type GetHostsOptionsPublic = SharedAssetsOptionsPublic; export type GetContainersOptionsPublic = SharedAssetsOptionsPublic; +export type GetPodsOptionsPublic = SharedAssetsOptionsPublic; export interface GetServicesOptionsPublic extends SharedAssetsOptionsPublic { diff --git a/x-pack/plugins/asset_manager/public/lib/public_assets_client.ts b/x-pack/plugins/asset_manager/public/lib/public_assets_client.ts index 7ff5617d8ceb5..2da23c359d4b9 100644 --- a/x-pack/plugins/asset_manager/public/lib/public_assets_client.ts +++ b/x-pack/plugins/asset_manager/public/lib/public_assets_client.ts @@ -10,13 +10,15 @@ import { GetContainersOptionsPublic, GetHostsOptionsPublic, GetServicesOptionsPublic, + GetPodsOptionsPublic, } from '../../common/types_client'; import { GetContainerAssetsResponse, GetHostAssetsResponse, GetServiceAssetsResponse, + GetPodAssetsResponse, } from '../../common/types_api'; -import { GET_CONTAINERS, GET_HOSTS, GET_SERVICES } from '../../common/constants_routes'; +import { GET_CONTAINERS, GET_HOSTS, GET_SERVICES, GET_PODS } from '../../common/constants_routes'; import { IPublicAssetsClient } from '../types'; export class PublicAssetsClient implements IPublicAssetsClient { @@ -57,4 +59,16 @@ export class PublicAssetsClient implements IPublicAssetsClient { return results; } + + async getPods(options: GetPodsOptionsPublic) { + const { filters, ...otherOptions } = options; + const results = await this.http.get(GET_PODS, { + query: { + stringFilters: JSON.stringify(filters), + ...otherOptions, + }, + }); + + return results; + } } diff --git a/x-pack/plugins/asset_manager/server/lib/accessors/containers/get_containers.test.ts b/x-pack/plugins/asset_manager/server/lib/accessors/containers/get_containers.test.ts index 0a7b34b9ad1ad..8a7aad907a368 100644 --- a/x-pack/plugins/asset_manager/server/lib/accessors/containers/get_containers.test.ts +++ b/x-pack/plugins/asset_manager/server/lib/accessors/containers/get_containers.test.ts @@ -32,7 +32,7 @@ function createBaseOptions({ }; } -describe('getHosts', () => { +describe('getContainers', () => { let getApmIndicesMock = createGetApmIndicesMock(); let metricsDataClientMock = MetricsDataClientMock.create(); let baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); diff --git a/x-pack/plugins/asset_manager/server/lib/accessors/pods/get_pods.test.ts b/x-pack/plugins/asset_manager/server/lib/accessors/pods/get_pods.test.ts new file mode 100644 index 0000000000000..94d367963588c --- /dev/null +++ b/x-pack/plugins/asset_manager/server/lib/accessors/pods/get_pods.test.ts @@ -0,0 +1,341 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import { GetApmIndicesMethod } from '../../asset_client_types'; +import { getPods } from './get_pods'; +import { + createGetApmIndicesMock, + expectToThrowValidationErrorWithStatusCode, +} from '../../../test_utils'; +import { MetricsDataClient, MetricsDataClientMock } from '@kbn/metrics-data-access-plugin/server'; +import { SearchRequest } from '@elastic/elasticsearch/lib/api/types'; + +function createBaseOptions({ + getApmIndicesMock, + metricsDataClientMock, +}: { + getApmIndicesMock: GetApmIndicesMethod; + metricsDataClientMock: MetricsDataClient; +}) { + return { + sourceIndices: { + logs: 'my-logs*', + }, + getApmIndices: getApmIndicesMock, + metricsClient: metricsDataClientMock, + }; +} + +describe('getPods', () => { + let getApmIndicesMock = createGetApmIndicesMock(); + let metricsDataClientMock = MetricsDataClientMock.create(); + let baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); + let esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; + let soClientMock = savedObjectsClientMock.create(); + + function resetMocks() { + getApmIndicesMock = createGetApmIndicesMock(); + metricsDataClientMock = MetricsDataClientMock.create(); + baseOptions = createBaseOptions({ getApmIndicesMock, metricsDataClientMock }); + esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; + soClientMock = savedObjectsClientMock.create(); + } + + beforeEach(() => { + resetMocks(); + + // ES returns no results, just enough structure to not blow up + esClientMock.search.mockResolvedValueOnce({ + took: 1, + timed_out: false, + _shards: { + failed: 0, + successful: 1, + total: 1, + }, + hits: { + hits: [], + }, + }); + }); + + it('should query Elasticsearch correctly', async () => { + await getPods({ + ...baseOptions, + from: 'now-5d', + to: 'now-3d', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + }); + + expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledTimes(1); + expect(metricsDataClientMock.getMetricIndices).toHaveBeenCalledWith({ + savedObjectsClient: soClientMock, + }); + + const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; + const { bool } = dsl?.query || {}; + expect(bool).toBeDefined(); + + expect(bool?.filter).toEqual([ + { + range: { + '@timestamp': { + gte: 'now-5d', + lte: 'now-3d', + }, + }, + }, + ]); + + expect(bool?.must).toEqual([ + { + exists: { + field: 'kubernetes.pod.uid', + }, + }, + { + exists: { + field: 'kubernetes.node.name', + }, + }, + ]); + }); + + it('should correctly include an EAN filter as a pod ID term query', async () => { + const mockPodId = '123abc'; + + await getPods({ + ...baseOptions, + from: 'now-1h', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + filters: { + ean: `pod:${mockPodId}`, + }, + }); + + const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; + const { bool } = dsl?.query || {}; + expect(bool).toBeDefined(); + + expect(bool?.must).toEqual( + expect.arrayContaining([ + { + exists: { + field: 'kubernetes.pod.uid', + }, + }, + { + exists: { + field: 'kubernetes.node.name', + }, + }, + { + term: { + 'kubernetes.pod.uid': mockPodId, + }, + }, + ]) + ); + }); + + it('should not query ES and return empty if filtering on non-pod EAN', async () => { + const mockId = 'some-id-123'; + + const result = await getPods({ + ...baseOptions, + from: 'now-1h', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + filters: { + ean: `container:${mockId}`, + }, + }); + + expect(esClientMock.search).toHaveBeenCalledTimes(0); + expect(result).toEqual({ pods: [] }); + }); + + it('should include a wildcard ID filter when an ID filter is provided with asterisks included', async () => { + const mockIdPattern = '*partial-id*'; + + await getPods({ + ...baseOptions, + from: 'now-1h', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + filters: { + id: mockIdPattern, + }, + }); + + const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; + const { bool } = dsl?.query || {}; + expect(bool).toBeDefined(); + + expect(bool?.must).toEqual( + expect.arrayContaining([ + { + exists: { + field: 'kubernetes.pod.uid', + }, + }, + { + exists: { + field: 'kubernetes.node.name', + }, + }, + { + wildcard: { + 'kubernetes.pod.uid': mockIdPattern, + }, + }, + ]) + ); + }); + + it('should include a term ID filter when an ID filter is provided without asterisks included', async () => { + const mockId = 'full-id'; + + await getPods({ + ...baseOptions, + from: 'now-1h', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + filters: { + id: mockId, + }, + }); + + const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; + const { bool } = dsl?.query || {}; + expect(bool).toBeDefined(); + + expect(bool?.must).toEqual( + expect.arrayContaining([ + { + exists: { + field: 'kubernetes.pod.uid', + }, + }, + { + exists: { + field: 'kubernetes.node.name', + }, + }, + { + term: { + 'kubernetes.pod.uid': mockId, + }, + }, + ]) + ); + }); + + it('should include a term filter for cloud filters', async () => { + const mockCloudProvider = 'gcp'; + const mockCloudRegion = 'us-central-1'; + + await getPods({ + ...baseOptions, + from: 'now-1h', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + filters: { + 'cloud.provider': mockCloudProvider, + 'cloud.region': mockCloudRegion, + }, + }); + + const dsl = esClientMock.search.mock.lastCall?.[0] as SearchRequest | undefined; + const { bool } = dsl?.query || {}; + expect(bool).toBeDefined(); + + expect(bool?.must).toEqual( + expect.arrayContaining([ + { + exists: { + field: 'kubernetes.pod.uid', + }, + }, + { + exists: { + field: 'kubernetes.node.name', + }, + }, + { + term: { + 'cloud.provider': mockCloudProvider, + }, + }, + { + term: { + 'cloud.region': mockCloudRegion, + }, + }, + ]) + ); + }); + + it('should reject with 400 for invalid "from" date', () => { + return expectToThrowValidationErrorWithStatusCode( + () => + getPods({ + ...baseOptions, + from: 'now-1zz', + to: 'now-3d', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + }), + { statusCode: 400 } + ); + }); + + it('should reject with 400 for invalid "to" date', () => { + return expectToThrowValidationErrorWithStatusCode( + () => + getPods({ + ...baseOptions, + from: 'now-5d', + to: 'now-3fe', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + }), + { statusCode: 400 } + ); + }); + + it('should reject with 400 when "from" is a date that is after "to"', () => { + return expectToThrowValidationErrorWithStatusCode( + () => + getPods({ + ...baseOptions, + from: 'now', + to: 'now-5d', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + }), + { statusCode: 400 } + ); + }); + + it('should reject with 400 when "from" is in the future', () => { + return expectToThrowValidationErrorWithStatusCode( + () => + getPods({ + ...baseOptions, + from: 'now+1d', + elasticsearchClient: esClientMock, + savedObjectsClient: soClientMock, + }), + { statusCode: 400 } + ); + }); +}); diff --git a/x-pack/plugins/asset_manager/server/lib/accessors/pods/get_pods.ts b/x-pack/plugins/asset_manager/server/lib/accessors/pods/get_pods.ts new file mode 100644 index 0000000000000..db2bc11ae2315 --- /dev/null +++ b/x-pack/plugins/asset_manager/server/lib/accessors/pods/get_pods.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import { Asset } from '../../../../common/types_api'; +import { GetPodsOptionsPublic } from '../../../../common/types_client'; +import { + AssetClientDependencies, + AssetClientOptionsWithInjectedValues, +} from '../../asset_client_types'; +import { parseEan } from '../../parse_ean'; +import { collectPods } from '../../collectors/pods'; +import { validateStringDateRange } from '../../validators/validate_date_range'; + +export type GetPodsOptions = GetPodsOptionsPublic & AssetClientDependencies; +export type GetPodsOptionsInjected = AssetClientOptionsWithInjectedValues; + +export async function getPods(options: GetPodsOptionsInjected): Promise<{ pods: Asset[] }> { + validateStringDateRange(options.from, options.to); + + const metricsIndices = await options.metricsClient.getMetricIndices({ + savedObjectsClient: options.savedObjectsClient, + }); + + const filters: QueryDslQueryContainer[] = []; + + if (options.filters?.ean) { + const ean = Array.isArray(options.filters.ean) ? options.filters.ean[0] : options.filters.ean; + const { kind, id } = parseEan(ean); + + // if EAN filter isn't targeting a pod asset, we don't need to do this query + if (kind !== 'pod') { + return { + pods: [], + }; + } + + filters.push({ + term: { + 'kubernetes.pod.uid': id, + }, + }); + } + + if (options.filters?.id) { + const fn = options.filters.id.includes('*') ? 'wildcard' : 'term'; + filters.push({ + [fn]: { + 'kubernetes.pod.uid': options.filters.id, + }, + }); + } + + if (options.filters?.['orchestrator.cluster.name']) { + filters.push({ + term: { + 'orchestrator.cluster.name': options.filters['orchestrator.cluster.name'], + }, + }); + } + + if (options.filters?.['cloud.provider']) { + filters.push({ + term: { + 'cloud.provider': options.filters['cloud.provider'], + }, + }); + } + + if (options.filters?.['cloud.region']) { + filters.push({ + term: { + 'cloud.region': options.filters['cloud.region'], + }, + }); + } + + const { assets } = await collectPods({ + client: options.elasticsearchClient, + from: options.from, + to: options.to || 'now', + filters, + sourceIndices: { + metrics: metricsIndices, + logs: options.sourceIndices.logs, + }, + }); + + return { + pods: assets, + }; +} diff --git a/x-pack/plugins/asset_manager/server/lib/asset_client.ts b/x-pack/plugins/asset_manager/server/lib/asset_client.ts index a7aad8f6a01c4..ca6e7f2ea05d2 100644 --- a/x-pack/plugins/asset_manager/server/lib/asset_client.ts +++ b/x-pack/plugins/asset_manager/server/lib/asset_client.ts @@ -9,6 +9,7 @@ import { Asset } from '../../common/types_api'; import { getContainers, GetContainersOptions } from './accessors/containers/get_containers'; import { getHosts, GetHostsOptions } from './accessors/hosts/get_hosts'; import { getServices, GetServicesOptions } from './accessors/services/get_services'; +import { getPods, GetPodsOptions } from './accessors/pods/get_pods'; import { AssetClientBaseOptions, AssetClientOptionsWithInjectedValues } from './asset_client_types'; export class AssetClient { @@ -35,4 +36,9 @@ export class AssetClient { const withInjected = this.injectOptions(options); return await getContainers(withInjected); } + + async getPods(options: GetPodsOptions): Promise<{ pods: Asset[] }> { + const withInjected = this.injectOptions(options); + return await getPods(withInjected); + } } diff --git a/x-pack/plugins/asset_manager/server/lib/collectors/pods.ts b/x-pack/plugins/asset_manager/server/lib/collectors/pods.ts index 5cbf357e69569..f9a4e2e22ae51 100644 --- a/x-pack/plugins/asset_manager/server/lib/collectors/pods.ts +++ b/x-pack/plugins/asset_manager/server/lib/collectors/pods.ts @@ -9,11 +9,24 @@ import { estypes } from '@elastic/elasticsearch'; import { Asset } from '../../../common/types_api'; import { CollectorOptions, QUERY_MAX_SIZE } from '.'; -export async function collectPods({ client, from, to, sourceIndices, afterKey }: CollectorOptions) { +export async function collectPods({ + client, + from, + to, + sourceIndices, + filters = [], + afterKey, +}: CollectorOptions) { if (!sourceIndices?.metrics || !sourceIndices?.logs) { throw new Error('missing required metrics/logs indices'); } + const musts = [ + ...filters, + { exists: { field: 'kubernetes.pod.uid' } }, + { exists: { field: 'kubernetes.node.name' } }, + ]; + const { metrics, logs } = sourceIndices; const dsl: estypes.SearchRequest = { index: [metrics, logs], @@ -42,10 +55,7 @@ export async function collectPods({ client, from, to, sourceIndices, afterKey }: }, }, ], - must: [ - { exists: { field: 'kubernetes.pod.uid' } }, - { exists: { field: 'kubernetes.node.name' } }, - ], + must: musts, }, }, }; diff --git a/x-pack/plugins/asset_manager/server/routes/assets/pods.ts b/x-pack/plugins/asset_manager/server/routes/assets/pods.ts new file mode 100644 index 0000000000000..beed936bd5b40 --- /dev/null +++ b/x-pack/plugins/asset_manager/server/routes/assets/pods.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createRouteValidationFunction } from '@kbn/io-ts-utils'; +import { RequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; +import { GetPodAssetsQueryOptions, getPodAssetsQueryOptionsRT } from '../../../common/types_api'; +import { debug } from '../../../common/debug_log'; +import { SetupRouteOptions } from '../types'; +import * as routePaths from '../../../common/constants_routes'; +import { getClientsFromContext, validateStringAssetFilters } from '../utils'; +import { AssetsValidationError } from '../../lib/validators/validation_error'; + +export function podsRoutes({ + router, + assetClient, +}: SetupRouteOptions) { + const validate = createRouteValidationFunction(getPodAssetsQueryOptionsRT); + router.get( + { + path: routePaths.GET_PODS, + validate: { + query: (q, res) => { + const [invalidResponse, validatedFilters] = validateStringAssetFilters(q, res); + if (invalidResponse) { + return invalidResponse; + } + if (validatedFilters) { + q.filters = validatedFilters; + } + return validate(q, res); + }, + }, + }, + async (context, req, res) => { + const { from = 'now-24h', to = 'now', filters } = req.query || {}; + const { elasticsearchClient, savedObjectsClient } = await getClientsFromContext(context); + + try { + const response = await assetClient.getPods({ + from, + to, + filters, + elasticsearchClient, + savedObjectsClient, + }); + + return res.ok({ body: response }); + } catch (error: unknown) { + debug('Error while looking up POD asset records', error); + + if (error instanceof AssetsValidationError) { + return res.customError({ + statusCode: error.statusCode, + body: { + message: `Error while looking up pod asset records - ${error.message}`, + }, + }); + } + return res.customError({ + statusCode: 500, + body: { message: 'Error while looking up pod asset records - ' + `${error}` }, + }); + } + } + ); +} diff --git a/x-pack/plugins/asset_manager/server/routes/index.ts b/x-pack/plugins/asset_manager/server/routes/index.ts index 20f5abf889e78..991c96806b767 100644 --- a/x-pack/plugins/asset_manager/server/routes/index.ts +++ b/x-pack/plugins/asset_manager/server/routes/index.ts @@ -12,6 +12,7 @@ import { sampleAssetsRoutes } from './sample_assets'; import { hostsRoutes } from './assets/hosts'; import { servicesRoutes } from './assets/services'; import { containersRoutes } from './assets/containers'; +import { podsRoutes } from './assets/pods'; export function setupRoutes({ router, @@ -22,4 +23,5 @@ export function setupRoutes({ hostsRoutes({ router, assetClient }); servicesRoutes({ router, assetClient }); containersRoutes({ router, assetClient }); + podsRoutes({ router, assetClient }); } diff --git a/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/__stories__/editor_menu.stories.tsx b/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/__stories__/editor_menu.stories.tsx index 915676b8f6b5c..f12a805cf18a4 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/__stories__/editor_menu.stories.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/__stories__/editor_menu.stories.tsx @@ -70,8 +70,10 @@ const testVisTypes: BaseVisType[] = [ const testVisTypeAliases: VisTypeAlias[] = [ { title: 'Lens', - aliasApp: 'lens', - aliasPath: 'path/to/lens', + alias: { + app: 'lens', + path: 'path/to/lens', + }, icon: 'lensApp', name: 'lens', description: 'Description of Lens app', @@ -79,8 +81,10 @@ const testVisTypeAliases: VisTypeAlias[] = [ }, { title: 'Maps', - aliasApp: 'maps', - aliasPath: 'path/to/maps', + alias: { + app: 'maps', + path: 'path/to/maps', + }, icon: 'gisApp', name: 'maps', description: 'Description of Maps app', diff --git a/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/editor_menu.tsx b/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/editor_menu.tsx index dbcd3b9cd2786..d405a977affd3 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/editor_menu.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/editor_menu/editor_menu.tsx @@ -68,12 +68,14 @@ export const EditorMenu: FC = ({ addElement }) => { trackCanvasUiMetric(METRIC_TYPE.CLICK, `${visType.name}:create`); } - if ('aliasPath' in visType) { - appId = visType.aliasApp; - path = visType.aliasPath; - } else { + if (!('alias' in visType)) { + // this visualization is not an alias appId = 'visualize'; path = `#/create?type=${encodeURIComponent(visType.name)}`; + } else if (visType.alias && 'path' in visType.alias) { + // this visualization **is** an alias, and it has an app to redirect to for creation + appId = visType.alias.app; + path = visType.alias.path; } } else { appId = 'visualize'; @@ -134,7 +136,8 @@ export const EditorMenu: FC = ({ addElement }) => { .getAliases() .sort(({ promotion: a = false }: VisTypeAlias, { promotion: b = false }: VisTypeAlias) => a === b ? 0 : a ? -1 : 1 - ); + ) + .filter(({ disableCreate }: VisTypeAlias) => !disableCreate); const factories = unwrappedEmbeddableFactories .filter( diff --git a/x-pack/plugins/cases/docs/openapi/bundled.json b/x-pack/plugins/cases/docs/openapi/bundled.json index 54a9c31d34312..bf6b28c8441a9 100644 --- a/x-pack/plugins/cases/docs/openapi/bundled.json +++ b/x-pack/plugins/cases/docs/openapi/bundled.json @@ -1,9 +1,9 @@ { - "openapi": "3.0.1", + "openapi": "3.1.0", "info": { "title": "Cases", "description": "OpenAPI schema for Cases endpoints", - "version": "0.1", + "version": "0.2", "contact": { "name": "Cases Team" }, @@ -329,7 +329,7 @@ } } }, - "example": [ + "examples": [ { "id": "06116b80-e1c3-11ec-be9b-9b1838238ee6", "title": "security_case" @@ -417,18 +417,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -438,7 +444,9 @@ "created_at": { "type": "string", "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" + "examples": [ + "2022-06-01T17:07:17.767Z" + ] }, "created_by": { "type": "object", @@ -449,34 +457,54 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "error": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + "examples": [ + "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + ] }, "mappings": { "type": "array", @@ -485,15 +513,21 @@ "properties": { "action_type": { "type": "string", - "example": "overwrite" + "examples": [ + "overwrite" + ] }, "source": { "type": "string", - "example": "title" + "examples": [ + "title" + ] }, "target": { "type": "string", - "example": "summary" + "examples": [ + "summary" + ] } } } @@ -502,13 +536,20 @@ "$ref": "#/components/schemas/owners" }, "updated_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" + "examples": [ + "2022-06-01T19:58:48.169Z" + ] }, "updated_by": { - "type": "object", + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -516,30 +557,45 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } }, "version": { "type": "string", - "example": "WzIwNzMsMV0=" + "examples": [ + "WzIwNzMsMV0=" + ] } } } @@ -640,18 +696,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -661,7 +723,9 @@ "created_at": { "type": "string", "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" + "examples": [ + "2022-06-01T17:07:17.767Z" + ] }, "created_by": { "type": "object", @@ -672,34 +736,54 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "error": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + "examples": [ + "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + ] }, "mappings": { "type": "array", @@ -708,15 +792,21 @@ "properties": { "action_type": { "type": "string", - "example": "overwrite" + "examples": [ + "overwrite" + ] }, "source": { "type": "string", - "example": "title" + "examples": [ + "title" + ] }, "target": { "type": "string", - "example": "summary" + "examples": [ + "summary" + ] } } } @@ -725,13 +815,20 @@ "$ref": "#/components/schemas/owners" }, "updated_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" + "examples": [ + "2022-06-01T19:58:48.169Z" + ] }, "updated_by": { - "type": "object", + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -739,30 +836,45 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } }, "version": { "type": "string", - "example": "WzIwNzMsMV0=" + "examples": [ + "WzIwNzMsMV0=" + ] } } }, @@ -867,18 +979,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -888,7 +1006,9 @@ "created_at": { "type": "string", "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" + "examples": [ + "2022-06-01T17:07:17.767Z" + ] }, "created_by": { "type": "object", @@ -899,34 +1019,54 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "error": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + "examples": [ + "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + ] }, "mappings": { "type": "array", @@ -935,15 +1075,21 @@ "properties": { "action_type": { "type": "string", - "example": "overwrite" + "examples": [ + "overwrite" + ] }, "source": { "type": "string", - "example": "title" + "examples": [ + "title" + ] }, "target": { "type": "string", - "example": "summary" + "examples": [ + "summary" + ] } } } @@ -952,13 +1098,20 @@ "$ref": "#/components/schemas/owners" }, "updated_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" + "examples": [ + "2022-06-01T19:58:48.169Z" + ] }, "updated_by": { - "type": "object", + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -966,30 +1119,45 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } }, "version": { "type": "string", - "example": "WzIwNzMsMV0=" + "examples": [ + "WzIwNzMsMV0=" + ] } } }, @@ -1044,23 +1212,37 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } } @@ -1569,8 +1751,10 @@ "content": { "application/json": { "schema": { - "type": "object", - "nullable": true + "type": [ + "object", + "null" + ] } } } @@ -2103,7 +2287,7 @@ } } }, - "example": [ + "examples": [ { "id": "06116b80-e1c3-11ec-be9b-9b1838238ee6", "title": "security_case" @@ -2194,18 +2378,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -2215,7 +2405,9 @@ "created_at": { "type": "string", "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" + "examples": [ + "2022-06-01T17:07:17.767Z" + ] }, "created_by": { "type": "object", @@ -2226,34 +2418,54 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "error": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + "examples": [ + "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + ] }, "mappings": { "type": "array", @@ -2262,15 +2474,21 @@ "properties": { "action_type": { "type": "string", - "example": "overwrite" + "examples": [ + "overwrite" + ] }, "source": { "type": "string", - "example": "title" + "examples": [ + "title" + ] }, "target": { "type": "string", - "example": "summary" + "examples": [ + "summary" + ] } } } @@ -2279,13 +2497,20 @@ "$ref": "#/components/schemas/owners" }, "updated_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" + "examples": [ + "2022-06-01T19:58:48.169Z" + ] }, "updated_by": { - "type": "object", + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -2293,30 +2518,45 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } }, "version": { "type": "string", - "example": "WzIwNzMsMV0=" + "examples": [ + "WzIwNzMsMV0=" + ] } } } @@ -2420,18 +2660,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -2441,7 +2687,9 @@ "created_at": { "type": "string", "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" + "examples": [ + "2022-06-01T17:07:17.767Z" + ] }, "created_by": { "type": "object", @@ -2452,34 +2700,54 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "error": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + "examples": [ + "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + ] }, "mappings": { "type": "array", @@ -2488,15 +2756,21 @@ "properties": { "action_type": { "type": "string", - "example": "overwrite" + "examples": [ + "overwrite" + ] }, "source": { "type": "string", - "example": "title" + "examples": [ + "title" + ] }, "target": { "type": "string", - "example": "summary" + "examples": [ + "summary" + ] } } } @@ -2505,13 +2779,20 @@ "$ref": "#/components/schemas/owners" }, "updated_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" + "examples": [ + "2022-06-01T19:58:48.169Z" + ] }, "updated_by": { - "type": "object", + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -2519,30 +2800,45 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } }, "version": { "type": "string", - "example": "WzIwNzMsMV0=" + "examples": [ + "WzIwNzMsMV0=" + ] } } }, @@ -2650,18 +2946,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -2671,7 +2973,9 @@ "created_at": { "type": "string", "format": "date-time", - "example": "2022-06-01T17:07:17.767Z" + "examples": [ + "2022-06-01T17:07:17.767Z" + ] }, "created_by": { "type": "object", @@ -2682,34 +2986,54 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "error": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "type": "string", - "example": "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + "examples": [ + "4a97a440-e1cd-11ec-be9b-9b1838238ee6" + ] }, "mappings": { "type": "array", @@ -2718,15 +3042,21 @@ "properties": { "action_type": { "type": "string", - "example": "overwrite" + "examples": [ + "overwrite" + ] }, "source": { "type": "string", - "example": "title" + "examples": [ + "title" + ] }, "target": { "type": "string", - "example": "summary" + "examples": [ + "summary" + ] } } } @@ -2735,13 +3065,20 @@ "$ref": "#/components/schemas/owners" }, "updated_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": "2022-06-01T19:58:48.169Z" + "examples": [ + "2022-06-01T19:58:48.169Z" + ] }, "updated_by": { - "type": "object", + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -2749,30 +3086,45 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } }, "version": { "type": "string", - "example": "WzIwNzMsMV0=" + "examples": [ + "WzIwNzMsMV0=" + ] } } }, @@ -2909,23 +3261,37 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } } @@ -3515,8 +3881,10 @@ "content": { "application/json": { "schema": { - "type": "object", - "nullable": true + "type": [ + "object", + "null" + ] } } } @@ -3610,8 +3978,7 @@ "$ref": "#/components/parameters/space_id" }, { - "$ref": "#/components/parameters/page_index", - "example": "1" + "$ref": "#/components/parameters/page_index" }, { "$ref": "#/components/parameters/page_size" @@ -3679,7 +4046,8 @@ "apiKeyAuth": { "type": "apiKey", "in": "header", - "name": "ApiKey" + "name": "Authorization", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" } }, "parameters": { @@ -3703,9 +4071,13 @@ "type": "string", "minItems": 1, "maxItems": 100 - } - }, - "example": "d4e7abb0-b462-11ec-9a8d-698504725a43" + }, + "examples": [ + [ + "d4e7abb0-b462-11ec-9a8d-698504725a43" + ] + ] + } }, "assignees": { "in": "query", @@ -3740,11 +4112,15 @@ "items": { "type": "string" }, - "maxItems": 100 + "maxItems": 100, + "examples": [ + [ + "my-category" + ] + ] } ] - }, - "example": "my-category" + } }, "defaultSearchOperator": { "in": "query", @@ -3752,9 +4128,11 @@ "description": "he default operator to use for the simple_query_string.", "schema": { "type": "string", - "default": "OR" - }, - "example": "OR" + "default": "OR", + "examples": [ + "OR" + ] + } }, "from": { "in": "query", @@ -3762,7 +4140,9 @@ "description": "Returns only cases that were created after a specific date. The date must be specified as a KQL data range or date match expression.\n", "schema": { "type": "string", - "example": "now-1d" + "examples": [ + "now-1d" + ] } }, "owner": { @@ -3778,11 +4158,15 @@ "type": "array", "items": { "$ref": "#/components/schemas/owners" - } + }, + "examples": [ + [ + "cases" + ] + ] } ] - }, - "example": "cases" + } }, "page_index": { "in": "query", @@ -3791,7 +4175,10 @@ "required": false, "schema": { "type": "integer", - "default": 1 + "default": 1, + "examples": [ + 1 + ] } }, "page_size": { @@ -3819,11 +4206,15 @@ "items": { "type": "string" }, - "maxItems": 100 + "maxItems": 100, + "examples": [ + [ + "elastic" + ] + ] } ] - }, - "example": "elastic" + } }, "search": { "in": "query", @@ -3880,9 +4271,11 @@ "status", "severity" ], - "default": "createdAt" - }, - "example": "updatedAt" + "default": "createdAt", + "examples": [ + "updatedAt" + ] + } }, "sort_order": { "in": "query", @@ -3908,9 +4301,11 @@ "closed", "in-progress", "open" + ], + "examples": [ + "open" ] - }, - "example": "open" + } }, "tags": { "in": "query", @@ -3926,20 +4321,26 @@ "items": { "type": "string" }, - "maxItems": 100 + "maxItems": 100, + "examples": [ + [ + "tag-1" + ] + ] } ] - }, - "example": "tag-1" + } }, "to": { "in": "query", "name": "to", "description": "Returns only cases that were created before a specific date. The date must be specified as a KQL data range or date match expression.\n", "schema": { - "type": "string" - }, - "example": "now+1d" + "type": "string", + "examples": [ + "now+1d" + ] + } }, "alert_id": { "in": "path", @@ -3948,7 +4349,9 @@ "required": true, "schema": { "type": "string", - "example": "09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540" + "examples": [ + "09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540" + ] } }, "configuration_id": { @@ -3958,7 +4361,9 @@ "required": true, "schema": { "type": "string", - "example": "3297a0f0-b5ec-11ec-b141-0fdb20a7f9a9" + "examples": [ + "3297a0f0-b5ec-11ec-b141-0fdb20a7f9a9" + ] } }, "case_id": { @@ -3968,7 +4373,9 @@ "required": true, "schema": { "type": "string", - "example": "9c235210-6834-11ea-a78c-6ffb38a34414" + "examples": [ + "9c235210-6834-11ea-a78c-6ffb38a34414" + ] } }, "includeComments": { @@ -3988,7 +4395,9 @@ "required": true, "schema": { "type": "string", - "example": "71ec1870-725b-11ea-a0b2-c51ea50a58e2" + "examples": [ + "71ec1870-725b-11ea-a0b2-c51ea50a58e2" + ] } }, "connector_id": { @@ -3998,7 +4407,9 @@ "required": true, "schema": { "type": "string", - "example": "abed3a70-71bd-11ea-a0b2-c51ea50a58e2" + "examples": [ + "abed3a70-71bd-11ea-a0b2-c51ea50a58e2" + ] } }, "user_action_types": { @@ -4026,9 +4437,13 @@ "title", "user" ] - } - }, - "example": "create_case" + }, + "examples": [ + [ + "create_case" + ] + ] + } }, "space_id": { "in": "path", @@ -4037,16 +4452,20 @@ "required": true, "schema": { "type": "string", - "example": "default" + "examples": [ + "default" + ] } } }, "schemas": { "assignees": { - "type": "array", + "type": [ + "array", + "null" + ], "description": "An array containing users that are assigned to the case.", "maxItems": 10, - "nullable": true, "items": { "type": "object", "required": [ @@ -4056,7 +4475,9 @@ "uid": { "type": "string", "description": "A unique identifier for the user profile. These identifiers can be found by using the suggest user profile API.", - "example": "u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0" + "examples": [ + "u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0" + ] } } } @@ -4074,24 +4495,34 @@ "properties": { "fields": { "description": "An object containing the connector fields. To create a case without a connector, specify null. To update a case to remove the connector, specify null.", - "nullable": true, - "type": "string", - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "description": "The identifier for the connector. To create a case without a connector, use `none`. To update a case to remove the connector, specify `none`.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. To create a case without a connector, use `none`. To update a case to remove the connector, specify `none`.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "description": "The type of connector. To create a case without a connector, use `.none`. To update a case to remove the connector, specify `.none`.", "type": "string", - "example": ".none", + "examples": [ + ".none" + ], "enum": [ ".none" ] @@ -4110,9 +4541,13 @@ "type": "object", "properties": { "fields": { - "type": "string", - "nullable": true, - "example": null + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "id": { "description": "The identifier for the connector. To retrieve connector IDs, use the find connectors API.", @@ -4125,7 +4560,9 @@ "type": { "description": "The type of connector.", "type": "string", - "example": ".cases-webhook", + "examples": [ + ".cases-webhook" + ], "enum": [ ".cases-webhook" ] @@ -4154,18 +4591,24 @@ "properties": { "issueType": { "description": "The type of issue.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "parent": { "description": "The key of the parent issue, when the issue type is sub-task.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "priority": { "description": "The priority of the issue.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] } } }, @@ -4180,7 +4623,9 @@ "type": { "description": "The type of connector.", "type": "string", - "example": ".jira", + "examples": [ + ".jira" + ], "enum": [ ".jira" ] @@ -4200,8 +4645,10 @@ "properties": { "fields": { "description": "An object containing the connector fields. If you want to omit any individual field, specify null as its value.", - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "required": [ "issueTypes", "severityCode" @@ -4231,7 +4678,9 @@ "type": { "description": "The type of connector.", "type": "string", - "example": ".resilient", + "examples": [ + ".resilient" + ], "enum": [ ".resilient" ] @@ -4262,28 +4711,38 @@ "properties": { "category": { "description": "The category of the incident.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "impact": { "description": "The effect an incident had on business.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "severity": { "description": "The severity of the incident.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "subcategory": { "description": "The subcategory of the incident.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "urgency": { "description": "The extent to which the incident resolution can be delayed.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] } } }, @@ -4298,7 +4757,9 @@ "type": { "description": "The type of connector.", "type": "string", - "example": ".servicenow", + "examples": [ + ".servicenow" + ], "enum": [ ".servicenow" ] @@ -4331,38 +4792,52 @@ "properties": { "category": { "description": "The category of the incident.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "destIp": { "description": "Indicates whether cases will send a comma-separated list of destination IPs.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "malwareHash": { "description": "Indicates whether cases will send a comma-separated list of malware hashes.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "malwareUrl": { "description": "Indicates whether cases will send a comma-separated list of malware URLs.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "priority": { "description": "The priority of the issue.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] }, "sourceIp": { "description": "Indicates whether cases will send a comma-separated list of source IPs.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "subcategory": { "description": "The subcategory of the incident.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] } } }, @@ -4377,7 +4852,9 @@ "type": { "description": "The type of connector.", "type": "string", - "example": ".servicenow-sir", + "examples": [ + ".servicenow-sir" + ], "enum": [ ".servicenow-sir" ] @@ -4404,8 +4881,10 @@ "properties": { "caseId": { "description": "The case identifier for Swimlane connectors.", - "type": "string", - "nullable": true + "type": [ + "string", + "null" + ] } } }, @@ -4420,7 +4899,9 @@ "type": { "description": "The type of connector.", "type": "string", - "example": ".swimlane", + "examples": [ + ".swimlane" + ], "enum": [ ".swimlane" ] @@ -4435,7 +4916,9 @@ "observability", "securitySolution" ], - "example": "cases" + "examples": [ + "cases" + ] }, "settings": { "type": "object", @@ -4447,7 +4930,9 @@ "syncAlerts": { "description": "Turns alert syncing on or off.", "type": "boolean", - "example": true + "examples": [ + true + ] } } }, @@ -4566,10 +5051,12 @@ "description": "The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`.\n", "oneOf": [ { - "type": "string", + "type": [ + "string", + "null" + ], "minLength": 1, - "maxLength": 160, - "nullable": true + "maxLength": 160 }, { "type": "boolean" @@ -4583,27 +5070,43 @@ }, "case_response_closed_by_properties": { "title": "Case response properties for closed_by", - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } }, "required": [ @@ -4623,13 +5126,17 @@ "type": "array", "items": { "type": "string", - "example": "a6e12ac4-7bce-457b-84f6-d7ce8deb8446" + "examples": [ + "a6e12ac4-7bce-457b-84f6-d7ce8deb8446" + ] } }, "created_at": { "type": "string", "format": "date-time", - "example": "2023-11-06T19:29:38.424Z" + "examples": [ + "2023-11-06T19:29:38.424Z" + ] }, "created_by": { "type": "object", @@ -4640,48 +5147,73 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "id": { "type": "string", - "example": "73362370-ab1a-11ec-985f-97e55adae8b9" + "examples": [ + "73362370-ab1a-11ec-985f-97e55adae8b9" + ] }, "index": { "type": "array", "items": { "type": "string", - "example": ".internal.alerts-security.alerts-default-000001" + "examples": [ + ".internal.alerts-security.alerts-default-000001" + ] } }, "owner": { "$ref": "#/components/schemas/owners" }, "pushed_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "example": null, - "nullable": true + "examples": [ + null + ] }, "pushed_by": { - "type": "object", + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -4689,26 +5221,39 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } }, "rule": { "type": "object", @@ -4716,30 +5261,40 @@ "id": { "description": "The rule identifier.", "type": "string", - "example": "94d80550-aaf4-11ec-985f-97e55adae8b9" + "examples": [ + "94d80550-aaf4-11ec-985f-97e55adae8b9" + ] }, "name": { "description": "The rule name.", "type": "string", - "example": "security_rule" + "examples": [ + "security_rule" + ] } } }, "type": { "type": "string", - "example": "alert", + "examples": [ + "alert" + ], "enum": [ "alert" ] }, "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true + "type": [ + "string", + "null" + ], + "format": "date-time" }, "updated_by": { - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "required": [ "email", "full_name", @@ -4747,29 +5302,45 @@ ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } } }, "version": { "type": "string", - "example": "WzMwNDgsMV0=" + "examples": [ + "WzMwNDgsMV0=" + ] } } }, @@ -4778,23 +5349,37 @@ "type": "object", "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } }, "required": [ @@ -4805,27 +5390,43 @@ }, "case_response_pushed_by_properties": { "title": "Case response properties for pushed_by", - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } }, "required": [ @@ -4836,27 +5437,43 @@ }, "case_response_updated_by_properties": { "title": "Case response properties for updated_by", - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } }, "required": [ @@ -4874,57 +5491,77 @@ "properties": { "comment": { "type": "string", - "example": "A new comment." + "examples": [ + "A new comment." + ] }, "created_at": { "type": "string", "format": "date-time", - "example": "2022-05-13T09:16:17.416Z" + "examples": [ + "2022-05-13T09:16:17.416Z" + ] }, "created_by": { "$ref": "#/components/schemas/case_response_created_by_properties" }, "id": { "type": "string", - "example": "8af6ac20-74f6-11ea-b83a-553aecdb28b6" + "examples": [ + "8af6ac20-74f6-11ea-b83a-553aecdb28b6" + ] }, "owner": { "$ref": "#/components/schemas/owners" }, "pushed_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": null + "examples": [ + null + ] }, "pushed_by": { "$ref": "#/components/schemas/case_response_pushed_by_properties" }, "type": { "type": "string", - "example": "user", + "examples": [ + "user" + ], "enum": [ "user" ] }, "updated_at": { - "type": "string", + "type": [ + "string", + "null" + ], "format": "date-time", - "nullable": true, - "example": null + "examples": [ + null + ] }, "updated_by": { "$ref": "#/components/schemas/case_response_updated_by_properties" }, "version": { "type": "string", - "example": "WzIwNDMxLDFd" + "examples": [ + "WzIwNDMxLDFd" + ] } } }, "external_service": { - "type": "object", - "nullable": true, + "type": [ + "object", + "null" + ], "properties": { "connector_id": { "type": "string" @@ -4946,29 +5583,45 @@ "format": "date-time" }, "pushed_by": { - "type": "object", + "type": [ + "object", + "null" + ], "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } - }, - "nullable": true + } } } }, @@ -5012,14 +5665,18 @@ "$ref": "#/components/schemas/assignees" }, "category": { - "type": "string", - "description": "The case category.", - "nullable": true + "type": [ + "string", + "null" + ], + "description": "The case category." }, "closed_at": { - "type": "string", - "format": "date-time", - "nullable": true + "type": [ + "string", + "null" + ], + "format": "date-time" }, "closed_by": { "$ref": "#/components/schemas/case_response_closed_by_properties" @@ -5075,7 +5732,9 @@ "created_at": { "type": "string", "format": "date-time", - "example": "2022-05-13T09:16:17.416Z" + "examples": [ + "2022-05-13T09:16:17.416Z" + ] }, "created_by": { "$ref": "#/components/schemas/case_response_created_by_properties" @@ -5103,10 +5762,12 @@ "description": "The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`.\n", "oneOf": [ { - "type": "string", + "type": [ + "string", + "null" + ], "minLength": 1, - "maxLength": 160, - "nullable": true + "maxLength": 160 }, { "type": "boolean" @@ -5118,20 +5779,28 @@ }, "description": { "type": "string", - "example": "A case description." + "examples": [ + "A case description." + ] }, "duration": { - "type": "integer", + "type": [ + "integer", + "null" + ], "description": "The elapsed time from the creation of the case to its closure (in seconds). If the case has not been closed, the duration is set to null. If the case was closed after less than half a second, the duration is rounded down to zero.\n", - "nullable": true, - "example": 120 + "examples": [ + 120 + ] }, "external_service": { "$ref": "#/components/schemas/external_service" }, "id": { "type": "string", - "example": "66b9aa00-94fa-11ea-9f74-e7e108796192" + "examples": [ + "66b9aa00-94fa-11ea-9f74-e7e108796192" + ] }, "owner": { "$ref": "#/components/schemas/owners" @@ -5150,33 +5819,45 @@ "items": { "type": "string" }, - "example": [ - "tag-1" + "examples": [ + [ + "tag-1" + ] ] }, "title": { "type": "string", - "example": "Case title 1" + "examples": [ + "Case title 1" + ] }, "totalAlerts": { "type": "integer", - "example": 0 + "examples": [ + 0 + ] }, "totalComment": { "type": "integer", - "example": 0 + "examples": [ + 0 + ] }, "updated_at": { - "type": "string", - "format": "date-time", - "nullable": true + "type": [ + "string", + "null" + ], + "format": "date-time" }, "updated_by": { "$ref": "#/components/schemas/case_response_updated_by_properties" }, "version": { "type": "string", - "example": "WzUzMiwxXQ==" + "examples": [ + "WzUzMiwxXQ==" + ] } } }, @@ -5186,14 +5867,18 @@ "properties": { "error": { "type": "string", - "example": "Unauthorized" + "examples": [ + "Unauthorized" + ] }, "message": { "type": "string" }, "statusCode": { "type": "integer", - "example": 401 + "examples": [ + 401 + ] } } }, @@ -5280,10 +5965,12 @@ "description": "The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`.\n", "oneOf": [ { - "type": "string", + "type": [ + "string", + "null" + ], "minLength": 1, - "maxLength": 160, - "nullable": true + "maxLength": 160 }, { "type": "boolean" @@ -5349,7 +6036,9 @@ "close-by-pushing", "close-by-user" ], - "example": "close-by-user" + "examples": [ + "close-by-user" + ] }, "connector_types": { "type": "string", @@ -5363,7 +6052,9 @@ ".servicenow-sir", ".swimlane" ], - "example": ".none" + "examples": [ + ".none" + ] }, "set_case_configuration_request": { "title": "Set case configuration request", @@ -5384,18 +6075,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -5472,18 +6169,24 @@ "properties": { "fields": { "description": "The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`.", - "nullable": true, - "type": "object" + "type": [ + "object", + "null" + ] }, "id": { "description": "The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -5539,7 +6242,9 @@ "version": { "description": "The version of the connector. To retrieve the version value, use the get configuration API.\n", "type": "string", - "example": "WzIwMiwxXQ==" + "examples": [ + "WzIwMiwxXQ==" + ] } } }, @@ -5576,7 +6281,9 @@ } ], "x-technical-preview": true, - "example": "6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42" + "examples": [ + "6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42" + ] }, "alert_indices": { "title": "Alert indices", @@ -5604,12 +6311,16 @@ "id": { "description": "The rule identifier.", "type": "string", - "example": "94d80550-aaf4-11ec-985f-97e55adae8b9" + "examples": [ + "94d80550-aaf4-11ec-985f-97e55adae8b9" + ] }, "name": { "description": "The rule name.", "type": "string", - "example": "security_rule" + "examples": [ + "security_rule" + ] } } }, @@ -5640,7 +6351,9 @@ "type": { "description": "The type of comment.", "type": "string", - "example": "alert", + "examples": [ + "alert" + ], "enum": [ "alert" ] @@ -5656,7 +6369,9 @@ "description": "The new comment. It is required only when `type` is `user`.", "type": "string", "maxLength": 30000, - "example": "A new comment." + "examples": [ + "A new comment." + ] }, "owner": { "$ref": "#/components/schemas/owners" @@ -5664,7 +6379,9 @@ "type": { "type": "string", "description": "The type of comment.", - "example": "user", + "examples": [ + "user" + ], "enum": [ "user" ] @@ -5711,7 +6428,9 @@ "id": { "type": "string", "description": "The identifier for the comment. To retrieve comment IDs, use the get comments API.\n", - "example": "8af6ac20-74f6-11ea-b83a-553aecdb28b6" + "examples": [ + "8af6ac20-74f6-11ea-b83a-553aecdb28b6" + ] }, "index": { "$ref": "#/components/schemas/alert_indices" @@ -5728,12 +6447,16 @@ "enum": [ "alert" ], - "example": "alert" + "examples": [ + "alert" + ] }, "version": { "description": "The current comment version. To retrieve version values, use the get comments API.\n", "type": "string", - "example": "Wzk1LDFd" + "examples": [ + "Wzk1LDFd" + ] } } }, @@ -5746,12 +6469,16 @@ "description": "The new comment. It is required only when `type` is `user`.", "type": "string", "maxLength": 30000, - "example": "A new comment." + "examples": [ + "A new comment." + ] }, "id": { "type": "string", "description": "The identifier for the comment. To retrieve comment IDs, use the get comments API.\n", - "example": "8af6ac20-74f6-11ea-b83a-553aecdb28b6" + "examples": [ + "8af6ac20-74f6-11ea-b83a-553aecdb28b6" + ] }, "owner": { "$ref": "#/components/schemas/owners" @@ -5762,12 +6489,16 @@ "enum": [ "user" ], - "example": "user" + "examples": [ + "user" + ] }, "version": { "description": "The current comment version. To retrieve version values, use the get comments API.\n", "type": "string", - "example": "Wzk1LDFd" + "examples": [ + "Wzk1LDFd" + ] } }, "required": [ @@ -5802,7 +6533,9 @@ "push_to_service", "update" ], - "example": "create" + "examples": [ + "create" + ] }, "payload_alert_comment": { "type": "object", @@ -5814,7 +6547,9 @@ "oneOf": [ { "type": "string", - "example": "1c0b056b-cc9f-4b61-b5c9-cb801abd5e1d" + "examples": [ + "1c0b056b-cc9f-4b61-b5c9-cb801abd5e1d" + ] }, { "type": "array", @@ -5828,7 +6563,9 @@ "oneOf": [ { "type": "string", - "example": ".alerts-observability.logs.alerts-default" + "examples": [ + ".alerts-observability.logs.alerts-default" + ] }, { "type": "array", @@ -5847,12 +6584,16 @@ "id": { "description": "The rule identifier.", "type": "string", - "example": "94d80550-aaf4-11ec-985f-97e55adae8b9" + "examples": [ + "94d80550-aaf4-11ec-985f-97e55adae8b9" + ] }, "name": { "description": "The rule name.", "type": "string", - "example": "security_rule" + "examples": [ + "security_rule" + ] } } }, @@ -5881,9 +6622,11 @@ "type": "object", "properties": { "fields": { - "description": "An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value.", - "nullable": true, - "type": "object", + "description": "An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value.\n", + "type": [ + "object", + "null" + ], "properties": { "caseId": { "description": "The case identifier for Swimlane connectors.", @@ -5895,8 +6638,10 @@ }, "destIp": { "description": "Indicates whether cases will send a comma-separated list of destination IPs for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "impact": { "description": "The effect an incident had on business for ServiceNow ITSM connectors.", @@ -5915,13 +6660,17 @@ }, "malwareHash": { "description": "Indicates whether cases will send a comma-separated list of malware hashes for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "malwareUrl": { "description": "Indicates whether cases will send a comma-separated list of malware URLs for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "parent": { "description": "The key of the parent issue, when the issue type is sub-task for Jira connectors.", @@ -5941,8 +6690,10 @@ }, "sourceIp": { "description": "Indicates whether cases will send a comma-separated list of source IPs for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "subcategory": { "description": "The subcategory of the incident for ServiceNow ITSM connectors.", @@ -5953,17 +6704,23 @@ "type": "string" } }, - "example": null + "examples": [ + null + ] }, "id": { "description": "The identifier for the connector. To create a case without a connector, use `none`.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. To create a case without a connector, use `none`.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -5982,9 +6739,11 @@ "type": "object", "properties": { "fields": { - "description": "An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value.", - "nullable": true, - "type": "object", + "description": "An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value.\n", + "type": [ + "object", + "null" + ], "properties": { "caseId": { "description": "The case identifier for Swimlane connectors.", @@ -5996,8 +6755,10 @@ }, "destIp": { "description": "Indicates whether cases will send a comma-separated list of destination IPs for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "impact": { "description": "The effect an incident had on business for ServiceNow ITSM connectors.", @@ -6016,13 +6777,17 @@ }, "malwareHash": { "description": "Indicates whether cases will send a comma-separated list of malware hashes for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "malwareUrl": { "description": "Indicates whether cases will send a comma-separated list of malware URLs for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "parent": { "description": "The key of the parent issue, when the issue type is sub-task for Jira connectors.", @@ -6042,8 +6807,10 @@ }, "sourceIp": { "description": "Indicates whether cases will send a comma-separated list of source IPs for ServiceNow SecOps connectors.", - "type": "boolean", - "nullable": true + "type": [ + "boolean", + "null" + ] }, "subcategory": { "description": "The subcategory of the incident for ServiceNow ITSM connectors.", @@ -6054,17 +6821,23 @@ "type": "string" } }, - "example": null + "examples": [ + null + ] }, "id": { "description": "The identifier for the connector. To create a case without a connector, use `none`.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "name": { "description": "The name of the connector. To create a case without a connector, use `none`.", "type": "string", - "example": "none" + "examples": [ + "none" + ] }, "type": { "$ref": "#/components/schemas/connector_types" @@ -6089,11 +6862,13 @@ "tags": { "type": "array", "items": { - "type": "string", - "example": [ + "type": "string" + }, + "examples": [ + [ "tag-1" ] - } + ] }, "title": { "type": "string" @@ -6101,9 +6876,11 @@ } }, "payload_delete": { - "type": "object", - "description": "If the `action` is `delete` and the `type` is `delete_case`, the payload is nullable.", - "nullable": true + "type": [ + "object", + "null" + ], + "description": "If the `action` is `delete` and the `type` is `delete_case`, the payload is nullable." }, "payload_description": { "type": "object", @@ -6153,8 +6930,10 @@ "items": { "type": "string" }, - "example": [ - "tag-1" + "examples": [ + [ + "tag-1" + ] ] } } @@ -6206,7 +6985,9 @@ "settings", "severity" ], - "example": "create_case" + "examples": [ + "create_case" + ] }, "user_actions_response_properties": { "type": "object", @@ -6227,43 +7008,67 @@ }, "action_id": { "type": "string", - "example": "22fd3e30-03b1-11ed-920c-974bfa104448" + "examples": [ + "22fd3e30-03b1-11ed-920c-974bfa104448" + ] }, "case_id": { "type": "string", - "example": "22df07d0-03b1-11ed-920c-974bfa104448" + "examples": [ + "22df07d0-03b1-11ed-920c-974bfa104448" + ] }, "comment_id": { - "type": "string", - "nullable": true, - "example": "578608d0-03b1-11ed-920c-974bfa104448" + "type": [ + "string", + "null" + ], + "examples": [ + "578608d0-03b1-11ed-920c-974bfa104448" + ] }, "created_at": { "type": "string", "format": "date-time", - "example": "2022-05-13T09:16:17.416Z" + "examples": [ + "2022-05-13T09:16:17.416Z" + ] }, "created_by": { "type": "object", "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } }, "required": [ @@ -6341,36 +7146,56 @@ "$ref": "#/components/schemas/actions" }, "comment_id": { - "type": "string", - "nullable": true, - "example": "578608d0-03b1-11ed-920c-974bfa104448" + "type": [ + "string", + "null" + ], + "examples": [ + "578608d0-03b1-11ed-920c-974bfa104448" + ] }, "created_at": { "type": "string", "format": "date-time", - "example": "2022-05-13T09:16:17.416Z" + "examples": [ + "2022-05-13T09:16:17.416Z" + ] }, "created_by": { "type": "object", "properties": { "email": { - "type": "string", - "example": null, - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "full_name": { - "type": "string", - "example": null, - "nullable": true - }, - "username": { - "type": "string", - "example": "elastic", - "nullable": true + "type": [ + "string", + "null" + ], + "examples": [ + null + ] }, "profile_uid": { "type": "string", - "example": "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + "examples": [ + "u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0" + ] + }, + "username": { + "type": [ + "string", + "null" + ], + "examples": [ + "elastic" + ] } }, "required": [ @@ -6381,7 +7206,9 @@ }, "id": { "type": "string", - "example": "22fd3e30-03b1-11ed-920c-974bfa104448" + "examples": [ + "22fd3e30-03b1-11ed-920c-974bfa104448" + ] }, "owner": { "$ref": "#/components/schemas/owners" @@ -6431,7 +7258,9 @@ }, "version": { "type": "string", - "example": "WzM1ODg4LDFd" + "examples": [ + "WzM1ODg4LDFd" + ] }, "type": { "type": "string", @@ -6449,7 +7278,9 @@ "settings", "severity" ], - "example": "create_case" + "examples": [ + "create_case" + ] } } } diff --git a/x-pack/plugins/cases/docs/openapi/bundled.yaml b/x-pack/plugins/cases/docs/openapi/bundled.yaml index 8347d7d85741b..e837ef766ab0c 100644 --- a/x-pack/plugins/cases/docs/openapi/bundled.yaml +++ b/x-pack/plugins/cases/docs/openapi/bundled.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Cases description: OpenAPI schema for Cases endpoints - version: '0.1' + version: '0.2' contact: name: Cases Team license: @@ -194,7 +194,7 @@ paths: title: type: string description: The case title. - example: + examples: - id: 06116b80-e1c3-11ec-be9b-9b1838238ee6 title: security_case '401': @@ -258,22 +258,26 @@ paths: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' created_at: type: string format: date-time - example: '2022-06-01T17:07:17.767Z' + examples: + - '2022-06-01T17:07:17.767Z' created_by: type: object required: @@ -282,27 +286,37 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic error: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null id: type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + examples: + - 4a97a440-e1cd-11ec-be9b-9b1838238ee6 mappings: type: array items: @@ -310,46 +324,60 @@ paths: properties: action_type: type: string - example: overwrite + examples: + - overwrite source: type: string - example: title + examples: + - title target: type: string - example: summary + examples: + - summary owner: $ref: '#/components/schemas/owners' updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' + examples: + - '2022-06-01T19:58:48.169Z' updated_by: - type: object + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic version: type: string - example: WzIwNzMsMV0= + examples: + - WzIwNzMsMV0= examples: getConfigurationResponse: $ref: '#/components/examples/get_case_configuration_response' @@ -419,22 +447,26 @@ paths: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' created_at: type: string format: date-time - example: '2022-06-01T17:07:17.767Z' + examples: + - '2022-06-01T17:07:17.767Z' created_by: type: object required: @@ -443,27 +475,37 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic error: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null id: type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + examples: + - 4a97a440-e1cd-11ec-be9b-9b1838238ee6 mappings: type: array items: @@ -471,46 +513,60 @@ paths: properties: action_type: type: string - example: overwrite + examples: + - overwrite source: type: string - example: title + examples: + - title target: type: string - example: summary + examples: + - summary owner: $ref: '#/components/schemas/owners' updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' + examples: + - '2022-06-01T19:58:48.169Z' updated_by: - type: object + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic version: type: string - example: WzIwNzMsMV0= + examples: + - WzIwNzMsMV0= examples: setCaseConfigResponse: $ref: '#/components/examples/set_case_configuration_response' @@ -582,22 +638,26 @@ paths: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' created_at: type: string format: date-time - example: '2022-06-01T17:07:17.767Z' + examples: + - '2022-06-01T17:07:17.767Z' created_by: type: object required: @@ -606,27 +666,37 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic error: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null id: type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + examples: + - 4a97a440-e1cd-11ec-be9b-9b1838238ee6 mappings: type: array items: @@ -634,46 +704,60 @@ paths: properties: action_type: type: string - example: overwrite + examples: + - overwrite source: type: string - example: title + examples: + - title target: type: string - example: summary + examples: + - summary owner: $ref: '#/components/schemas/owners' updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' + examples: + - '2022-06-01T19:58:48.169Z' updated_by: - type: object + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic version: type: string - example: WzIwNzMsMV0= + examples: + - WzIwNzMsMV0= examples: updateCaseConfigurationResponse: $ref: '#/components/examples/update_case_configuration_response' @@ -709,20 +793,27 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic examples: getReportersResponse: $ref: '#/components/examples/get_reporters_response' @@ -1028,8 +1119,9 @@ paths: content: application/json: schema: - type: object - nullable: true + type: + - object + - 'null' responses: '200': description: Indicates a successful call. @@ -1344,7 +1436,7 @@ paths: title: type: string description: The case title. - example: + examples: - id: 06116b80-e1c3-11ec-be9b-9b1838238ee6 title: security_case '401': @@ -1409,22 +1501,26 @@ paths: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' created_at: type: string format: date-time - example: '2022-06-01T17:07:17.767Z' + examples: + - '2022-06-01T17:07:17.767Z' created_by: type: object required: @@ -1433,27 +1529,37 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic error: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null id: type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + examples: + - 4a97a440-e1cd-11ec-be9b-9b1838238ee6 mappings: type: array items: @@ -1461,46 +1567,60 @@ paths: properties: action_type: type: string - example: overwrite + examples: + - overwrite source: type: string - example: title + examples: + - title target: type: string - example: summary + examples: + - summary owner: $ref: '#/components/schemas/owners' updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' + examples: + - '2022-06-01T19:58:48.169Z' updated_by: - type: object + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic version: type: string - example: WzIwNzMsMV0= + examples: + - WzIwNzMsMV0= examples: getConfigurationResponse: $ref: '#/components/examples/get_case_configuration_response' @@ -1571,22 +1691,26 @@ paths: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' created_at: type: string format: date-time - example: '2022-06-01T17:07:17.767Z' + examples: + - '2022-06-01T17:07:17.767Z' created_by: type: object required: @@ -1595,27 +1719,37 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic error: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null id: type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + examples: + - 4a97a440-e1cd-11ec-be9b-9b1838238ee6 mappings: type: array items: @@ -1623,46 +1757,60 @@ paths: properties: action_type: type: string - example: overwrite + examples: + - overwrite source: type: string - example: title + examples: + - title target: type: string - example: summary + examples: + - summary owner: $ref: '#/components/schemas/owners' updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' + examples: + - '2022-06-01T19:58:48.169Z' updated_by: - type: object + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic version: type: string - example: WzIwNzMsMV0= + examples: + - WzIwNzMsMV0= examples: setCaseConfigResponse: $ref: '#/components/examples/set_case_configuration_response' @@ -1735,22 +1883,26 @@ paths: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' created_at: type: string format: date-time - example: '2022-06-01T17:07:17.767Z' + examples: + - '2022-06-01T17:07:17.767Z' created_by: type: object required: @@ -1759,27 +1911,37 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic error: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null id: type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + examples: + - 4a97a440-e1cd-11ec-be9b-9b1838238ee6 mappings: type: array items: @@ -1787,46 +1949,60 @@ paths: properties: action_type: type: string - example: overwrite + examples: + - overwrite source: type: string - example: title + examples: + - title target: type: string - example: summary + examples: + - summary owner: $ref: '#/components/schemas/owners' updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: '2022-06-01T19:58:48.169Z' + examples: + - '2022-06-01T19:58:48.169Z' updated_by: - type: object + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic version: type: string - example: WzIwNzMsMV0= + examples: + - WzIwNzMsMV0= examples: updateCaseConfigurationResponse: $ref: '#/components/examples/update_case_configuration_response' @@ -1913,20 +2089,27 @@ paths: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic examples: getReportersResponse: $ref: '#/components/examples/get_reporters_response' @@ -2269,8 +2452,9 @@ paths: content: application/json: schema: - type: object - nullable: true + type: + - object + - 'null' responses: '200': description: Indicates a successful call. @@ -2326,7 +2510,6 @@ paths: - $ref: '#/components/parameters/case_id' - $ref: '#/components/parameters/space_id' - $ref: '#/components/parameters/page_index' - example: '1' - $ref: '#/components/parameters/page_size' - $ref: '#/components/parameters/sort_order' - $ref: '#/components/parameters/user_action_types' @@ -2365,7 +2548,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' parameters: kbn_xsrf: schema: @@ -2386,7 +2570,8 @@ components: type: string minItems: 1 maxItems: 100 - example: d4e7abb0-b462-11ec-9a8d-698504725a43 + examples: + - - d4e7abb0-b462-11ec-9a8d-698504725a43 assignees: in: query name: assignees @@ -2410,7 +2595,8 @@ components: items: type: string maxItems: 100 - example: my-category + examples: + - - my-category defaultSearchOperator: in: query name: defaultSearchOperator @@ -2418,7 +2604,8 @@ components: schema: type: string default: OR - example: OR + examples: + - OR from: in: query name: from @@ -2426,7 +2613,8 @@ components: Returns only cases that were created after a specific date. The date must be specified as a KQL data range or date match expression. schema: type: string - example: now-1d + examples: + - now-1d owner: in: query name: owner @@ -2438,7 +2626,8 @@ components: - type: array items: $ref: '#/components/schemas/owners' - example: cases + examples: + - - cases page_index: in: query name: page @@ -2447,6 +2636,8 @@ components: schema: type: integer default: 1 + examples: + - 1 page_size: in: query name: perPage @@ -2467,7 +2658,8 @@ components: items: type: string maxItems: 100 - example: elastic + examples: + - - elastic search: in: query name: search @@ -2510,7 +2702,8 @@ components: - status - severity default: createdAt - example: updatedAt + examples: + - updatedAt sort_order: in: query name: sortOrder @@ -2532,7 +2725,8 @@ components: - closed - in-progress - open - example: open + examples: + - open tags: in: query name: tags @@ -2544,7 +2738,8 @@ components: items: type: string maxItems: 100 - example: tag-1 + examples: + - - tag-1 to: in: query name: to @@ -2552,7 +2747,8 @@ components: Returns only cases that were created before a specific date. The date must be specified as a KQL data range or date match expression. schema: type: string - example: now+1d + examples: + - now+1d alert_id: in: path name: alertId @@ -2560,7 +2756,8 @@ components: required: true schema: type: string - example: 09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540 + examples: + - 09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540 configuration_id: in: path name: configurationId @@ -2568,7 +2765,8 @@ components: required: true schema: type: string - example: 3297a0f0-b5ec-11ec-b141-0fdb20a7f9a9 + examples: + - 3297a0f0-b5ec-11ec-b141-0fdb20a7f9a9 case_id: in: path name: caseId @@ -2576,7 +2774,8 @@ components: required: true schema: type: string - example: 9c235210-6834-11ea-a78c-6ffb38a34414 + examples: + - 9c235210-6834-11ea-a78c-6ffb38a34414 includeComments: in: query name: includeComments @@ -2593,7 +2792,8 @@ components: required: true schema: type: string - example: 71ec1870-725b-11ea-a0b2-c51ea50a58e2 + examples: + - 71ec1870-725b-11ea-a0b2-c51ea50a58e2 connector_id: in: path name: connectorId @@ -2601,7 +2801,8 @@ components: required: true schema: type: string - example: abed3a70-71bd-11ea-a0b2-c51ea50a58e2 + examples: + - abed3a70-71bd-11ea-a0b2-c51ea50a58e2 user_action_types: in: query name: types @@ -2626,7 +2827,8 @@ components: - tags - title - user - example: create_case + examples: + - - create_case space_id: in: path name: spaceId @@ -2634,13 +2836,15 @@ components: required: true schema: type: string - example: default + examples: + - default schemas: assignees: - type: array + type: + - array + - 'null' description: An array containing users that are assigned to the case. maxItems: 10 - nullable: true items: type: object required: @@ -2649,7 +2853,8 @@ components: uid: type: string description: A unique identifier for the user profile. These identifiers can be found by using the suggest user profile API. - example: u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0 + examples: + - u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0 connector_properties_none: title: Create or update case request properties for no connector required: @@ -2662,21 +2867,26 @@ components: properties: fields: description: An object containing the connector fields. To create a case without a connector, specify null. To update a case to remove the connector, specify null. - nullable: true - type: string - example: null + type: + - string + - 'null' + examples: + - null id: description: The identifier for the connector. To create a case without a connector, use `none`. To update a case to remove the connector, specify `none`. type: string - example: none + examples: + - none name: description: The name of the connector. To create a case without a connector, use `none`. To update a case to remove the connector, specify `none`. type: string - example: none + examples: + - none type: description: The type of connector. To create a case without a connector, use `.none`. To update a case to remove the connector, specify `.none`. type: string - example: .none + examples: + - .none enum: - .none connector_properties_cases_webhook: @@ -2690,9 +2900,11 @@ components: type: object properties: fields: - type: string - nullable: true - example: null + type: + - string + - 'null' + examples: + - null id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -2702,7 +2914,8 @@ components: type: description: The type of connector. type: string - example: .cases-webhook + examples: + - .cases-webhook enum: - .cases-webhook connector_properties_jira: @@ -2725,16 +2938,19 @@ components: properties: issueType: description: The type of issue. - type: string - nullable: true + type: + - string + - 'null' parent: description: The key of the parent issue, when the issue type is sub-task. - type: string - nullable: true + type: + - string + - 'null' priority: description: The priority of the issue. - type: string - nullable: true + type: + - string + - 'null' id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -2744,7 +2960,8 @@ components: type: description: The type of connector. type: string - example: .jira + examples: + - .jira enum: - .jira connector_properties_resilient: @@ -2759,8 +2976,9 @@ components: properties: fields: description: An object containing the connector fields. If you want to omit any individual field, specify null as its value. - type: object - nullable: true + type: + - object + - 'null' required: - issueTypes - severityCode @@ -2782,7 +3000,8 @@ components: type: description: The type of connector. type: string - example: .resilient + examples: + - .resilient enum: - .resilient connector_properties_servicenow: @@ -2807,24 +3026,29 @@ components: properties: category: description: The category of the incident. - type: string - nullable: true + type: + - string + - 'null' impact: description: The effect an incident had on business. - type: string - nullable: true + type: + - string + - 'null' severity: description: The severity of the incident. - type: string - nullable: true + type: + - string + - 'null' subcategory: description: The subcategory of the incident. - type: string - nullable: true + type: + - string + - 'null' urgency: description: The extent to which the incident resolution can be delayed. - type: string - nullable: true + type: + - string + - 'null' id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -2834,7 +3058,8 @@ components: type: description: The type of connector. type: string - example: .servicenow + examples: + - .servicenow enum: - .servicenow connector_properties_servicenow_sir: @@ -2861,32 +3086,39 @@ components: properties: category: description: The category of the incident. - type: string - nullable: true + type: + - string + - 'null' destIp: description: Indicates whether cases will send a comma-separated list of destination IPs. - type: boolean - nullable: true + type: + - boolean + - 'null' malwareHash: description: Indicates whether cases will send a comma-separated list of malware hashes. - type: boolean - nullable: true + type: + - boolean + - 'null' malwareUrl: description: Indicates whether cases will send a comma-separated list of malware URLs. - type: boolean - nullable: true + type: + - boolean + - 'null' priority: description: The priority of the issue. - type: string - nullable: true + type: + - string + - 'null' sourceIp: description: Indicates whether cases will send a comma-separated list of source IPs. - type: boolean - nullable: true + type: + - boolean + - 'null' subcategory: description: The subcategory of the incident. - type: string - nullable: true + type: + - string + - 'null' id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -2896,7 +3128,8 @@ components: type: description: The type of connector. type: string - example: .servicenow-sir + examples: + - .servicenow-sir enum: - .servicenow-sir connector_properties_swimlane: @@ -2917,8 +3150,9 @@ components: properties: caseId: description: The case identifier for Swimlane connectors. - type: string - nullable: true + type: + - string + - 'null' id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -2928,7 +3162,8 @@ components: type: description: The type of connector. type: string - example: .swimlane + examples: + - .swimlane enum: - .swimlane owners: @@ -2939,7 +3174,8 @@ components: - cases - observability - securitySolution - example: cases + examples: + - cases settings: type: object description: An object that contains the case settings. @@ -2949,7 +3185,8 @@ components: syncAlerts: description: Turns alert syncing on or off. type: boolean - example: true + examples: + - true severity_property: type: string description: The severity of the case. @@ -3036,31 +3273,40 @@ components: description: | The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`. oneOf: - - type: string + - type: + - string + - 'null' minLength: 1 maxLength: 160 - nullable: true - type: boolean case_response_closed_by_properties: title: Case response properties for closed_by - type: object - nullable: true + type: + - object + - 'null' properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic required: - email - full_name @@ -3075,11 +3321,13 @@ components: type: array items: type: string - example: a6e12ac4-7bce-457b-84f6-d7ce8deb8446 + examples: + - a6e12ac4-7bce-457b-84f6-d7ce8deb8446 created_at: type: string format: date-time - example: '2023-11-06T19:29:38.424Z' + examples: + - '2023-11-06T19:29:38.424Z' created_by: type: object required: @@ -3088,171 +3336,226 @@ components: - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic id: type: string - example: 73362370-ab1a-11ec-985f-97e55adae8b9 + examples: + - 73362370-ab1a-11ec-985f-97e55adae8b9 index: type: array items: type: string - example: .internal.alerts-security.alerts-default-000001 + examples: + - .internal.alerts-security.alerts-default-000001 owner: $ref: '#/components/schemas/owners' pushed_at: - type: string + type: + - string + - 'null' format: date-time - example: null - nullable: true + examples: + - null pushed_by: - type: object + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic rule: type: object properties: id: description: The rule identifier. type: string - example: 94d80550-aaf4-11ec-985f-97e55adae8b9 + examples: + - 94d80550-aaf4-11ec-985f-97e55adae8b9 name: description: The rule name. type: string - example: security_rule + examples: + - security_rule type: type: string - example: alert + examples: + - alert enum: - alert updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true updated_by: - type: object - nullable: true + type: + - object + - 'null' required: - email - full_name - username properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic version: type: string - example: WzMwNDgsMV0= + examples: + - WzMwNDgsMV0= case_response_created_by_properties: title: Case response properties for created_by type: object properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic required: - email - full_name - username case_response_pushed_by_properties: title: Case response properties for pushed_by - type: object - nullable: true + type: + - object + - 'null' properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic required: - email - full_name - username case_response_updated_by_properties: title: Case response properties for updated_by - type: object - nullable: true + type: + - object + - 'null' properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic required: - email - full_name @@ -3265,43 +3568,53 @@ components: properties: comment: type: string - example: A new comment. + examples: + - A new comment. created_at: type: string format: date-time - example: '2022-05-13T09:16:17.416Z' + examples: + - '2022-05-13T09:16:17.416Z' created_by: $ref: '#/components/schemas/case_response_created_by_properties' id: type: string - example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 + examples: + - 8af6ac20-74f6-11ea-b83a-553aecdb28b6 owner: $ref: '#/components/schemas/owners' pushed_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: null + examples: + - null pushed_by: $ref: '#/components/schemas/case_response_pushed_by_properties' type: type: string - example: user + examples: + - user enum: - user updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true - example: null + examples: + - null updated_by: $ref: '#/components/schemas/case_response_updated_by_properties' version: type: string - example: WzIwNDMxLDFd + examples: + - WzIwNDMxLDFd external_service: - type: object - nullable: true + type: + - object + - 'null' properties: connector_id: type: string @@ -3317,24 +3630,32 @@ components: type: string format: date-time pushed_by: - type: object + type: + - object + - 'null' properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 - nullable: true + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic status: type: string description: The status of the case. @@ -3371,13 +3692,15 @@ components: assignees: $ref: '#/components/schemas/assignees' category: - type: string + type: + - string + - 'null' description: The case category. - nullable: true closed_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true closed_by: $ref: '#/components/schemas/case_response_closed_by_properties' comments: @@ -3406,7 +3729,8 @@ components: created_at: type: string format: date-time - example: '2022-05-13T09:16:17.416Z' + examples: + - '2022-05-13T09:16:17.416Z' created_by: $ref: '#/components/schemas/case_response_created_by_properties' customFields: @@ -3431,25 +3755,30 @@ components: description: | The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`. oneOf: - - type: string + - type: + - string + - 'null' minLength: 1 maxLength: 160 - nullable: true - type: boolean description: type: string - example: A case description. + examples: + - A case description. duration: - type: integer + type: + - integer + - 'null' description: | The elapsed time from the creation of the case to its closure (in seconds). If the case has not been closed, the duration is set to null. If the case was closed after less than half a second, the duration is rounded down to zero. - nullable: true - example: 120 + examples: + - 120 external_service: $ref: '#/components/schemas/external_service' id: type: string - example: 66b9aa00-94fa-11ea-9f74-e7e108796192 + examples: + - 66b9aa00-94fa-11ea-9f74-e7e108796192 owner: $ref: '#/components/schemas/owners' settings: @@ -3462,38 +3791,45 @@ components: type: array items: type: string - example: - - tag-1 + examples: + - - tag-1 title: type: string - example: Case title 1 + examples: + - Case title 1 totalAlerts: type: integer - example: 0 + examples: + - 0 totalComment: type: integer - example: 0 + examples: + - 0 updated_at: - type: string + type: + - string + - 'null' format: date-time - nullable: true updated_by: $ref: '#/components/schemas/case_response_updated_by_properties' version: type: string - example: WzUzMiwxXQ== + examples: + - WzUzMiwxXQ== 4xx_response: type: object title: Unsuccessful cases API response properties: error: type: string - example: Unauthorized + examples: + - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 update_case_request: title: Update case request description: The update case API request body varies depending on the type of connector. @@ -3556,10 +3892,11 @@ components: description: | The custom field value. If the custom field is required, it cannot be explicitly set to null. However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`. oneOf: - - type: string + - type: + - string + - 'null' minLength: 1 maxLength: 160 - nullable: true - type: boolean description: description: An updated description for the case. @@ -3600,7 +3937,8 @@ components: enum: - close-by-pushing - close-by-user - example: close-by-user + examples: + - close-by-user connector_types: type: string description: The type of connector. @@ -3612,7 +3950,8 @@ components: - .servicenow - .servicenow-sir - .swimlane - example: .none + examples: + - .none set_case_configuration_request: title: Set case configuration request description: External connection details, such as the closure type and default connector for cases. @@ -3630,16 +3969,19 @@ components: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' required: @@ -3699,16 +4041,19 @@ components: properties: fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - object + - 'null' id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' required: @@ -3753,7 +4098,8 @@ components: description: | The version of the connector. To retrieve the version value, use the get configuration API. type: string - example: WzIwMiwxXQ== + examples: + - WzIwMiwxXQ== alert_response_properties: type: object properties: @@ -3777,7 +4123,8 @@ components: type: string maxItems: 1000 x-technical-preview: true - example: 6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42 + examples: + - 6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42 alert_indices: title: Alert indices description: | @@ -3799,11 +4146,13 @@ components: id: description: The rule identifier. type: string - example: 94d80550-aaf4-11ec-985f-97e55adae8b9 + examples: + - 94d80550-aaf4-11ec-985f-97e55adae8b9 name: description: The rule name. type: string - example: security_rule + examples: + - security_rule add_alert_comment_request_properties: title: Add case comment request properties for alerts required: @@ -3826,7 +4175,8 @@ components: type: description: The type of comment. type: string - example: alert + examples: + - alert enum: - alert add_user_comment_request_properties: @@ -3838,13 +4188,15 @@ components: description: The new comment. It is required only when `type` is `user`. type: string maxLength: 30000 - example: A new comment. + examples: + - A new comment. owner: $ref: '#/components/schemas/owners' type: type: string description: The type of comment. - example: user + examples: + - user enum: - user required: @@ -3878,7 +4230,8 @@ components: type: string description: | The identifier for the comment. To retrieve comment IDs, use the get comments API. - example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 + examples: + - 8af6ac20-74f6-11ea-b83a-553aecdb28b6 index: $ref: '#/components/schemas/alert_indices' owner: @@ -3890,12 +4243,14 @@ components: type: string enum: - alert - example: alert + examples: + - alert version: description: | The current comment version. To retrieve version values, use the get comments API. type: string - example: Wzk1LDFd + examples: + - Wzk1LDFd update_user_comment_request_properties: title: Update case comment request properties for user comments description: Defines properties for case comment requests when type is user. @@ -3905,12 +4260,14 @@ components: description: The new comment. It is required only when `type` is `user`. type: string maxLength: 30000 - example: A new comment. + examples: + - A new comment. id: type: string description: | The identifier for the comment. To retrieve comment IDs, use the get comments API. - example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 + examples: + - 8af6ac20-74f6-11ea-b83a-553aecdb28b6 owner: $ref: '#/components/schemas/owners' type: @@ -3918,12 +4275,14 @@ components: description: The type of comment. enum: - user - example: user + examples: + - user version: description: | The current comment version. To retrieve version values, use the get comments API. type: string - example: Wzk1LDFd + examples: + - Wzk1LDFd required: - comment - id @@ -3946,7 +4305,8 @@ components: - delete - push_to_service - update - example: create + examples: + - create payload_alert_comment: type: object properties: @@ -3956,14 +4316,16 @@ components: alertId: oneOf: - type: string - example: 1c0b056b-cc9f-4b61-b5c9-cb801abd5e1d + examples: + - 1c0b056b-cc9f-4b61-b5c9-cb801abd5e1d - type: array items: type: string index: oneOf: - type: string - example: .alerts-observability.logs.alerts-default + examples: + - .alerts-observability.logs.alerts-default - type: array items: type: string @@ -3975,11 +4337,13 @@ components: id: description: The rule identifier. type: string - example: 94d80550-aaf4-11ec-985f-97e55adae8b9 + examples: + - 94d80550-aaf4-11ec-985f-97e55adae8b9 name: description: The rule name. type: string - example: security_rule + examples: + - security_rule type: type: string enum: @@ -3996,9 +4360,11 @@ components: type: object properties: fields: - description: An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value. - nullable: true - type: object + description: | + An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value. + type: + - object + - 'null' properties: caseId: description: The case identifier for Swimlane connectors. @@ -4008,8 +4374,9 @@ components: type: string destIp: description: Indicates whether cases will send a comma-separated list of destination IPs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' impact: description: The effect an incident had on business for ServiceNow ITSM connectors. type: string @@ -4023,12 +4390,14 @@ components: type: string malwareHash: description: Indicates whether cases will send a comma-separated list of malware hashes for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' malwareUrl: description: Indicates whether cases will send a comma-separated list of malware URLs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' parent: description: The key of the parent issue, when the issue type is sub-task for Jira connectors. type: string @@ -4043,23 +4412,27 @@ components: type: string sourceIp: description: Indicates whether cases will send a comma-separated list of source IPs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' subcategory: description: The subcategory of the incident for ServiceNow ITSM connectors. type: string urgency: description: The extent to which the incident resolution can be delayed for ServiceNow ITSM connectors. type: string - example: null + examples: + - null id: description: The identifier for the connector. To create a case without a connector, use `none`. type: string - example: none + examples: + - none name: description: The name of the connector. To create a case without a connector, use `none`. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' payload_create_case: @@ -4071,9 +4444,11 @@ components: type: object properties: fields: - description: An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value. - nullable: true - type: object + description: | + An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value. + type: + - object + - 'null' properties: caseId: description: The case identifier for Swimlane connectors. @@ -4083,8 +4458,9 @@ components: type: string destIp: description: Indicates whether cases will send a comma-separated list of destination IPs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' impact: description: The effect an incident had on business for ServiceNow ITSM connectors. type: string @@ -4098,12 +4474,14 @@ components: type: string malwareHash: description: Indicates whether cases will send a comma-separated list of malware hashes for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' malwareUrl: description: Indicates whether cases will send a comma-separated list of malware URLs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' parent: description: The key of the parent issue, when the issue type is sub-task for Jira connectors. type: string @@ -4118,23 +4496,27 @@ components: type: string sourceIp: description: Indicates whether cases will send a comma-separated list of source IPs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - boolean + - 'null' subcategory: description: The subcategory of the incident for ServiceNow ITSM connectors. type: string urgency: description: The extent to which the incident resolution can be delayed for ServiceNow ITSM connectors. type: string - example: null + examples: + - null id: description: The identifier for the connector. To create a case without a connector, use `none`. type: string - example: none + examples: + - none name: description: The name of the connector. To create a case without a connector, use `none`. type: string - example: none + examples: + - none type: $ref: '#/components/schemas/connector_types' description: @@ -4151,14 +4533,15 @@ components: type: array items: type: string - example: - - tag-1 + examples: + - - tag-1 title: type: string payload_delete: - type: object + type: + - object + - 'null' description: If the `action` is `delete` and the `type` is `delete_case`, the payload is nullable. - nullable: true payload_description: type: object properties: @@ -4191,8 +4574,8 @@ components: type: array items: type: string - example: - - tag-1 + examples: + - - tag-1 payload_title: type: object properties: @@ -4228,7 +4611,8 @@ components: - status - settings - severity - example: create_case + examples: + - create_case user_actions_response_properties: type: object required: @@ -4246,36 +4630,48 @@ components: $ref: '#/components/schemas/actions' action_id: type: string - example: 22fd3e30-03b1-11ed-920c-974bfa104448 + examples: + - 22fd3e30-03b1-11ed-920c-974bfa104448 case_id: type: string - example: 22df07d0-03b1-11ed-920c-974bfa104448 + examples: + - 22df07d0-03b1-11ed-920c-974bfa104448 comment_id: - type: string - nullable: true - example: 578608d0-03b1-11ed-920c-974bfa104448 + type: + - string + - 'null' + examples: + - 578608d0-03b1-11ed-920c-974bfa104448 created_at: type: string format: date-time - example: '2022-05-13T09:16:17.416Z' + examples: + - '2022-05-13T09:16:17.416Z' created_by: type: object properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic required: - email - full_name @@ -4315,38 +4711,49 @@ components: action: $ref: '#/components/schemas/actions' comment_id: - type: string - nullable: true - example: 578608d0-03b1-11ed-920c-974bfa104448 + type: + - string + - 'null' + examples: + - 578608d0-03b1-11ed-920c-974bfa104448 created_at: type: string format: date-time - example: '2022-05-13T09:16:17.416Z' + examples: + - '2022-05-13T09:16:17.416Z' created_by: type: object properties: email: - type: string - example: null - nullable: true + type: + - string + - 'null' + examples: + - null full_name: - type: string - example: null - nullable: true - username: - type: string - example: elastic - nullable: true + type: + - string + - 'null' + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + username: + type: + - string + - 'null' + examples: + - elastic required: - email - full_name - username id: type: string - example: 22fd3e30-03b1-11ed-920c-974bfa104448 + examples: + - 22fd3e30-03b1-11ed-920c-974bfa104448 owner: $ref: '#/components/schemas/owners' payload: @@ -4366,7 +4773,8 @@ components: - $ref: '#/components/schemas/payload_user_comment' version: type: string - example: WzM1ODg4LDFd + examples: + - WzM1ODg4LDFd type: type: string description: The type of action. @@ -4382,7 +4790,8 @@ components: - status - settings - severity - example: create_case + examples: + - create_case examples: create_case_request: summary: Create a security case that uses a Jira connector. diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/alert_id.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/alert_id.yaml index 8677b327b91be..24c728f017d12 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/alert_id.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/alert_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the alert. required: true schema: type: string - example: 09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540 \ No newline at end of file + examples: + - 09f0c261e39e36351d75995b78bb83673774d1bc2cca9df2d15f0e5c0a99a540 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/case_id.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/case_id.yaml index eebde85823746..de7cfebbeb6bf 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/case_id.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/case_id.yaml @@ -4,4 +4,5 @@ description: The identifier for the case. To retrieve case IDs, use the find cas required: true schema: type: string - example: 9c235210-6834-11ea-a78c-6ffb38a34414 \ No newline at end of file + examples: + - 9c235210-6834-11ea-a78c-6ffb38a34414 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/category.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/category.yaml index 8bf20d9aa2450..8d28898750ae2 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/category.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/category.yaml @@ -8,4 +8,5 @@ schema: items: type: string maxItems: 100 -example: my-category \ No newline at end of file + examples: + - [ my-category ] \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/comment_id.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/comment_id.yaml index a46f47569e8d2..852ad328c6c4e 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/comment_id.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/comment_id.yaml @@ -6,4 +6,5 @@ description: > required: true schema: type: string - example: '71ec1870-725b-11ea-a0b2-c51ea50a58e2' \ No newline at end of file + examples: + - '71ec1870-725b-11ea-a0b2-c51ea50a58e2' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/configuration_id.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/configuration_id.yaml index 65cce12afaa92..884821a79952f 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/configuration_id.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/configuration_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the configuration. required: true schema: type: string - example: 3297a0f0-b5ec-11ec-b141-0fdb20a7f9a9 \ No newline at end of file + examples: + - 3297a0f0-b5ec-11ec-b141-0fdb20a7f9a9 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/connector_id.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/connector_id.yaml index 71cdc7191cfa1..7fc146b22126c 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/connector_id.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/connector_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the connector. To retrieve connector IDs, use the required: true schema: type: string - example: abed3a70-71bd-11ea-a0b2-c51ea50a58e2 \ No newline at end of file + examples: + - abed3a70-71bd-11ea-a0b2-c51ea50a58e2 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/defaultSearchOperator.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/defaultSearchOperator.yaml index 8e9004c859b46..cd3cf8cb1c005 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/defaultSearchOperator.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/defaultSearchOperator.yaml @@ -4,4 +4,5 @@ description: he default operator to use for the simple_query_string. schema: type: string default: OR -example: OR \ No newline at end of file + examples: + - OR \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/from.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/from.yaml index 6f9a24dae5956..bf92b68ad6ba3 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/from.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/from.yaml @@ -5,4 +5,5 @@ description: > The date must be specified as a KQL data range or date match expression. schema: type: string - example: now-1d \ No newline at end of file + examples: + - now-1d \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/ids.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/ids.yaml index c84ec64ab2a53..acd48cd0955a2 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/ids.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/ids.yaml @@ -10,4 +10,5 @@ schema: type: string minItems: 1 maxItems: 100 -example: d4e7abb0-b462-11ec-9a8d-698504725a43 + examples: + - [ d4e7abb0-b462-11ec-9a8d-698504725a43 ] diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/owner.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/owner.yaml index 3c5e511742bf2..d4f40a4403723 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/owner.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/owner.yaml @@ -10,4 +10,5 @@ schema: - type: array items: $ref: '../schemas/owners.yaml' -example: cases \ No newline at end of file + examples: + - [ cases ] \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/page_index.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/page_index.yaml index 9176d3b62094e..8ac69a105d15b 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/page_index.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/page_index.yaml @@ -5,3 +5,5 @@ required: false schema: type: integer default: 1 + examples: + - 1 diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/reporters.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/reporters.yaml index db28a6c48ae02..3d4d24cafd3ca 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/reporters.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/reporters.yaml @@ -8,4 +8,5 @@ schema: items: type: string maxItems: 100 -example: elastic + examples: + - [ elastic ] diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/sortField.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/sortField.yaml index 9df834cf9f5ac..d5a49214e9d90 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/sortField.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/sortField.yaml @@ -12,4 +12,5 @@ schema: - status - severity default: createdAt -example: updatedAt \ No newline at end of file + examples: + - updatedAt \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/space_id.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/space_id.yaml index 0a9fba457e3e7..45787e844caec 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/space_id.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/space_id.yaml @@ -4,4 +4,5 @@ description: An identifier for the space. If `/s/` and the identifier are omitte required: true schema: type: string - example: default + examples: + - default diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/status.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/status.yaml index 0517e7516a87f..b90edcd58286b 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/status.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/status.yaml @@ -7,4 +7,5 @@ schema: - closed - in-progress - open -example: open \ No newline at end of file + examples: + - open \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/tags.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/tags.yaml index d899edbcc38eb..b1732fb124577 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/tags.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/tags.yaml @@ -8,4 +8,5 @@ schema: items: type: string maxItems: 100 -example: tag-1 + examples: + - [ tag-1 ] diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/to.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/to.yaml index c176ce8407803..dd326cabd8dca 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/to.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/to.yaml @@ -5,4 +5,5 @@ description: > The date must be specified as a KQL data range or date match expression. schema: type: string -example: now+1d \ No newline at end of file + examples: + - now+1d \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/parameters/user_action_types.yaml b/x-pack/plugins/cases/docs/openapi/components/parameters/user_action_types.yaml index 2b04b7c806620..320dc67b631ca 100644 --- a/x-pack/plugins/cases/docs/openapi/components/parameters/user_action_types.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/parameters/user_action_types.yaml @@ -21,4 +21,5 @@ schema: - tags - title - user -example: create_case \ No newline at end of file + examples: + - [ create_case ] \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/4xx_response.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/4xx_response.yaml index 75d0ac39903bf..72d3bd82cbf60 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/4xx_response.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/4xx_response.yaml @@ -3,9 +3,11 @@ title: Unsuccessful cases API response properties: error: type: string - example: Unauthorized + examples: + - Unauthorized message: type: string statusCode: type: integer - example: 401 \ No newline at end of file + examples: + - 401 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/action_types.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/action_types.yaml index 3568008b07000..140b606b44565 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/action_types.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/action_types.yaml @@ -13,4 +13,5 @@ enum: - status - settings - severity -example: create_case \ No newline at end of file +examples: + - create_case \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/actions.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/actions.yaml index 1638ed67c78e2..f2b20517efd54 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/actions.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/actions.yaml @@ -5,4 +5,5 @@ enum: - delete - push_to_service - update -example: create \ No newline at end of file +examples: + - create \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/add_alert_comment_request_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/add_alert_comment_request_properties.yaml index c99ebb19cc818..192e12f62857c 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/add_alert_comment_request_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/add_alert_comment_request_properties.yaml @@ -19,6 +19,7 @@ properties: type: description: The type of comment. type: string - example: alert + examples: + - alert enum: - alert \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/add_user_comment_request_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/add_user_comment_request_properties.yaml index beac63c377ade..a0740dbdc51bc 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/add_user_comment_request_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/add_user_comment_request_properties.yaml @@ -6,13 +6,15 @@ properties: description: The new comment. It is required only when `type` is `user`. type: string maxLength: 30000 - example: A new comment. + examples: + - A new comment. owner: $ref: 'owners.yaml' type: type: string description: The type of comment. - example: user + examples: + - user enum: - user required: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml index 443d9dcc55523..3305732cee6ec 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/alert_comment_response_properties.yaml @@ -7,11 +7,13 @@ properties: type: array items: type: string - example: a6e12ac4-7bce-457b-84f6-d7ce8deb8446 + examples: + - a6e12ac4-7bce-457b-84f6-d7ce8deb8446 created_at: type: string format: date-time - example: 2023-11-06T19:29:38.424Z + examples: + - 2023-11-06T19:29:38.424Z created_by: type: object required: @@ -22,44 +24,52 @@ properties: $ref: 'user_properties.yaml' id: type: string - example: 73362370-ab1a-11ec-985f-97e55adae8b9 + examples: + - 73362370-ab1a-11ec-985f-97e55adae8b9 index: type: array items: type: string - example: .internal.alerts-security.alerts-default-000001 + examples: + - .internal.alerts-security.alerts-default-000001 owner: $ref: 'owners.yaml' pushed_at: - type: string + type: + - "string" + - "null" format: date-time - example: null - nullable: true + examples: + - null pushed_by: - type: object + type: + - "object" + - "null" required: - email - full_name - username properties: $ref: 'user_properties.yaml' - nullable: true rule: type: object properties: $ref: 'rule_properties.yaml' type: type: string - example: alert + examples: + - alert enum: - alert updated_at: - type: string + type: + - "string" + - "null" format: date-time - nullable: true updated_by: - type: object - nullable: true + type: + - "object" + - "null" required: - email - full_name @@ -68,4 +78,5 @@ properties: $ref: 'user_properties.yaml' version: type: string - example: WzMwNDgsMV0= \ No newline at end of file + examples: + - WzMwNDgsMV0= \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/alert_identifiers.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/alert_identifiers.yaml index cca8eb74f5019..5a8f821931f57 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/alert_identifiers.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/alert_identifiers.yaml @@ -13,4 +13,5 @@ oneOf: type: string maxItems: 1000 x-technical-preview: true -example: 6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42 \ No newline at end of file +examples: + - 6b24c4dc44bc720cfc92797f3d61fff952f2b2627db1fb4f8cc49f4530c4ff42 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/assignees.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/assignees.yaml index 5b4e18517bd43..4109c4d476909 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/assignees.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/assignees.yaml @@ -1,7 +1,8 @@ -type: array +type: + - "array" + - "null" description: An array containing users that are assigned to the case. maxItems: 10 -nullable: true items: type: object required: @@ -10,4 +11,5 @@ items: uid: type: string description: A unique identifier for the user profile. These identifiers can be found by using the suggest user profile API. - example: u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0 \ No newline at end of file + examples: + - u_0wpfV1MqYDaXzLtRVY-gLMrddKDEmfz51Fszhj7hWC8_0 \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_connector_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_connector_properties.yaml index ce1669c37941e..3873a8ae9e0f6 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_connector_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_connector_properties.yaml @@ -1,14 +1,17 @@ fields: description: The fields specified in the case configuration are not used and are not propagated to individual cases, therefore it is recommended to set it to `null`. - nullable: true - type: object + type: + - "object" + - "null" id: description: The identifier for the connector. If you do not want a default connector, use `none`. To retrieve connector IDs, use the find connectors API. type: string - example: none + examples: + - none name: description: The name of the connector. If you do not want a default connector, use `none`. To retrieve connector names, use the find connectors API. type: string - example: none + examples: + - none type: $ref: 'connector_types.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml index 62bddb7a2597b..e85179f3053ac 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml @@ -15,7 +15,8 @@ connector: created_at: type: string format: date-time - example: 2022-06-01T17:07:17.767Z + examples: + - 2022-06-01T17:07:17.767Z created_by: type: object required: @@ -25,12 +26,15 @@ created_by: properties: $ref: 'user_properties.yaml' error: - type: string - nullable: true - example: null + type: + - "string" + - "null" + examples: + - null id: type: string - example: 4a97a440-e1cd-11ec-be9b-9b1838238ee6 + examples: + - 4a97a440-e1cd-11ec-be9b-9b1838238ee6 mappings: type: array items: @@ -38,29 +42,36 @@ mappings: properties: action_type: type: string - example: overwrite + examples: + - overwrite source: type: string - example: title + examples: + - title target: type: string - example: summary + examples: + - summary owner: $ref: 'owners.yaml' updated_at: - type: string + type: + - "string" + - "null" format: date-time - nullable: true - example: 2022-06-01T19:58:48.169Z + examples: + - 2022-06-01T19:58:48.169Z updated_by: - type: object + type: + - "object" + - "null" required: - email - full_name - username properties: $ref: 'user_properties.yaml' - nullable: true version: type: string - example: WzIwNzMsMV0= \ No newline at end of file + examples: + - WzIwNzMsMV0= \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml index 4170833e818cc..5a4c9f26e09b2 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_customfields.yaml @@ -18,8 +18,9 @@ value: However, for cases that existed when the required custom field was added, the default value stored in Elasticsearch is `undefined`. The value returned in the API and user interface in this case is `null`. oneOf: - - type: string + - type: + - "string" + - "null" minLength: 1 maxLength: 160 - nullable: true - type: boolean diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_closed_by_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_closed_by_properties.yaml index 95bd14e4957a3..26b3eaa7395eb 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_closed_by_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_closed_by_properties.yaml @@ -1,6 +1,7 @@ title: Case response properties for closed_by -type: object -nullable: true +type: + - "object" + - "null" properties: $ref: 'user_properties.yaml' required: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_connector_field_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_connector_field_properties.yaml index 1ac30d325d45e..18f79997e31ce 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_connector_field_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_connector_field_properties.yaml @@ -1,7 +1,8 @@ title: Case response properties for connector fields -type: object +type: + - "object" + - "null" description: An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value. -nullable: true properties: caseId: description: The case identifier for Swimlane connectors. @@ -11,8 +12,9 @@ properties: type: string destIp: description: Indicates whether cases will send a comma-separated list of destination IPs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - "boolean" + - "null" impact: description: The effect an incident had on business for ServiceNow ITSM connectors. type: string @@ -26,12 +28,14 @@ properties: type: string malwareHash: description: Indicates whether cases will send a comma-separated list of malware hashes for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - "boolean" + - "null" malwareUrl: description: Indicates whether cases will send a comma-separated list of malware URLs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - "boolean" + - "null" parent: description: The key of the parent issue, when the issue type is sub-task for Jira connectors. type: string diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml index 60c6520d2f4c3..8f3de83d88c69 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml @@ -26,13 +26,15 @@ properties: assignees: $ref: 'assignees.yaml' category: - type: string + type: + - "string" + - "null" description: The case category. - nullable: true closed_at: - type: string + type: + - "string" + - "null" format: date-time - nullable: true closed_by: $ref: 'case_response_closed_by_properties.yaml' comments: @@ -61,7 +63,8 @@ properties: created_at: type: string format: date-time - example: '2022-05-13T09:16:17.416Z' + examples: + - '2022-05-13T09:16:17.416Z' created_by: $ref: 'case_response_created_by_properties.yaml' customFields: @@ -74,21 +77,25 @@ properties: $ref: 'case_customfields.yaml' description: type: string - example: A case description. + examples: + - A case description. duration: - type: integer + type: + - "integer" + - "null" description: > The elapsed time from the creation of the case to its closure (in seconds). If the case has not been closed, the duration is set to null. If the case was closed after less than half a second, the duration is rounded down to zero. - nullable: true - example: 120 + examples: + - 120 external_service: $ref: 'external_service.yaml' id: type: string - example: 66b9aa00-94fa-11ea-9f74-e7e108796192 + examples: + - 66b9aa00-94fa-11ea-9f74-e7e108796192 owner: $ref: 'owners.yaml' settings: @@ -101,23 +108,28 @@ properties: type: array items: type: string - example: - - tag-1 + examples: + - [tag-1] title: type: string - example: Case title 1 + examples: + - Case title 1 totalAlerts: type: integer - example: 0 + examples: + - 0 totalComment: type: integer - example: 0 + examples: + - 0 updated_at: - type: string + type: + - "string" + - "null" format: date-time - nullable: true updated_by: $ref: 'case_response_updated_by_properties.yaml' version: type: string - example: WzUzMiwxXQ== + examples: + - WzUzMiwxXQ== diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_pushed_by_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_pushed_by_properties.yaml index c59a5565c98b9..72f2c3ef619a2 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_pushed_by_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_pushed_by_properties.yaml @@ -1,6 +1,7 @@ title: Case response properties for pushed_by -type: object -nullable: true +type: + - "object" + - "null" properties: $ref: 'user_properties.yaml' required: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_updated_by_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_updated_by_properties.yaml index cd1bae033f2ff..8e475c5d205d6 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_updated_by_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_updated_by_properties.yaml @@ -1,6 +1,7 @@ title: Case response properties for updated_by -type: object -nullable: true +type: + - "object" + - "null" properties: $ref: 'user_properties.yaml' required: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/closure_types.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/closure_types.yaml index 6879f820d6f5c..8484d4d051ca4 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/closure_types.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/closure_types.yaml @@ -3,4 +3,5 @@ description: Indicates whether a case is automatically closed when it is pushed enum: - close-by-pushing - close-by-user -example: close-by-user \ No newline at end of file +examples: + - close-by-user \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/comment_types.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/comment_types.yaml index 9731b8ce4fad5..6a41e07aada44 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/comment_types.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/comment_types.yaml @@ -3,4 +3,5 @@ description: The type of comment. enum: - alert - user -example: user \ No newline at end of file +examples: + - user \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties.yaml index 9416a31f38775..e68c226ee9b92 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties.yaml @@ -1,7 +1,11 @@ fields: - description: An object containing the connector fields. To create a case without a connector, specify null. If you want to omit any individual field, specify null as its value. - nullable: true - type: object + description: > + An object containing the connector fields. + To create a case without a connector, specify null. + If you want to omit any individual field, specify null as its value. + type: + - "object" + - "null" properties: caseId: description: The case identifier for Swimlane connectors. @@ -11,8 +15,9 @@ fields: type: string destIp: description: Indicates whether cases will send a comma-separated list of destination IPs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - "boolean" + - "null" impact: description: The effect an incident had on business for ServiceNow ITSM connectors. type: string @@ -26,12 +31,14 @@ fields: type: string malwareHash: description: Indicates whether cases will send a comma-separated list of malware hashes for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - "boolean" + - "null" malwareUrl: description: Indicates whether cases will send a comma-separated list of malware URLs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - "boolean" + - "null" parent: description: The key of the parent issue, when the issue type is sub-task for Jira connectors. type: string @@ -46,22 +53,26 @@ fields: type: string sourceIp: description: Indicates whether cases will send a comma-separated list of source IPs for ServiceNow SecOps connectors. - type: boolean - nullable: true + type: + - "boolean" + - "null" subcategory: description: The subcategory of the incident for ServiceNow ITSM connectors. type: string urgency: description: The extent to which the incident resolution can be delayed for ServiceNow ITSM connectors. type: string - example: null + examples: + - null id: description: The identifier for the connector. To create a case without a connector, use `none`. type: string - example: none + examples: + - none name: description: The name of the connector. To create a case without a connector, use `none`. type: string - example: none + examples: + - none type: $ref: 'connector_types.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_cases_webhook.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_cases_webhook.yaml index 871b3180bc22e..b204dcbdd9f4d 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_cases_webhook.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_cases_webhook.yaml @@ -8,9 +8,11 @@ description: Defines properties for connectors when type is `.cases-webhook`. type: object properties: fields: - type: string - nullable: true - example: null + type: + - "string" + - "null" + examples: + - null id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -20,6 +22,7 @@ properties: type: description: The type of connector. type: string - example: .cases-webhook + examples: + - .cases-webhook enum: - .cases-webhook \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_jira.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_jira.yaml index a63f1fbd568d0..6eb1c0baa8e4e 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_jira.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_jira.yaml @@ -17,16 +17,19 @@ properties: properties: issueType: description: The type of issue. - type: string - nullable: true + type: + - "string" + - "null" parent: description: The key of the parent issue, when the issue type is sub-task. - type: string - nullable: true + type: + - "string" + - "null" priority: description: The priority of the issue. - type: string - nullable: true + type: + - "string" + - "null" id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -36,6 +39,7 @@ properties: type: description: The type of connector. type: string - example: .jira + examples: + - .jira enum: - .jira diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_none.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_none.yaml index c1bc49372f645..2497b1357c86c 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_none.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_none.yaml @@ -9,20 +9,25 @@ type: object properties: fields: description: An object containing the connector fields. To create a case without a connector, specify null. To update a case to remove the connector, specify null. - nullable: true - type: string - example: null + type: + - "string" + - "null" + examples: + - null id: description: The identifier for the connector. To create a case without a connector, use `none`. To update a case to remove the connector, specify `none`. type: string - example: none + examples: + - none name: description: The name of the connector. To create a case without a connector, use `none`. To update a case to remove the connector, specify `none`. type: string - example: none + examples: + - none type: description: The type of connector. To create a case without a connector, use `.none`. To update a case to remove the connector, specify `.none`. type: string - example: .none + examples: + - .none enum: - .none \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_resilient.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_resilient.yaml index bf7929b3060e3..df8e34057de0e 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_resilient.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_resilient.yaml @@ -9,8 +9,9 @@ type: object properties: fields: description: An object containing the connector fields. If you want to omit any individual field, specify null as its value. - type: object - nullable: true + type: + - "object" + - "null" required: - issueTypes - severityCode @@ -32,6 +33,7 @@ properties: type: description: The type of connector. type: string - example: .resilient + examples: + - .resilient enum: - .resilient \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow.yaml index 5bc76ab7a9dd1..7a57a9e69ccc2 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow.yaml @@ -19,24 +19,29 @@ properties: properties: category: description: The category of the incident. - type: string - nullable: true + type: + - "string" + - "null" impact: description: The effect an incident had on business. - type: string - nullable: true + type: + - "string" + - "null" severity: description: The severity of the incident. - type: string - nullable: true + type: + - "string" + - "null" subcategory: description: The subcategory of the incident. - type: string - nullable: true + type: + - "string" + - "null" urgency: description: The extent to which the incident resolution can be delayed. - type: string - nullable: true + type: + - "string" + - "null" id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -46,6 +51,7 @@ properties: type: description: The type of connector. type: string - example: .servicenow + examples: + - .servicenow enum: - .servicenow \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow_sir.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow_sir.yaml index 42245f9771e39..cafff746d18f5 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow_sir.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_servicenow_sir.yaml @@ -21,32 +21,39 @@ properties: properties: category: description: The category of the incident. - type: string - nullable: true + type: + - "string" + - "null" destIp: description: Indicates whether cases will send a comma-separated list of destination IPs. - type: boolean - nullable: true + type: + - "boolean" + - "null" malwareHash: description: Indicates whether cases will send a comma-separated list of malware hashes. - type: boolean - nullable: true + type: + - "boolean" + - "null" malwareUrl: description: Indicates whether cases will send a comma-separated list of malware URLs. - type: boolean - nullable: true + type: + - "boolean" + - "null" priority: description: The priority of the issue. - type: string - nullable: true + type: + - "string" + - "null" sourceIp: description: Indicates whether cases will send a comma-separated list of source IPs. - type: boolean - nullable: true + type: + - "boolean" + - "null" subcategory: description: The subcategory of the incident. - type: string - nullable: true + type: + - "string" + - "null" id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -56,6 +63,7 @@ properties: type: description: The type of connector. type: string - example: .servicenow-sir + examples: + - .servicenow-sir enum: - .servicenow-sir \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_swimlane.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_swimlane.yaml index f4c138463078b..9cde6dd09d7c8 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_swimlane.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_properties_swimlane.yaml @@ -15,8 +15,9 @@ properties: properties: caseId: description: The case identifier for Swimlane connectors. - type: string - nullable: true + type: + - "string" + - "null" id: description: The identifier for the connector. To retrieve connector IDs, use the find connectors API. type: string @@ -26,6 +27,7 @@ properties: type: description: The type of connector. type: string - example: .swimlane + examples: + - .swimlane enum: - .swimlane \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_types.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_types.yaml index fc23b9cab5f8a..4bc12b3ae9481 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/connector_types.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/connector_types.yaml @@ -8,4 +8,5 @@ enum: - .servicenow - .servicenow-sir - .swimlane -example: .none \ No newline at end of file +examples: + - .none \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/external_service.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/external_service.yaml index b3b3182b8c964..411f977928a8c 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/external_service.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/external_service.yaml @@ -1,5 +1,6 @@ -type: object -nullable: true +type: + - "object" + - "null" properties: connector_id: type: string @@ -15,7 +16,8 @@ properties: type: string format: date-time pushed_by: - type: object + type: + - "object" + - "null" properties: - $ref: 'user_properties.yaml' - nullable: true \ No newline at end of file + $ref: 'user_properties.yaml' \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/owners.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/owners.yaml index 9036fd5a3833a..fa265756d9506 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/owners.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/owners.yaml @@ -6,4 +6,5 @@ enum: - cases - observability - securitySolution -example: cases \ No newline at end of file +examples: + - cases \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_alert_comment.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_alert_comment.yaml index 0b0d3fc3c07ce..eaaaa539a33ca 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_alert_comment.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_alert_comment.yaml @@ -6,14 +6,16 @@ properties: alertId: oneOf: - type: string - example: 1c0b056b-cc9f-4b61-b5c9-cb801abd5e1d + examples: + - 1c0b056b-cc9f-4b61-b5c9-cb801abd5e1d - type: array items: type: string index: oneOf: - type: string - example: .alerts-observability.logs.alerts-default + examples: + - .alerts-observability.logs.alerts-default - type: array items: type: string diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_create_case.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_create_case.yaml index 4c3043a25c7b8..9bda777bccead 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_create_case.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_create_case.yaml @@ -20,6 +20,7 @@ properties: type: array items: type: string - example: ["tag-1"] + examples: + - ["tag-1"] title: type: string \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_delete.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_delete.yaml index 933d91305dca7..29e16039ec273 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_delete.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_delete.yaml @@ -1,3 +1,4 @@ -type: object -description: If the `action` is `delete` and the `type` is `delete_case`, the payload is nullable. -nullable: true \ No newline at end of file +type: + - "object" + - "null" +description: If the `action` is `delete` and the `type` is `delete_case`, the payload is nullable. \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_tags.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_tags.yaml index bed767719e6f3..8ea6902802514 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/payload_tags.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/payload_tags.yaml @@ -4,4 +4,5 @@ properties: type: array items: type: string - example: ["tag-1"] \ No newline at end of file + examples: + - ["tag-1"] \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/rule.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/rule.yaml index 09712b57ce138..0a4dfb828dcb5 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/rule.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/rule.yaml @@ -10,8 +10,10 @@ properties: id: description: The rule identifier. type: string - example: 94d80550-aaf4-11ec-985f-97e55adae8b9 + examples: + - 94d80550-aaf4-11ec-985f-97e55adae8b9 name: description: The rule name. type: string - example: security_rule \ No newline at end of file + examples: + - security_rule \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/rule_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/rule_properties.yaml index 64b93b77429a4..2ed5e0e89e8d7 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/rule_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/rule_properties.yaml @@ -1,8 +1,10 @@ id: description: The rule identifier. type: string - example: 94d80550-aaf4-11ec-985f-97e55adae8b9 + examples: + - 94d80550-aaf4-11ec-985f-97e55adae8b9 name: description: The rule name. type: string - example: security_rule \ No newline at end of file + examples: + - security_rule \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/settings.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/settings.yaml index a344eb0491951..576b8b9dff157 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/settings.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/settings.yaml @@ -6,4 +6,5 @@ properties: syncAlerts: description: Turns alert syncing on or off. type: boolean - example: true \ No newline at end of file + examples: + - true \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/update_alert_comment_request_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/update_alert_comment_request_properties.yaml index 2c7bd5dcc1215..5c5619cec298a 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/update_alert_comment_request_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/update_alert_comment_request_properties.yaml @@ -17,7 +17,8 @@ properties: description: > The identifier for the comment. To retrieve comment IDs, use the get comments API. - example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 + examples: + - 8af6ac20-74f6-11ea-b83a-553aecdb28b6 index: $ref: 'alert_indices.yaml' owner: @@ -29,10 +30,12 @@ properties: type: string enum: - alert - example: alert + examples: + - alert version: description: > The current comment version. To retrieve version values, use the get comments API. type: string - example: Wzk1LDFd \ No newline at end of file + examples: + - Wzk1LDFd \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml index 86ba2794ea19d..8a6a3aa7f302b 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml @@ -34,4 +34,5 @@ properties: The version of the connector. To retrieve the version value, use the get configuration API. type: string - example: WzIwMiwxXQ== \ No newline at end of file + examples: + - WzIwMiwxXQ== \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/update_user_comment_request_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/update_user_comment_request_properties.yaml index a83050e93eaaf..003f12d63a30d 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/update_user_comment_request_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/update_user_comment_request_properties.yaml @@ -6,13 +6,15 @@ properties: description: The new comment. It is required only when `type` is `user`. type: string maxLength: 30000 - example: A new comment. + examples: + - A new comment. id: type: string description: > The identifier for the comment. To retrieve comment IDs, use the get comments API. - example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 + examples: + - 8af6ac20-74f6-11ea-b83a-553aecdb28b6 owner: $ref: 'owners.yaml' type: @@ -20,13 +22,15 @@ properties: description: The type of comment. enum: - user - example: user + examples: + - user version: description: > The current comment version. To retrieve version values, use the get comments API. type: string - example: Wzk1LDFd + examples: + - Wzk1LDFd required: - comment - id diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_find_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_find_response_properties.yaml index a17f98d8007ad..12b45d987598b 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_find_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_find_response_properties.yaml @@ -13,13 +13,16 @@ properties: action: $ref: 'actions.yaml' comment_id: - type: string - nullable: true - example: 578608d0-03b1-11ed-920c-974bfa104448 + type: + - "string" + - "null" + examples: + - 578608d0-03b1-11ed-920c-974bfa104448 created_at: type: string format: date-time - example: 2022-05-13T09:16:17.416Z + examples: + - 2022-05-13T09:16:17.416Z created_by: type: object properties: @@ -30,7 +33,8 @@ properties: - username id: type: string - example: 22fd3e30-03b1-11ed-920c-974bfa104448 + examples: + - 22fd3e30-03b1-11ed-920c-974bfa104448 owner: $ref: 'owners.yaml' payload: @@ -50,7 +54,8 @@ properties: - $ref: 'payload_user_comment.yaml' version: type: string - example: WzM1ODg4LDFd + examples: + - WzM1ODg4LDFd type: type: string description: The type of action. @@ -66,4 +71,5 @@ properties: - status - settings - severity - example: create_case + examples: + - create_case diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_response_properties.yaml index ef39c531c357d..02521d975d8de 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/user_actions_response_properties.yaml @@ -14,18 +14,23 @@ properties: $ref: 'actions.yaml' action_id: type: string - example: 22fd3e30-03b1-11ed-920c-974bfa104448 + examples: + - 22fd3e30-03b1-11ed-920c-974bfa104448 case_id: type: string - example: 22df07d0-03b1-11ed-920c-974bfa104448 + examples: + - 22df07d0-03b1-11ed-920c-974bfa104448 comment_id: - type: string - nullable: true - example: 578608d0-03b1-11ed-920c-974bfa104448 + type: + - "string" + - "null" + examples: + - 578608d0-03b1-11ed-920c-974bfa104448 created_at: type: string format: date-time - example: 2022-05-13T09:16:17.416Z + examples: + - 2022-05-13T09:16:17.416Z created_by: type: object properties: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/user_comment_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/user_comment_response_properties.yaml index b1727d3279abe..832d603e366dc 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/user_comment_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/user_comment_response_properties.yaml @@ -5,37 +5,46 @@ required: properties: comment: type: string - example: A new comment. + examples: + - A new comment. created_at: type: string format: date-time - example: 2022-05-13T09:16:17.416Z + examples: + - 2022-05-13T09:16:17.416Z created_by: $ref: 'case_response_created_by_properties.yaml' id: type: string - example: 8af6ac20-74f6-11ea-b83a-553aecdb28b6 + examples: + - 8af6ac20-74f6-11ea-b83a-553aecdb28b6 owner: $ref: 'owners.yaml' pushed_at: - type: string + type: + - "string" + - "null" format: date-time - nullable: true - example: null + examples: + - null pushed_by: $ref: 'case_response_pushed_by_properties.yaml' type: type: string - example: user + examples: + - user enum: - user updated_at: - type: string + type: + - "string" + - "null" format: date-time - nullable: true - example: null + examples: + - null updated_by: $ref: 'case_response_updated_by_properties.yaml' version: type: string - example: WzIwNDMxLDFd \ No newline at end of file + examples: + - WzIwNDMxLDFd \ No newline at end of file diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/user_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/user_properties.yaml index 19b76a6000c02..3c5439ac7aeee 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/user_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/user_properties.yaml @@ -1,15 +1,22 @@ email: - type: string - example: null - nullable: true + type: + - "string" + - "null" + examples: + - null full_name: - type: string - example: null - nullable: true -username: - type: string - example: elastic - nullable: true + type: + - "string" + - "null" + examples: + - null profile_uid: type: string - example: u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 + examples: + - u_J41Oh6L9ki-Vo2tOogS8WRTENzhHurGtRc87NgEAlkc_0 +username: + type: + - "string" + - "null" + examples: + - elastic diff --git a/x-pack/plugins/cases/docs/openapi/entrypoint.yaml b/x-pack/plugins/cases/docs/openapi/entrypoint.yaml index 840d49eaa852b..dff3dff43622c 100644 --- a/x-pack/plugins/cases/docs/openapi/entrypoint.yaml +++ b/x-pack/plugins/cases/docs/openapi/entrypoint.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Cases description: OpenAPI schema for Cases endpoints - version: '0.1' + version: '0.2' contact: name: Cases Team license: @@ -90,7 +90,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' security: - basicAuth: [] - apiKeyAuth: [] diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml index 64ff49d17b8cd..7914c8a994c60 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@alerts@{alertid}.yaml @@ -28,7 +28,7 @@ get: title: type: string description: The case title. - example: + examples: - id: 06116b80-e1c3-11ec-be9b-9b1838238ee6 title: security_case '401': diff --git a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml index 321f2f6938c50..8b52cf5d013cd 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/api@cases@{caseid}@connector@{connectorid}@_push.yaml @@ -14,8 +14,9 @@ post: content: application/json: schema: - type: object - nullable: true + type: + - "object" + - "null" responses: '200': description: Indicates a successful call. diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml index f1e287e05d304..0ffe229fd9e69 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@alerts@{alertid}.yaml @@ -28,7 +28,7 @@ get: title: type: string description: The case title. - example: + examples: - id: 06116b80-e1c3-11ec-be9b-9b1838238ee6 title: security_case '401': diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml index bee91522dde29..c06972c8dd0e8 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@connector@{connectorid}@_push.yaml @@ -18,8 +18,9 @@ post: content: application/json: schema: - type: object - nullable: true + type: + - "object" + - "null" responses: '200': description: Indicates a successful call. diff --git a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml index 0b5a6e660da8b..9fda51fa59792 100644 --- a/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml +++ b/x-pack/plugins/cases/docs/openapi/paths/s@{spaceid}@api@cases@{caseid}@user_actions@_find.yaml @@ -11,7 +11,6 @@ get: - $ref: '../components/parameters/case_id.yaml' - $ref: '../components/parameters/space_id.yaml' - $ref: '../components/parameters/page_index.yaml' - example: "1" - $ref: '../components/parameters/page_size.yaml' - $ref: '../components/parameters/sort_order.yaml' - $ref: '../components/parameters/user_action_types.yaml' diff --git a/x-pack/plugins/cases/public/components/all_cases/columns_popover.tsx b/x-pack/plugins/cases/public/components/all_cases/columns_popover.tsx index e95afcc159e98..d16b1f20059a9 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns_popover.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns_popover.tsx @@ -7,6 +7,7 @@ import type { ChangeEvent } from 'react'; import React, { useCallback, useMemo, useState } from 'react'; +import { css } from '@emotion/react'; import type { DropResult } from '@elastic/eui'; @@ -128,7 +129,11 @@ export const ColumnsPopover: React.FC = ({ diff --git a/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx b/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx index ecc9233fc327c..dcec2558aad46 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_actions.test.tsx @@ -43,6 +43,7 @@ describe('useActions', () => { "align": "right", "name": "Actions", "render": [Function], + "width": "100px", }, } `); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx index ea43f79b4954e..70a163bcd69a0 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx @@ -244,6 +244,7 @@ export const useActions = ({ disableActions }: UseBulkActionsProps): UseBulkActi ); }, + width: '100px', } : null, }; diff --git a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.test.tsx b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.test.tsx index b61e7548b089e..0577dcabeb67d 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.test.tsx @@ -90,13 +90,12 @@ describe('useCasesColumns ', () => { "field": "assignees", "name": "Assignees", "render": [Function], - "width": "180px", }, Object { "field": "tags", "name": "Tags", "render": [Function], - "width": "15%", + "width": "12%", }, Object { "align": "right", @@ -110,13 +109,14 @@ describe('useCasesColumns ', () => { "field": "totalComment", "name": "Comments", "render": [Function], + "width": "90px", }, Object { "field": "category", "name": "Category", "render": [Function], "sortable": true, - "width": "100px", + "width": "120px", }, Object { "field": "createdAt", @@ -139,13 +139,13 @@ describe('useCasesColumns ', () => { Object { "name": "External incident", "render": [Function], - "width": undefined, }, Object { "field": "status", "name": "Status", "render": [Function], "sortable": true, + "width": "110px", }, Object { "field": "severity", @@ -158,6 +158,7 @@ describe('useCasesColumns ', () => { "align": "right", "name": "Actions", "render": [Function], + "width": "100px", }, ], "isLoadingColumns": false, @@ -190,13 +191,12 @@ describe('useCasesColumns ', () => { "field": "assignees", "name": "Assignees", "render": [Function], - "width": "180px", }, Object { "field": "tags", "name": "Tags", "render": [Function], - "width": "15%", + "width": "12%", }, Object { "align": "right", @@ -210,13 +210,14 @@ describe('useCasesColumns ', () => { "field": "totalComment", "name": "Comments", "render": [Function], + "width": "90px", }, Object { "field": "category", "name": "Category", "render": [Function], "sortable": true, - "width": "100px", + "width": "120px", }, Object { "field": "createdAt", @@ -233,13 +234,13 @@ describe('useCasesColumns ', () => { Object { "name": "External incident", "render": [Function], - "width": undefined, }, Object { "field": "status", "name": "Status", "render": [Function], "sortable": true, + "width": "110px", }, Object { "field": "severity", @@ -252,6 +253,7 @@ describe('useCasesColumns ', () => { "align": "right", "name": "Actions", "render": [Function], + "width": "100px", }, ], "isLoadingColumns": false, @@ -288,7 +290,7 @@ describe('useCasesColumns ', () => { "name": "Category", "render": [Function], "sortable": true, - "width": "100px", + "width": "120px", }, Object { "field": "createdAt", @@ -336,7 +338,7 @@ describe('useCasesColumns ', () => { "name": "Category", "render": [Function], "sortable": true, - "width": "100px", + "width": "120px", }, Object { "field": "createdAt", @@ -384,7 +386,7 @@ describe('useCasesColumns ', () => { "name": "Category", "render": [Function], "sortable": true, - "width": "100px", + "width": "120px", }, Object { "field": "createdAt", @@ -430,7 +432,7 @@ describe('useCasesColumns ', () => { "field": "tags", "name": "Tags", "render": [Function], - "width": "15%", + "width": "12%", }, Object { "align": "right", @@ -444,13 +446,14 @@ describe('useCasesColumns ', () => { "field": "totalComment", "name": "Comments", "render": [Function], + "width": "90px", }, Object { "field": "category", "name": "Category", "render": [Function], "sortable": true, - "width": "100px", + "width": "120px", }, Object { "field": "createdAt", @@ -467,13 +470,13 @@ describe('useCasesColumns ', () => { Object { "name": "External incident", "render": [Function], - "width": undefined, }, Object { "field": "status", "name": "Status", "render": [Function], "sortable": true, + "width": "110px", }, Object { "field": "severity", @@ -536,7 +539,7 @@ describe('useCasesColumns ', () => { "field": "tags", "name": "Tags", "render": [Function], - "width": "15%", + "width": "12%", }, Object { "align": "right", @@ -550,13 +553,14 @@ describe('useCasesColumns ', () => { "field": "totalComment", "name": "Comments", "render": [Function], + "width": "90px", }, Object { "field": "category", "name": "Category", "render": [Function], "sortable": true, - "width": "100px", + "width": "120px", }, Object { "field": "createdAt", @@ -573,13 +577,13 @@ describe('useCasesColumns ', () => { Object { "name": "External incident", "render": [Function], - "width": undefined, }, Object { "field": "status", "name": "Status", "render": [Function], "sortable": true, + "width": "110px", }, Object { "field": "severity", diff --git a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx index 6ef5dcae9fe6b..de053bfb27fab 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx @@ -137,7 +137,6 @@ export const useCasesColumns = ({ render: (assignees: CaseUI['assignees']) => ( ), - width: '180px', }, tags: { field: casesColumnsConfig.tags.field, @@ -184,7 +183,7 @@ export const useCasesColumns = ({ } return getEmptyCellValue(); }, - width: '15%', + width: '12%', }, totalAlerts: { field: casesColumnsConfig.totalAlerts.field, @@ -204,6 +203,7 @@ export const useCasesColumns = ({ totalComment != null ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) : getEmptyCellValue(), + width: '90px', }, category: { field: casesColumnsConfig.category.field, @@ -217,7 +217,7 @@ export const useCasesColumns = ({ } return getEmptyCellValue(); }, - width: '100px', + width: '120px', }, closedAt: { field: casesColumnsConfig.closedAt.field, @@ -273,7 +273,6 @@ export const useCasesColumns = ({ } return getEmptyCellValue(); }, - width: isSelectorView ? '80px' : undefined, }, status: { field: casesColumnsConfig.status.field, @@ -286,6 +285,7 @@ export const useCasesColumns = ({ return getEmptyCellValue(); }, + width: '110px', }, severity: { field: casesColumnsConfig.severity.field, diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx index d648fc2b6faee..5d9a6836f6e51 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx @@ -134,7 +134,8 @@ const useGetCaseUsersMock = useGetCaseUsers as jest.Mock; const useOnUpdateFieldMock = useOnUpdateField as jest.Mock; const useCasesFeaturesMock = useCasesFeatures as jest.Mock; -describe('Case View Page activity tab', () => { +// FLAKY: https://github.com/elastic/kibana/issues/171575 +describe.skip('Case View Page activity tab', () => { const caseConnectors = getCaseConnectorsMockResponse(); beforeAll(() => { diff --git a/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.test.tsx b/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.test.tsx index f9b913af4d429..b7c87f3356d38 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.test.tsx +++ b/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.test.tsx @@ -37,11 +37,21 @@ describe('CustomFieldsList', () => { it('shows CustomFieldsList correctly', async () => { appMockRender.render(); - expect(screen.getByTestId('custom-fields-list')).toBeInTheDocument(); + expect(await screen.findByTestId('custom-fields-list')).toBeInTheDocument(); - for (const field of customFieldsConfigurationMock) { - expect(screen.getByTestId(`custom-field-${field.key}-${field.type}`)).toBeInTheDocument(); - } + expect( + await screen.findByTestId( + `custom-field-${customFieldsConfigurationMock[0].key}-${customFieldsConfigurationMock[0].type}` + ) + ).toBeInTheDocument(); + expect(await screen.findByText('Text')).toBeInTheDocument(); + expect(await screen.findByText('Required')).toBeInTheDocument(); + expect( + await screen.findByTestId( + `custom-field-${customFieldsConfigurationMock[1].key}-${customFieldsConfigurationMock[1].type}` + ) + ).toBeInTheDocument(); + expect(await screen.findByText('Toggle')).toBeInTheDocument(); }); it('shows single CustomFieldsList correctly', async () => { @@ -49,16 +59,21 @@ describe('CustomFieldsList', () => { ); - const list = screen.getByTestId('custom-fields-list'); + const list = await screen.findByTestId('custom-fields-list'); expect(list).toBeInTheDocument(); expect( - screen.getByTestId( + await screen.findByTestId( `custom-field-${customFieldsConfigurationMock[0].key}-${customFieldsConfigurationMock[0].type}` ) ).toBeInTheDocument(); + expect(await screen.findByText('Text')).toBeInTheDocument(); + expect(await screen.findByText('Required')).toBeInTheDocument(); + expect( + await within(list).findByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-edit`) + ).toBeInTheDocument(); expect( - within(list).getByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-delete`) + await within(list).findByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-delete`) ).toBeInTheDocument(); }); @@ -76,10 +91,12 @@ describe('CustomFieldsList', () => { it('shows confirmation modal when deleting a field ', async () => { appMockRender.render(); - const list = screen.getByTestId('custom-fields-list'); + const list = await screen.findByTestId('custom-fields-list'); userEvent.click( - within(list).getByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-delete`) + await within(list).findByTestId( + `${customFieldsConfigurationMock[0].key}-custom-field-delete` + ) ); expect(await screen.findByTestId('confirm-delete-custom-field-modal')).toBeInTheDocument(); @@ -88,15 +105,17 @@ describe('CustomFieldsList', () => { it('calls onDeleteCustomField when confirm', async () => { appMockRender.render(); - const list = screen.getByTestId('custom-fields-list'); + const list = await screen.findByTestId('custom-fields-list'); userEvent.click( - within(list).getByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-delete`) + await within(list).findByTestId( + `${customFieldsConfigurationMock[0].key}-custom-field-delete` + ) ); expect(await screen.findByTestId('confirm-delete-custom-field-modal')).toBeInTheDocument(); - userEvent.click(screen.getByText('Delete')); + userEvent.click(await screen.findByText('Delete')); await waitFor(() => { expect(screen.queryByTestId('confirm-delete-custom-field-modal')).not.toBeInTheDocument(); @@ -109,15 +128,17 @@ describe('CustomFieldsList', () => { it('does not call onDeleteCustomField when cancel', async () => { appMockRender.render(); - const list = screen.getByTestId('custom-fields-list'); + const list = await screen.findByTestId('custom-fields-list'); userEvent.click( - within(list).getByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-delete`) + await within(list).findByTestId( + `${customFieldsConfigurationMock[0].key}-custom-field-delete` + ) ); expect(await screen.findByTestId('confirm-delete-custom-field-modal')).toBeInTheDocument(); - userEvent.click(screen.getByText('Cancel')); + userEvent.click(await screen.findByText('Cancel')); await waitFor(() => { expect(screen.queryByTestId('confirm-delete-custom-field-modal')).not.toBeInTheDocument(); @@ -134,10 +155,10 @@ describe('CustomFieldsList', () => { it('calls onEditCustomField correctly', async () => { appMockRender.render(); - const list = screen.getByTestId('custom-fields-list'); + const list = await screen.findByTestId('custom-fields-list'); userEvent.click( - within(list).getByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-edit`) + await within(list).findByTestId(`${customFieldsConfigurationMock[0].key}-custom-field-edit`) ); await waitFor(() => { diff --git a/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx b/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx index 649b0ec5d339f..cfccb53e48db3 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx +++ b/x-pack/plugins/cases/public/components/custom_fields/custom_fields_list/index.tsx @@ -13,7 +13,10 @@ import { EuiSpacer, EuiText, EuiButtonIcon, + useEuiTheme, + EuiBadge, } from '@elastic/eui'; +import * as i18n from '../translations'; import type { CustomFieldTypes, CustomFieldsConfiguration } from '../../../../common/types/domain'; import { builderMap } from '../builder'; @@ -28,6 +31,7 @@ export interface Props { const CustomFieldsListComponent: React.FC = (props) => { const { customFields, onDeleteCustomField, onEditCustomField } = props; const [selectedItem, setSelectedItem] = useState(null); + const { euiTheme } = useEuiTheme(); const renderTypeLabel = (type?: CustomFieldTypes) => { const createdBuilder = type && builderMap[type]; @@ -69,7 +73,12 @@ const CustomFieldsListComponent: React.FC = (props) => {

    {customField.label}

    - {renderTypeLabel(customField.type)} + + {renderTypeLabel(customField.type)} + + {customField.required && ( + {i18n.REQUIRED} + )}
    diff --git a/x-pack/plugins/cases/public/components/custom_fields/translations.ts b/x-pack/plugins/cases/public/components/custom_fields/translations.ts index ac7f99f191373..a5ac6da2fa5f3 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/translations.ts +++ b/x-pack/plugins/cases/public/components/custom_fields/translations.ts @@ -66,6 +66,10 @@ export const FIELD_OPTION_REQUIRED = i18n.translate( } ); +export const REQUIRED = i18n.translate('xpack.cases.customFields.required', { + defaultMessage: 'Required', +}); + export const REQUIRED_FIELD = (fieldName: string): string => i18n.translate('xpack.cases.customFields.requiredField', { values: { fieldName }, diff --git a/x-pack/plugins/cloud/public/plugin.test.ts b/x-pack/plugins/cloud/public/plugin.test.ts index 3709dd7cfcb95..99e6f97946cca 100644 --- a/x-pack/plugins/cloud/public/plugin.test.ts +++ b/x-pack/plugins/cloud/public/plugin.test.ts @@ -197,8 +197,10 @@ describe('Cloud Plugin', () => { return { coreSetup, plugin }; }; - it('registers help support URL', async () => { - const { plugin } = startPlugin(); + it('registers help support URL: default', async () => { + const { plugin } = startPlugin({ + id: undefined, + }); const coreStart = coreMock.createStart(); plugin.start(coreStart); @@ -211,6 +213,41 @@ describe('Cloud Plugin', () => { `); }); + it('registers help support URL: serverless projects', async () => { + const { plugin } = startPlugin({ + id: 'my-awesome-project-id', + serverless: { + project_id: 'my-awesome-serverless-project-id', + }, + }); + + const coreStart = coreMock.createStart(); + plugin.start(coreStart); + + expect(coreStart.chrome.setHelpSupportUrl).toHaveBeenCalledTimes(1); + expect(coreStart.chrome.setHelpSupportUrl.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "https://support.elastic.co/?serverless_project_id=my-awesome-serverless-project-id", + ] + `); + }); + + it('registers help support URL: non-serverless projects', async () => { + const { plugin } = startPlugin({ + id: 'my-awesome-project-id', + }); + + const coreStart = coreMock.createStart(); + plugin.start(coreStart); + + expect(coreStart.chrome.setHelpSupportUrl).toHaveBeenCalledTimes(1); + expect(coreStart.chrome.setHelpSupportUrl.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "https://support.elastic.co/?cloud_deployment_id=my-awesome-project-id", + ] + `); + }); + describe('isServerlessEnabled', () => { it('is `true` when `serverless.projectId` is set', () => { const { plugin } = startPlugin({ diff --git a/x-pack/plugins/cloud/public/plugin.tsx b/x-pack/plugins/cloud/public/plugin.tsx index 3aaaf8f14fe27..f0e7b8f713e80 100644 --- a/x-pack/plugins/cloud/public/plugin.tsx +++ b/x-pack/plugins/cloud/public/plugin.tsx @@ -11,10 +11,11 @@ import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kb import { registerCloudDeploymentMetadataAnalyticsContext } from '../common/register_cloud_deployment_id_analytics_context'; import { getIsCloudEnabled } from '../common/is_cloud_enabled'; import { parseDeploymentIdFromDeploymentUrl } from '../common/parse_deployment_id_from_deployment_url'; -import { ELASTIC_SUPPORT_LINK, CLOUD_SNAPSHOTS_PATH } from '../common/constants'; +import { CLOUD_SNAPSHOTS_PATH } from '../common/constants'; import { decodeCloudId, type DecodedCloudId } from '../common/decode_cloud_id'; import type { CloudSetup, CloudStart } from './types'; import { getFullCloudUrl } from '../common/utils'; +import { getSupportUrl } from './utils'; export interface CloudConfigType { id?: string; @@ -103,7 +104,7 @@ export class CloudPlugin implements Plugin { } public start(coreStart: CoreStart): CloudStart { - coreStart.chrome.setHelpSupportUrl(ELASTIC_SUPPORT_LINK); + coreStart.chrome.setHelpSupportUrl(getSupportUrl(this.config)); // Nest all the registered context providers under the Cloud Services Provider. // This way, plugins only need to require Cloud's context provider to have all the enriched Cloud services. diff --git a/x-pack/plugins/cloud/public/utils.ts b/x-pack/plugins/cloud/public/utils.ts new file mode 100644 index 0000000000000..d2381c428fe0a --- /dev/null +++ b/x-pack/plugins/cloud/public/utils.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ELASTIC_SUPPORT_LINK } from '../common/constants'; +import { CloudConfigType } from './plugin'; + +export function getSupportUrl(config: CloudConfigType): string { + let supportUrl = ELASTIC_SUPPORT_LINK; + if (config.serverless?.project_id) { + // serverless projects use config.id and config.serverless.project_id + supportUrl += '?serverless_project_id=' + config.serverless.project_id; + } else if (config.id) { + // non-serverless Cloud projects only use config.id + supportUrl += '?cloud_deployment_id=' + config.id; + } + return supportUrl; +} diff --git a/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.test.ts b/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.test.ts index 836cafa8ac7af..b0abbbe568d21 100644 --- a/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.test.ts +++ b/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.test.ts @@ -6,9 +6,9 @@ */ import { coreMock } from '@kbn/core/public/mocks'; -import type { CloudFullStoryConfigType } from '../server/config'; -import { CloudFullStoryPlugin } from './plugin'; import { cloudMock } from '@kbn/cloud-plugin/public/mocks'; +import { duration } from 'moment'; +import { CloudFullStoryConfig, CloudFullStoryPlugin } from './plugin'; describe('Cloud Plugin', () => { describe('#setup', () => { @@ -22,7 +22,7 @@ describe('Cloud Plugin', () => { isCloudEnabled = true, isElasticStaffOwned = false, }: { - config?: Partial; + config?: Partial; isCloudEnabled?: boolean; isElasticStaffOwned?: boolean; }) => { @@ -55,6 +55,20 @@ describe('Cloud Plugin', () => { }); }); + test('register the shipper FullStory with the correct duration', async () => { + const { coreSetup } = await setupPlugin({ + config: { org_id: 'foo', pageVarsDebounceTime: `${duration(500, 'ms')}` }, + }); + + expect(coreSetup.analytics.registerShipper).toHaveBeenCalled(); + expect(coreSetup.analytics.registerShipper).toHaveBeenCalledWith(expect.anything(), { + fullStoryOrgId: 'foo', + pageVarsDebounceTimeMs: 500, + scriptUrl: '/internal/cloud/100/fullstory.js', + namespace: 'FSKibana', + }); + }); + it('does not call initializeFullStory when isCloudEnabled=false', async () => { const { coreSetup } = await setupPlugin({ config: { org_id: 'foo' }, diff --git a/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.ts b/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.ts index a248b27f93714..7636d38b681e1 100755 --- a/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.ts +++ b/x-pack/plugins/cloud_integrations/cloud_full_story/public/plugin.ts @@ -13,15 +13,17 @@ import type { Plugin, } from '@kbn/core/public'; import type { CloudSetup } from '@kbn/cloud-plugin/public'; +import { duration } from 'moment'; interface SetupFullStoryDeps { analytics: AnalyticsServiceSetup; basePath: IBasePath; } -interface CloudFullStoryConfig { +export interface CloudFullStoryConfig { org_id?: string; eventTypesAllowlist: string[]; + pageVarsDebounceTime: string; } interface CloudFullStorySetupDeps { @@ -61,7 +63,7 @@ export class CloudFullStoryPlugin implements Plugin { * @private */ private async setupFullStory({ analytics, basePath }: SetupFullStoryDeps) { - const { org_id: fullStoryOrgId, eventTypesAllowlist } = this.config; + const { org_id: fullStoryOrgId, eventTypesAllowlist, pageVarsDebounceTime } = this.config; if (!fullStoryOrgId) { return; // do not load any FullStory code in the browser if not enabled } @@ -71,6 +73,10 @@ export class CloudFullStoryPlugin implements Plugin { analytics.registerShipper(FullStoryShipper, { eventTypesAllowlist, fullStoryOrgId, + // Duration configs get stringified when forwarded to the UI and need reconversion + ...(pageVarsDebounceTime + ? { pageVarsDebounceTimeMs: duration(pageVarsDebounceTime).asMilliseconds() } + : {}), // Load an Elastic-internally audited script. Ideally, it should be hosted on a CDN. scriptUrl: basePath.prepend( `/internal/cloud/${this.initializerContext.env.packageInfo.buildNum}/fullstory.js` diff --git a/x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts b/x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts index 85822bae819eb..8c6eb180f1db6 100644 --- a/x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts +++ b/x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @@ -26,6 +26,7 @@ const configSchema = schema.object({ 'Host Flyout Filter Added', // Worst-case scenario once per second - AT RISK, ], }), + pageVarsDebounceTime: schema.duration({ defaultValue: '500ms' }), }); export type CloudFullStoryConfigType = TypeOf; @@ -34,6 +35,7 @@ export const config: PluginConfigDescriptor = { exposeToBrowser: { org_id: true, eventTypesAllowlist: true, + pageVarsDebounceTime: true, }, schema: configSchema, deprecations: () => [ diff --git a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/endpoints_modal.tsx b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/connection_details_modal.tsx similarity index 91% rename from x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/endpoints_modal.tsx rename to x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/connection_details_modal.tsx index 7c6b23d352f1a..d7be45e1db244 100644 --- a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/endpoints_modal.tsx +++ b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/connection_details_modal.tsx @@ -22,7 +22,7 @@ interface Props { share: SharePluginStart; } -export const EndpointsModal = ({ core, share, cloud, docLinks, closeModal }: Props) => { +export const ConnectionDetailsModal = ({ core, share, cloud, docLinks, closeModal }: Props) => { return ( diff --git a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx index 15270c5876214..05ea7b9ce30cd 100644 --- a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx +++ b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/help_menu_links.tsx @@ -13,7 +13,7 @@ import type { CloudStart } from '@kbn/cloud-plugin/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import { toMountPoint } from '@kbn/react-kibana-mount'; -import { EndpointsModal } from './endpoints_modal'; +import { ConnectionDetailsModal } from './connection_details_modal'; export const createHelpMenuLinks = ({ docLinks, @@ -50,15 +50,15 @@ export const createHelpMenuLinks = ({ href: docLinks.links.kibana.feedback, }, { - title: i18n.translate('xpack.cloudLinks.helpMenuLinks.endpoints', { - defaultMessage: 'Endpoints', + title: i18n.translate('xpack.cloudLinks.helpMenuLinks.connectionDetails', { + defaultMessage: 'Connection details', }), iconType: 'console', - dataTestSubj: 'endpointsHelpLink', + dataTestSubj: 'connectionDetailsHelpLink', onClick: () => { const modal = overlays.openModal( toMountPoint( - { "title": "Give feedback", }, Object { - "dataTestSubj": "endpointsHelpLink", + "dataTestSubj": "connectionDetailsHelpLink", "iconType": "console", "onClick": [Function], - "title": "Endpoints", + "title": "Connection details", }, ], ] @@ -168,10 +168,10 @@ describe('maybeAddCloudLinks', () => { "title": "Give feedback", }, Object { - "dataTestSubj": "endpointsHelpLink", + "dataTestSubj": "connectionDetailsHelpLink", "iconType": "console", "onClick": [Function], - "title": "Endpoints", + "title": "Connection details", }, ], ] diff --git a/x-pack/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx b/x-pack/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx index 644455e5a2a68..a2d8f4fe32c0b 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/subscription_not_allowed.tsx @@ -6,15 +6,8 @@ */ import React from 'react'; -import { EuiEmptyPrompt, EuiPageSection } from '@elastic/eui'; +import { EuiEmptyPrompt, EuiLink, EuiPageSection } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { SubscriptionLink } from '@kbn/subscription-tracking'; -import type { SubscriptionContextData } from '@kbn/subscription-tracking'; - -const subscriptionContext: SubscriptionContextData = { - feature: 'cloud-security-posture', - source: 'security__cloud-security-posture', -}; export const SubscriptionNotAllowed = ({ licenseManagementLocator, @@ -41,12 +34,12 @@ export const SubscriptionNotAllowed = ({ defaultMessage="To use these cloud security features, you must {link}." values={{ link: ( - + - +
    ), }} /> diff --git a/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx b/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx index 3f89c934e5dd4..bdccb07851629 100755 --- a/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx +++ b/x-pack/plugins/cloud_security_posture/public/test/test_provider.tsx @@ -11,7 +11,6 @@ import { I18nProvider } from '@kbn/i18n-react'; // eslint-disable-next-line no-restricted-imports import { Router } from 'react-router-dom'; import { Route, Routes } from '@kbn/shared-ux-router'; -import { MockSubscriptionTrackingProvider } from '@kbn/subscription-tracking/mocks'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { coreMock } from '@kbn/core/public/mocks'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; @@ -52,11 +51,9 @@ export const TestProvider: React.FC> = ({ - - - <>{children}} /> - - + + <>{children}} /> + diff --git a/x-pack/plugins/cloud_security_posture/server/lib/check_index_status.ts b/x-pack/plugins/cloud_security_posture/server/lib/check_index_status.ts index 95dca041521e0..ebce74d89b2dc 100644 --- a/x-pack/plugins/cloud_security_posture/server/lib/check_index_status.ts +++ b/x-pack/plugins/cloud_security_posture/server/lib/check_index_status.ts @@ -9,25 +9,45 @@ import { ElasticsearchClient, type Logger } from '@kbn/core/server'; import { getSafePostureTypeRuntimeMapping } from '../../common/runtime_mappings/get_safe_posture_type_runtime_mapping'; import { IndexStatus, PostureTypes } from '../../common/types'; +export interface PostureTypeAndRetention { + postureType?: PostureTypes; + retentionTime?: string; +} + export const checkIndexStatus = async ( esClient: ElasticsearchClient, index: string, logger: Logger, - postureType?: PostureTypes + PostureTypeAndRetention?: PostureTypeAndRetention ): Promise => { - const query = - !postureType || postureType === 'all' || postureType === 'vuln_mgmt' - ? undefined - : { - bool: { - filter: { - term: { - safe_posture_type: postureType, + const isNotKspmOrCspm = + !PostureTypeAndRetention?.postureType || + PostureTypeAndRetention?.postureType === 'all' || + PostureTypeAndRetention?.postureType === 'vuln_mgmt'; + + const query = { + bool: { + filter: [ + ...(isNotKspmOrCspm + ? [] + : [ + { + term: { + safe_posture_type: PostureTypeAndRetention?.postureType, + }, }, + ]), + { + range: { + '@timestamp': { + gte: `now-${PostureTypeAndRetention?.retentionTime}`, + lte: 'now', }, }, - }; - + }, + ], + }, + }; try { const queryResult = await esClient.search({ index, @@ -37,7 +57,6 @@ export const checkIndexStatus = async ( query, size: 1, }); - return queryResult.hits.hits.length ? 'not-empty' : 'empty'; } catch (e) { logger.debug(e); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/status/status.ts b/x-pack/plugins/cloud_security_posture/server/routes/status/status.ts index 86b0d0a66802b..ed3bcd99746fc 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/status/status.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/status/status.ts @@ -29,6 +29,9 @@ import { POSTURE_TYPES, LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, VULN_MGMT_POLICY_TEMPLATE, + POSTURE_TYPE_ALL, + LATEST_VULNERABILITIES_RETENTION_POLICY, + LATEST_FINDINGS_RETENTION_POLICY, } from '../../../common/constants'; import type { CspApiRequestHandlerContext, @@ -168,20 +171,53 @@ export const getCspStatus = async ({ installedPackagePoliciesVulnMgmt, installedPolicyTemplates, ] = await Promise.all([ - checkIndexStatus(esClient, LATEST_FINDINGS_INDEX_DEFAULT_NS, logger), - checkIndexStatus(esClient, FINDINGS_INDEX_PATTERN, logger), - checkIndexStatus(esClient, BENCHMARK_SCORE_INDEX_DEFAULT_NS, logger), - - checkIndexStatus(esClient, LATEST_FINDINGS_INDEX_DEFAULT_NS, logger, 'cspm'), - checkIndexStatus(esClient, FINDINGS_INDEX_PATTERN, logger, 'cspm'), - checkIndexStatus(esClient, BENCHMARK_SCORE_INDEX_DEFAULT_NS, logger, 'cspm'), - - checkIndexStatus(esClient, LATEST_FINDINGS_INDEX_DEFAULT_NS, logger, 'kspm'), - checkIndexStatus(esClient, FINDINGS_INDEX_PATTERN, logger, 'kspm'), - checkIndexStatus(esClient, BENCHMARK_SCORE_INDEX_DEFAULT_NS, logger, 'kspm'), - - checkIndexStatus(esClient, LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, logger), - checkIndexStatus(esClient, VULNERABILITIES_INDEX_PATTERN, logger, VULN_MGMT_POLICY_TEMPLATE), + checkIndexStatus(esClient, LATEST_FINDINGS_INDEX_DEFAULT_NS, logger, { + postureType: POSTURE_TYPE_ALL, + retentionTime: LATEST_VULNERABILITIES_RETENTION_POLICY, + }), + checkIndexStatus(esClient, FINDINGS_INDEX_PATTERN, logger, { + postureType: POSTURE_TYPE_ALL, + retentionTime: LATEST_VULNERABILITIES_RETENTION_POLICY, + }), + checkIndexStatus(esClient, BENCHMARK_SCORE_INDEX_DEFAULT_NS, logger, { + postureType: POSTURE_TYPE_ALL, + retentionTime: LATEST_VULNERABILITIES_RETENTION_POLICY, + }), + + checkIndexStatus(esClient, LATEST_FINDINGS_INDEX_DEFAULT_NS, logger, { + postureType: CSPM_POLICY_TEMPLATE, + retentionTime: LATEST_FINDINGS_RETENTION_POLICY, + }), + checkIndexStatus(esClient, FINDINGS_INDEX_PATTERN, logger, { + postureType: CSPM_POLICY_TEMPLATE, + retentionTime: LATEST_FINDINGS_RETENTION_POLICY, + }), + checkIndexStatus(esClient, BENCHMARK_SCORE_INDEX_DEFAULT_NS, logger, { + postureType: CSPM_POLICY_TEMPLATE, + retentionTime: LATEST_FINDINGS_RETENTION_POLICY, + }), + + checkIndexStatus(esClient, LATEST_FINDINGS_INDEX_DEFAULT_NS, logger, { + postureType: KSPM_POLICY_TEMPLATE, + retentionTime: LATEST_FINDINGS_RETENTION_POLICY, + }), + checkIndexStatus(esClient, FINDINGS_INDEX_PATTERN, logger, { + postureType: KSPM_POLICY_TEMPLATE, + retentionTime: LATEST_FINDINGS_RETENTION_POLICY, + }), + checkIndexStatus(esClient, BENCHMARK_SCORE_INDEX_DEFAULT_NS, logger, { + postureType: KSPM_POLICY_TEMPLATE, + retentionTime: LATEST_FINDINGS_RETENTION_POLICY, + }), + + checkIndexStatus(esClient, LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, logger, { + postureType: VULN_MGMT_POLICY_TEMPLATE, + retentionTime: LATEST_VULNERABILITIES_RETENTION_POLICY, + }), + checkIndexStatus(esClient, VULNERABILITIES_INDEX_PATTERN, logger, { + postureType: VULN_MGMT_POLICY_TEMPLATE, + retentionTime: LATEST_VULNERABILITIES_RETENTION_POLICY, + }), packageService.asInternalUser.getInstallation(CLOUD_SECURITY_POSTURE_PACKAGE_NAME), packageService.asInternalUser.fetchFindLatestPackage(CLOUD_SECURITY_POSTURE_PACKAGE_NAME), @@ -295,6 +331,7 @@ export const getCspStatus = async ({ { latest: vulnerabilitiesLatestIndexStatus, stream: vulnerabilitiesIndexStatus, + score: scoreIndexStatus, }, installation, healthyAgentsVulMgmt, diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/plugins/cloud_security_posture/tsconfig.json index 113ddcb92202a..0d70ed5c6be6c 100755 --- a/x-pack/plugins/cloud_security_posture/tsconfig.json +++ b/x-pack/plugins/cloud_security_posture/tsconfig.json @@ -50,7 +50,6 @@ "@kbn/share-plugin", "@kbn/core-http-server", "@kbn/core-http-browser", - "@kbn/subscription-tracking", "@kbn/discover-utils", "@kbn/unified-data-table", "@kbn/cell-actions", diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js index e020950668a84..536c188b48369 100644 --- a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js @@ -309,8 +309,7 @@ describe('', () => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/100951 - describe.skip('detail panel', () => { + describe('detail panel', () => { test('should open a detail panel when clicking on a follower index', async () => { expect(exists('followerIndexDetail')).toBe(false); @@ -372,7 +371,8 @@ describe('', () => { ); }); - test('should have a section to render the follower index shards stats', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/100951 + test.skip('should have a section to render the follower index shards stats', async () => { await actions.clickFollowerIndexAt(0); expect(exists('followerIndexDetail.shardsStatsSection')).toBe(true); diff --git a/x-pack/plugins/dataset_quality/common/constants.ts b/x-pack/plugins/dataset_quality/common/constants.ts new file mode 100644 index 0000000000000..febb7d2a0f9f2 --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/constants.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const DATASET_QUALITY_APP_ID = 'dataset_quality'; +export const DATA_STREAMS_STATS_URL = '/internal/dataset_quality/data_streams/stats'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/index_pattern_prompt/index.ts b/x-pack/plugins/dataset_quality/common/data_streams/index.ts similarity index 80% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/index_pattern_prompt/index.ts rename to x-pack/plugins/dataset_quality/common/data_streams/index.ts index e78ffe1c9086a..6cc0ccaa93a6d 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/index_pattern_prompt/index.ts +++ b/x-pack/plugins/dataset_quality/common/data_streams/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { IndexPatternPrompt } from './index_pattern_prompt'; +export * from './types'; diff --git a/x-pack/plugins/dataset_quality/server/types/api_types.ts b/x-pack/plugins/dataset_quality/common/data_streams/types.ts similarity index 82% rename from x-pack/plugins/dataset_quality/server/types/api_types.ts rename to x-pack/plugins/dataset_quality/common/data_streams/types.ts index 077cb94aa3493..1a47a0d7e5ac6 100644 --- a/x-pack/plugins/dataset_quality/server/types/api_types.ts +++ b/x-pack/plugins/dataset_quality/common/data_streams/types.ts @@ -16,7 +16,3 @@ export const dataStreamTypesRt = t.partial({ t.literal('profiling'), ]), }); - -export const sortOrderRt = t.type({ - sortOrder: t.union([t.literal('asc'), t.literal('desc')]), -}); diff --git a/x-pack/plugins/dataset_quality/common/data_streams_stats/data_stream_stat.ts b/x-pack/plugins/dataset_quality/common/data_streams_stats/data_stream_stat.ts new file mode 100644 index 0000000000000..5fd2a2ffc1ffc --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/data_streams_stats/data_stream_stat.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 { Integration } from './integration'; +import { DataStreamStatType, IntegrationType } from './types'; + +export class DataStreamStat { + name: DataStreamStatType['name']; + title: string; + size?: DataStreamStatType['size']; + sizeBytes?: DataStreamStatType['size_bytes']; + lastActivity?: DataStreamStatType['last_activity']; + integration?: IntegrationType; + + private constructor(dataStreamStat: DataStreamStat) { + this.name = dataStreamStat.name; + this.title = dataStreamStat.title ?? dataStreamStat.name; + this.size = dataStreamStat.size; + this.sizeBytes = dataStreamStat.sizeBytes; + this.lastActivity = dataStreamStat.lastActivity; + this.integration = dataStreamStat.integration; + } + + public static create(dataStreamStat: DataStreamStatType) { + const [_type, dataset, namespace] = dataStreamStat.name.split('-'); + + const dataStreamStatProps = { + name: dataStreamStat.name, + title: `${dataset}-${namespace}`, + size: dataStreamStat.size, + sizeBytes: dataStreamStat.size_bytes, + lastActivity: dataStreamStat.last_activity, + integration: dataStreamStat.integration + ? Integration.create(dataStreamStat.integration) + : undefined, + }; + + return new DataStreamStat(dataStreamStatProps); + } +} diff --git a/x-pack/plugins/dataset_quality/common/data_streams_stats/errors.ts b/x-pack/plugins/dataset_quality/common/data_streams_stats/errors.ts new file mode 100644 index 0000000000000..de47f4cb8c39d --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/data_streams_stats/errors.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export class GetDataStreamsStatsError extends Error { + constructor(message: string) { + super(message); + Object.setPrototypeOf(this, new.target.prototype); + this.name = 'GetDataStreamsStatsError'; + } +} diff --git a/x-pack/plugins/dataset_quality/common/data_streams_stats/index.ts b/x-pack/plugins/dataset_quality/common/data_streams_stats/index.ts new file mode 100644 index 0000000000000..28c7b0a8c274f --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/data_streams_stats/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './types'; +export * from './errors'; diff --git a/x-pack/plugins/dataset_quality/common/data_streams_stats/integration.ts b/x-pack/plugins/dataset_quality/common/data_streams_stats/integration.ts new file mode 100644 index 0000000000000..937efd407e6fc --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/data_streams_stats/integration.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IntegrationType } from './types'; + +export class Integration { + name: IntegrationType['name']; + title: IntegrationType['title']; + version: IntegrationType['version']; + icons?: IntegrationType['icons']; + + private constructor(integration: Integration) { + this.name = integration.name; + this.title = integration.title || integration.name; + this.version = integration.version || '1.0.0'; + this.icons = integration.icons; + } + + public static create(integration: IntegrationType) { + const integrationProps = { + ...integration, + title: integration.title || integration.name, + version: integration.version || '1.0.0', + }; + + return new Integration(integrationProps); + } +} diff --git a/x-pack/plugins/dataset_quality/common/data_streams_stats/types.ts b/x-pack/plugins/dataset_quality/common/data_streams_stats/types.ts new file mode 100644 index 0000000000000..f9a202798fb37 --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/data_streams_stats/types.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 { APIClientRequestParamsOf, APIReturnType } from '../rest/create_call_dataset_quality_api'; +import { DataStreamStat } from './data_stream_stat'; + +export type GetDataStreamsStatsParams = + APIClientRequestParamsOf<`GET /internal/dataset_quality/data_streams/stats`>['params']; +export type GetDataStreamsStatsQuery = GetDataStreamsStatsParams['query']; +export type GetDataStreamsStatsResponse = + APIReturnType<`GET /internal/dataset_quality/data_streams/stats`>; +export type DataStreamStatServiceResponse = DataStreamStat[]; +export type DataStreamStatType = GetDataStreamsStatsResponse['dataStreamsStats'][0]; +export type IntegrationType = GetDataStreamsStatsResponse['integrations'][0]; diff --git a/x-pack/plugins/dataset_quality/common/index.ts b/x-pack/plugins/dataset_quality/common/index.ts index 2022b51685043..b015815eeaacc 100644 --- a/x-pack/plugins/dataset_quality/common/index.ts +++ b/x-pack/plugins/dataset_quality/common/index.ts @@ -7,3 +7,4 @@ export type { DatasetQualityConfig } from './plugin_config'; export type { FetchOptions } from './fetch_options'; +export type { APIClientRequestParamsOf, APIReturnType } from './rest'; diff --git a/x-pack/plugins/dataset_quality/public/services/rest/call_api.ts b/x-pack/plugins/dataset_quality/common/rest/call_api.ts similarity index 95% rename from x-pack/plugins/dataset_quality/public/services/rest/call_api.ts rename to x-pack/plugins/dataset_quality/common/rest/call_api.ts index 1b39bfc905730..a70e2f8d407e5 100644 --- a/x-pack/plugins/dataset_quality/public/services/rest/call_api.ts +++ b/x-pack/plugins/dataset_quality/common/rest/call_api.ts @@ -6,7 +6,7 @@ */ import { CoreSetup, CoreStart } from '@kbn/core/public'; -import { FetchOptions } from '../../../common'; +import { FetchOptions } from '..'; function getFetchOptions(fetchOptions: FetchOptions) { const { body, ...rest } = fetchOptions; diff --git a/x-pack/plugins/dataset_quality/public/services/rest/create_call_dataset_quality_api.ts b/x-pack/plugins/dataset_quality/common/rest/create_call_dataset_quality_api.ts similarity index 96% rename from x-pack/plugins/dataset_quality/public/services/rest/create_call_dataset_quality_api.ts rename to x-pack/plugins/dataset_quality/common/rest/create_call_dataset_quality_api.ts index 47d04b309817f..8e3929bb77e74 100644 --- a/x-pack/plugins/dataset_quality/public/services/rest/create_call_dataset_quality_api.ts +++ b/x-pack/plugins/dataset_quality/common/rest/create_call_dataset_quality_api.ts @@ -12,8 +12,8 @@ import type { RouteRepositoryClient, } from '@kbn/server-route-repository'; import { formatRequest } from '@kbn/server-route-repository'; -import { FetchOptions } from '../../../common'; -import type { APIEndpoint, DatasetQualityServerRouteRepository } from '../../../server/routes'; +import { FetchOptions } from '..'; +import type { APIEndpoint, DatasetQualityServerRouteRepository } from '../../server/routes'; import { CallApi, callApi } from './call_api'; export type DatasetQualityClientOptions = Omit< diff --git a/x-pack/plugins/dataset_quality/common/rest/index.ts b/x-pack/plugins/dataset_quality/common/rest/index.ts new file mode 100644 index 0000000000000..559acfe62e502 --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/rest/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './call_api'; +export * from './create_call_dataset_quality_api'; diff --git a/x-pack/plugins/dataset_quality/common/translations.ts b/x-pack/plugins/dataset_quality/common/translations.ts new file mode 100644 index 0000000000000..b26b7ca5c9029 --- /dev/null +++ b/x-pack/plugins/dataset_quality/common/translations.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 { i18n } from '@kbn/i18n'; + +export const datasetQualityAppTitle = i18n.translate('xpack.datasetQuality.appTitle', { + defaultMessage: 'Datasets', +}); + +export const onboardingLinkTitle = i18n.translate('xpack.datasetQuality.onboardingLinkTitle', { + defaultMessage: 'Add data', +}); + +export const noDatasetsDescription = i18n.translate('xpack.datasetQuality.noDatasetsDescription', { + defaultMessage: 'Try adjusting your time or filter.', +}); + +export const noDatasetsTitle = i18n.translate('xpack.datasetQuality.noDatasetsTitle', { + defaultMessage: 'There is no data to display.', +}); + +export const loadingDatasetsText = i18n.translate('xpack.datasetQuality.loadingDatasetsText', { + defaultMessage: 'Loading data', +}); + +export const tableSummaryAllText = i18n.translate('xpack.datasetQuality.tableSummaryAllText', { + defaultMessage: 'All', +}); + +export const tableSummaryOfText = i18n.translate('xpack.datasetQuality.tableSummaryOfText', { + defaultMessage: 'of', +}); diff --git a/x-pack/plugins/dataset_quality/kibana.jsonc b/x-pack/plugins/dataset_quality/kibana.jsonc index 133537a76d831..710d7e82890c7 100644 --- a/x-pack/plugins/dataset_quality/kibana.jsonc +++ b/x-pack/plugins/dataset_quality/kibana.jsonc @@ -8,7 +8,7 @@ "server": true, "browser": true, "configPath": ["xpack", "datasetQuality"], - "requiredPlugins": ["data", "kibanaReact", "kibanaUtils", "controls", "embeddable", "share"], + "requiredPlugins": ["data", "kibanaReact", "kibanaUtils", "controls", "embeddable", "share", "observabilityShared", "fleet", "fieldFormats"], "optionalPlugins": [], "requiredBundles": [], "extraPublicDirs": ["common"] diff --git a/x-pack/plugins/dataset_quality/public/components/dataset_quality/columns.tsx b/x-pack/plugins/dataset_quality/public/components/dataset_quality/columns.tsx new file mode 100644 index 0000000000000..aa653a95d6220 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/components/dataset_quality/columns.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiBasicTableColumn, EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { PackageIcon } from '@kbn/fleet-plugin/public'; +import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '@kbn/field-types'; +import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import { DataStreamStat } from '../../../common/data_streams_stats/data_stream_stat'; +import loggingIcon from '../../icons/logging.svg'; + +const nameColumnName = i18n.translate('xpack.datasetQuality.nameColumnName', { + defaultMessage: 'Dataset Name', +}); + +const sizeColumnName = i18n.translate('xpack.datasetQuality.sizeColumnName', { + defaultMessage: 'Size', +}); + +const lastActivityColumnName = i18n.translate('xpack.datasetQuality.lastActivityColumnName', { + defaultMessage: 'Last Activity', +}); + +export const getDatasetQualitTableColumns = ({ + fieldFormats, +}: { + fieldFormats: FieldFormatsStart; +}): Array> => { + return [ + { + name: nameColumnName, + field: 'title', + sortable: true, + render: (title: string, dataStreamStat: DataStreamStat) => { + const { integration } = dataStreamStat; + + return ( + + + {integration ? ( + + ) : ( + + )} + + {title} + + ); + }, + }, + { + name: sizeColumnName, + field: 'size', + sortable: true, + }, + { + name: lastActivityColumnName, + field: 'lastActivity', + render: (timestamp: number) => + fieldFormats + .getDefaultInstance(KBN_FIELD_TYPES.DATE, [ES_FIELD_TYPES.DATE]) + .convert(timestamp), + sortable: true, + }, + ]; +}; diff --git a/x-pack/plugins/dataset_quality/public/components/dataset_quality/context.ts b/x-pack/plugins/dataset_quality/public/components/dataset_quality/context.ts new file mode 100644 index 0000000000000..64029b649a58d --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/components/dataset_quality/context.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 { createContext, useContext } from 'react'; +import { IDataStreamsStatsClient } from '../../services/data_streams_stats'; + +export interface DatasetQualityContextValue { + dataStreamsStatsServiceClient: IDataStreamsStatsClient; +} + +export const DatasetQualityContext = createContext({} as DatasetQualityContextValue); + +export function useDatasetQualityContext() { + return useContext(DatasetQualityContext); +} diff --git a/x-pack/plugins/dataset_quality/public/components/dataset_quality/dataset_quality.tsx b/x-pack/plugins/dataset_quality/public/components/dataset_quality/dataset_quality.tsx new file mode 100644 index 0000000000000..9fe6ca8db3b2f --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/components/dataset_quality/dataset_quality.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 React from 'react'; +import { CoreStart } from '@kbn/core/public'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { DataStreamsStatsService } from '../../services/data_streams_stats/data_streams_stats_service'; +import { DatasetQualityContext, DatasetQualityContextValue } from './context'; +import { useKibanaContextForPluginProvider } from '../../utils'; +import { DatasetQualityStartDeps } from '../../types'; +import { Header } from './header'; +import { Table } from './table'; + +export interface CreateDatasetQualityArgs { + core: CoreStart; + plugins: DatasetQualityStartDeps; +} + +export const createDatasetQuality = ({ core, plugins }: CreateDatasetQualityArgs) => { + return () => { + const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider(core, plugins); + + const dataStreamsStatsServiceClient = new DataStreamsStatsService().start({ + http: core.http, + }).client; + + const datasetQualityProviderValue: DatasetQualityContextValue = { + dataStreamsStatsServiceClient, + }; + + return ( + + + + + + ); + }; +}; + +function DatasetQuality() { + return ( + + +
    + + + + + + ); +} diff --git a/x-pack/plugins/dataset_quality/public/components/dataset_quality/header.tsx b/x-pack/plugins/dataset_quality/public/components/dataset_quality/header.tsx new file mode 100644 index 0000000000000..5126a645f7b6f --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/components/dataset_quality/header.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 React from 'react'; +import { EuiPageHeader, EuiButton } from '@elastic/eui'; +import { + ObservabilityOnboardingLocatorParams, + OBSERVABILITY_ONBOARDING_LOCATOR, +} from '@kbn/deeplinks-observability'; +import { datasetQualityAppTitle, onboardingLinkTitle } from '../../../common/translations'; +import { useKibanaContextForPlugin } from '../../utils'; + +export function Header() { + const { + services: { share }, + } = useKibanaContextForPlugin(); + + const OnboardingLink = React.memo(() => { + const locator = share.url.locators.get( + OBSERVABILITY_ONBOARDING_LOCATOR + ); + + const onboardingUrl = locator?.getRedirectUrl({}); + + return ( + + {onboardingLinkTitle} + + ); + }); + + return ( + ]} + /> + ); +} diff --git a/x-pack/plugins/dataset_quality/public/components/dataset_quality/index.ts b/x-pack/plugins/dataset_quality/public/components/dataset_quality/index.ts new file mode 100644 index 0000000000000..1a8591d0d3c86 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/components/dataset_quality/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './dataset_quality'; diff --git a/x-pack/plugins/dataset_quality/public/components/dataset_quality/table.tsx b/x-pack/plugins/dataset_quality/public/components/dataset_quality/table.tsx new file mode 100644 index 0000000000000..f45df67170636 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/components/dataset_quality/table.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiBasicTable, EuiHorizontalRule, EuiSpacer, EuiText, EuiEmptyPrompt } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { loadingDatasetsText, noDatasetsTitle } from '../../../common/translations'; +import { useDatasetQualityTable } from '../../hooks'; + +export const Table = () => { + const { sort, onTableChange, pagination, renderedItems, columns, loading, resultsCount } = + useDatasetQualityTable(); + + return ( + <> + + + + + + {noDatasetsTitle}} + hasBorder={false} + titleSize="m" + /> + ) + } + /> + + ); +}; diff --git a/x-pack/plugins/dataset_quality/public/hooks/index.ts b/x-pack/plugins/dataset_quality/public/hooks/index.ts new file mode 100644 index 0000000000000..36b6f1540c828 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/hooks/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_dataset_quality_table'; diff --git a/x-pack/plugins/dataset_quality/public/hooks/use_dataset_quality_table.tsx b/x-pack/plugins/dataset_quality/public/hooks/use_dataset_quality_table.tsx new file mode 100644 index 0000000000000..30bbd7f437da8 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/hooks/use_dataset_quality_table.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { orderBy } from 'lodash'; +import React, { useState, useMemo, useCallback } from 'react'; +import { useFetcher } from '@kbn/observability-shared-plugin/public'; +import { tableSummaryAllText, tableSummaryOfText } from '../../common/translations'; +import { DataStreamStat } from '../../common/data_streams_stats/data_stream_stat'; +import { getDatasetQualitTableColumns } from '../components/dataset_quality/columns'; +import { useDatasetQualityContext } from '../components/dataset_quality/context'; +import { useKibanaContextForPlugin } from '../utils'; + +const DEFAULT_SORT_FIELD = 'title'; +const DEFAULT_SORT_DIRECTION = 'desc'; +type DIRECTION = 'asc' | 'desc'; +type SORT_FIELD = keyof DataStreamStat; + +const sortingOverrides: Partial<{ [key in SORT_FIELD]: SORT_FIELD }> = { + ['size']: 'sizeBytes', +}; + +export const useDatasetQualityTable = () => { + const { + services: { fieldFormats }, + } = useKibanaContextForPlugin(); + const [pageIndex, setPageIndex] = useState(0); + const [pageSize, setPageSize] = useState(10); + const [sortField, setSortField] = useState(DEFAULT_SORT_FIELD); + const [sortDirection, setSortDirection] = useState(DEFAULT_SORT_DIRECTION); + + const { dataStreamsStatsServiceClient: client } = useDatasetQualityContext(); + const { data = [], loading } = useFetcher(async () => client.getDataStreamsStats(), []); + + const columns = useMemo(() => getDatasetQualitTableColumns({ fieldFormats }), [fieldFormats]); + + const pagination = { + pageIndex, + pageSize, + totalItemCount: data.length, + hidePerPageOptions: true, + }; + + const onTableChange = useCallback( + (options: { + page: { index: number; size: number }; + sort?: { field: SORT_FIELD; direction: DIRECTION }; + }) => { + setPageIndex(options.page.index); + setPageSize(options.page.size); + setSortField(options.sort?.field || DEFAULT_SORT_FIELD); + setSortDirection(options.sort?.direction || DEFAULT_SORT_DIRECTION); + }, + [] + ); + + const sort = { + sort: { field: sortField, direction: sortDirection }, + }; + + const renderedItems = useMemo(() => { + const overridenSortingField = sortingOverrides[sortField] || sortField; + const sortedItems = orderBy(data, overridenSortingField, sortDirection); + + return sortedItems.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize); + }, [data, sortField, sortDirection, pageIndex, pageSize]); + + const resultsCount = useMemo(() => { + const startNumberItemsOnPage = pageSize * pageIndex + (renderedItems.length ? 1 : 0); + const endNumberItemsOnPage = pageSize * pageIndex + renderedItems.length; + + return pageSize === 0 ? ( + {tableSummaryAllText} + ) : ( + <> + + {startNumberItemsOnPage}-{endNumberItemsOnPage} + {' '} + {tableSummaryOfText} {data.length} + + ); + }, [data.length, pageIndex, pageSize, renderedItems.length]); + + return { sort, onTableChange, pagination, renderedItems, columns, loading, resultsCount }; +}; diff --git a/x-pack/plugins/dataset_quality/public/icons/logging.svg b/x-pack/plugins/dataset_quality/public/icons/logging.svg new file mode 100644 index 0000000000000..41d5251b3ea19 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/icons/logging.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/dataset_quality/public/index.ts b/x-pack/plugins/dataset_quality/public/index.ts index 339be1ec1de9b..e57d36776edfd 100644 --- a/x-pack/plugins/dataset_quality/public/index.ts +++ b/x-pack/plugins/dataset_quality/public/index.ts @@ -14,3 +14,5 @@ export type { DatasetQualityPluginSetup, DatasetQualityPluginStart } from './typ export function plugin(context: PluginInitializerContext) { return new DatasetQualityPlugin(context); } + +export { datasetQualityAppTitle } from '../common/translations'; diff --git a/x-pack/plugins/dataset_quality/public/plugin.ts b/x-pack/plugins/dataset_quality/public/plugin.tsx similarity index 60% rename from x-pack/plugins/dataset_quality/public/plugin.ts rename to x-pack/plugins/dataset_quality/public/plugin.tsx index 520c02481cd60..c2ab655422631 100644 --- a/x-pack/plugins/dataset_quality/public/plugin.ts +++ b/x-pack/plugins/dataset_quality/public/plugin.tsx @@ -6,11 +6,12 @@ */ import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; +import { createDatasetQuality } from './components/dataset_quality'; import { DatasetQualityPluginSetup, DatasetQualityPluginStart, - DatasetQualitySetupDependencies, - DatasetQualityStartDependencies, + DatasetQualitySetupDeps, + DatasetQualityStartDeps, } from './types'; export class DatasetQualityPlugin @@ -18,14 +19,16 @@ export class DatasetQualityPlugin { constructor(context: PluginInitializerContext) {} - public setup(core: CoreSetup, plugins: DatasetQualitySetupDependencies) { + public setup(core: CoreSetup, plugins: DatasetQualitySetupDeps) { return {}; } - public start( - core: CoreStart, - plugins: DatasetQualityStartDependencies - ): DatasetQualityPluginStart { - return {}; + public start(core: CoreStart, plugins: DatasetQualityStartDeps): DatasetQualityPluginStart { + const DatasetQuality = createDatasetQuality({ + core, + plugins, + }); + + return { DatasetQuality }; } } diff --git a/x-pack/plugins/dataset_quality/public/services/data_streams_stats/data_streams_stats_client.ts b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/data_streams_stats_client.ts new file mode 100644 index 0000000000000..83028a3c4d660 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/data_streams_stats_client.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 { find, merge } from 'lodash'; +import { HttpStart } from '@kbn/core/public'; +import { DataStreamStat } from '../../../common/data_streams_stats/data_stream_stat'; +import { DATA_STREAMS_STATS_URL } from '../../../common/constants'; +import { + GetDataStreamsStatsError, + GetDataStreamsStatsResponse, + GetDataStreamsStatsQuery, + DataStreamStatServiceResponse, +} from '../../../common/data_streams_stats'; +import { IDataStreamsStatsClient } from './types'; + +export class DataStreamsStatsClient implements IDataStreamsStatsClient { + constructor(private readonly http: HttpStart) {} + + public async getDataStreamsStats( + params: GetDataStreamsStatsQuery = { type: 'logs' } + ): Promise { + const { dataStreamsStats, integrations } = await this.http + .get(DATA_STREAMS_STATS_URL, { + query: params, + }) + .catch((error) => { + throw new GetDataStreamsStatsError(`Failed to fetch data streams stats": ${error}`); + }); + + const mergedDataStreamsStats = dataStreamsStats.map((statsItem) => { + const integration = find(integrations, { name: statsItem.integration }); + + return integration ? merge({}, statsItem, { integration }) : statsItem; + }); + + return mergedDataStreamsStats.map(DataStreamStat.create); + } +} diff --git a/x-pack/plugins/dataset_quality/public/services/data_streams_stats/data_streams_stats_service.ts b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/data_streams_stats_service.ts new file mode 100644 index 0000000000000..c57fe3c90ebbf --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/data_streams_stats_service.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DataStreamsStatsClient } from './data_streams_stats_client'; +import { + DataStreamsStatsServiceSetup, + DataStreamsStatsServiceStartDeps, + DataStreamsStatsServiceStart, +} from './types'; + +export class DataStreamsStatsService { + constructor() {} + + public setup(): DataStreamsStatsServiceSetup {} + + public start({ http }: DataStreamsStatsServiceStartDeps): DataStreamsStatsServiceStart { + const client = new DataStreamsStatsClient(http); + + return { + client, + }; + } +} diff --git a/x-pack/plugins/dataset_quality/public/services/data_streams_stats/index.ts b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/index.ts new file mode 100644 index 0000000000000..8f33568e1e885 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './data_streams_stats_client'; +export * from './data_streams_stats_service'; +export * from './types'; diff --git a/x-pack/plugins/dataset_quality/public/services/data_streams_stats/types.ts b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/types.ts new file mode 100644 index 0000000000000..7023dbe254783 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/services/data_streams_stats/types.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpStart } from '@kbn/core/public'; +import { + DataStreamStatServiceResponse, + GetDataStreamsStatsQuery, +} from '../../../common/data_streams_stats'; + +export type DataStreamsStatsServiceSetup = void; + +export interface DataStreamsStatsServiceStart { + client: IDataStreamsStatsClient; +} + +export interface DataStreamsStatsServiceStartDeps { + http: HttpStart; +} + +export interface IDataStreamsStatsClient { + getDataStreamsStats(params?: GetDataStreamsStatsQuery): Promise; +} diff --git a/x-pack/plugins/dataset_quality/public/types.ts b/x-pack/plugins/dataset_quality/public/types.ts index 2d57bd6bb1b2e..482aff3b242b9 100644 --- a/x-pack/plugins/dataset_quality/public/types.ts +++ b/x-pack/plugins/dataset_quality/public/types.ts @@ -5,14 +5,22 @@ * 2.0. */ +import { ComponentType } from 'react'; +import type { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; +import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; + // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface DatasetQualityPluginSetup {} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface DatasetQualityPluginStart {} +export interface DatasetQualityPluginStart { + DatasetQuality: ComponentType; +} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface DatasetQualityStartDependencies {} +export interface DatasetQualityStartDeps { + share: SharePluginStart; + fieldFormats: FieldFormatsStart; +} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface DatasetQualitySetupDependencies {} +export interface DatasetQualitySetupDeps { + share: SharePluginSetup; +} diff --git a/x-pack/plugins/dataset_quality/public/utils/index.ts b/x-pack/plugins/dataset_quality/public/utils/index.ts new file mode 100644 index 0000000000000..c7d8b7ba1dcab --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/utils/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './use_kibana'; diff --git a/x-pack/plugins/dataset_quality/public/utils/use_kibana.tsx b/x-pack/plugins/dataset_quality/public/utils/use_kibana.tsx new file mode 100644 index 0000000000000..cd13ced6af9b7 --- /dev/null +++ b/x-pack/plugins/dataset_quality/public/utils/use_kibana.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from '@kbn/core/public'; +import { + createKibanaReactContext, + KibanaReactContextValue, + useKibana, +} from '@kbn/kibana-react-plugin/public'; +import { useMemo } from 'react'; +import { DatasetQualityStartDeps } from '../types'; + +export type PluginKibanaContextValue = CoreStart & DatasetQualityStartDeps; + +export const createKibanaContextForPlugin = (core: CoreStart, plugins: DatasetQualityStartDeps) => + createKibanaReactContext({ + ...core, + ...plugins, + }); + +export const useKibanaContextForPlugin = + useKibana as () => KibanaReactContextValue; + +export const useKibanaContextForPluginProvider = ( + core: CoreStart, + plugins: DatasetQualityStartDeps +) => { + const { Provider } = useMemo(() => createKibanaContextForPlugin(core, plugins), [core, plugins]); + + return Provider; +}; diff --git a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/get_data_streams.test.ts b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/get_data_streams.test.ts index ef1ecdbccb1d1..0b45d6fa8b34d 100644 --- a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/get_data_streams.test.ts +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/get_data_streams.test.ts @@ -114,7 +114,6 @@ describe('getDataStreams', () => { esClient: esClientMock, type: 'logs', datasetQuery: 'nginx', - sortOrder: 'asc', uncategorisedOnly: true, }); expect(dataStreamService.getMatchingDataStreams).toHaveBeenCalledWith(expect.anything(), { @@ -129,7 +128,6 @@ describe('getDataStreams', () => { esClient: esClientMock, type: 'logs', datasetQuery: 'nginx', - sortOrder: 'asc', uncategorisedOnly: true, }); expect(results.items.length).toBe(1); @@ -140,62 +138,36 @@ describe('getDataStreams', () => { esClient: esClientMock, type: 'logs', datasetQuery: 'nginx', - sortOrder: 'asc', uncategorisedOnly: false, }); expect(results.items.length).toBe(5); }); }); - describe('Can be sorted', () => { - it('Ascending', async () => { - const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - const results = await getDataStreams({ - esClient: esClientMock, - type: 'logs', - datasetQuery: 'nginx', - sortOrder: 'asc', - uncategorisedOnly: false, - }); - expect(results.items[0].name).toBe('logs-elastic_agent-default'); - }); - it('Descending', async () => { - const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - const results = await getDataStreams({ - esClient: esClientMock, - type: 'logs', - datasetQuery: 'nginx', - sortOrder: 'desc', - uncategorisedOnly: false, - }); - expect(results.items[0].name).toBe('logs-test.test-default'); - }); - }); it('Formats the items correctly', async () => { const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); const results = await getDataStreams({ esClient: esClientMock, type: 'logs', - sortOrder: 'desc', uncategorisedOnly: false, }); - expect(results.items).toEqual([ - { name: 'logs-test.test-default' }, + expect(results.items.sort()).toEqual([ { - name: 'logs-elastic_agent.metricbeat-default', - integration: { name: 'elastic_agent', managed_by: 'fleet' }, + name: 'logs-elastic_agent-default', + integration: 'elastic_agent', }, { - name: 'logs-elastic_agent.fleet_server-default', - integration: { name: 'elastic_agent', managed_by: 'fleet' }, + name: 'logs-elastic_agent.filebeat-default', + integration: 'elastic_agent', }, { - name: 'logs-elastic_agent.filebeat-default', - integration: { name: 'elastic_agent', managed_by: 'fleet' }, + name: 'logs-elastic_agent.fleet_server-default', + integration: 'elastic_agent', }, { - name: 'logs-elastic_agent-default', - integration: { name: 'elastic_agent', managed_by: 'fleet' }, + name: 'logs-elastic_agent.metricbeat-default', + integration: 'elastic_agent', }, + { name: 'logs-test.test-default' }, ]); }); }); diff --git a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/index.ts b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/index.ts index 37181d8b8a731..6154e3bc11a24 100644 --- a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/index.ts +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams/index.ts @@ -13,10 +13,9 @@ export async function getDataStreams(options: { esClient: ElasticsearchClient; type?: DataStreamTypes; datasetQuery?: string; - sortOrder: 'asc' | 'desc'; uncategorisedOnly: boolean; }) { - const { esClient, type, datasetQuery, uncategorisedOnly, sortOrder } = options; + const { esClient, type, datasetQuery, uncategorisedOnly } = options; const allDataStreams = await dataStreamService.getMatchingDataStreams(esClient, { type: type ?? '*', @@ -31,25 +30,10 @@ export async function getDataStreams(options: { const mappedDataStreams = filteredDataStreams.map((dataStream) => ({ name: dataStream.name, - ...(dataStream._meta - ? { - integration: { - name: dataStream._meta?.package?.name, - managed_by: dataStream._meta?.managed_by, - }, - } - : {}), + integration: dataStream._meta?.package?.name, })); - const sortedDataStreams = mappedDataStreams.sort((a, b) => { - if (sortOrder === 'desc') { - return b.name.localeCompare(a.name); - } - - return a.name.localeCompare(b.name); - }); - return { - items: sortedDataStreams, + items: mappedDataStreams, }; } diff --git a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/get_data_streams_stats.test.ts b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/get_data_streams_stats.test.ts index c078cb24d3d28..830c3b162573f 100644 --- a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/get_data_streams_stats.test.ts +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/get_data_streams_stats.test.ts @@ -63,52 +63,30 @@ describe('getDataStreams', () => { esClient: esClientMock, type: 'logs', datasetQuery: 'nginx', - sortOrder: 'asc', }); expect(dataStreamService.getMatchingDataStreamsStats).toHaveBeenCalledWith(expect.anything(), { type: 'logs', dataset: '*nginx*', }); }); - describe('Can be sorted', () => { - it('Ascending', async () => { - const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - const results = await getDataStreamsStats({ - esClient: esClientMock, - type: 'logs', - sortOrder: 'asc', - }); - expect(results.items[0].name).toBe('logs-elastic_agent-default'); - }); - it('Descending', async () => { - const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - const results = await getDataStreamsStats({ - esClient: esClientMock, - type: 'logs', - sortOrder: 'desc', - }); - expect(results.items[0].name).toBe('logs-test.test-default'); - }); - }); it('Formats the items correctly', async () => { const esClientMock = elasticsearchServiceMock.createElasticsearchClient(); const results = await getDataStreamsStats({ esClient: esClientMock, type: 'logs', - sortOrder: 'desc', }); - expect(results.items).toEqual([ + expect(results.items.sort()).toEqual([ { - name: 'logs-test.test-default', - size: '6.2mb', - size_bytes: 6570447, - last_activity: 1698913802000, + name: 'logs-elastic_agent-default', + size: '1gb', + size_bytes: 1170805528, + last_activity: 1698916071000, }, { - name: 'logs-elastic_agent.metricbeat-default', - size: '1.6mb', - size_bytes: 1704807, - last_activity: 1698672046707, + name: 'logs-elastic_agent.filebeat-default', + size: '1.3mb', + size_bytes: 1459100, + last_activity: 1698902209996, }, { name: 'logs-elastic_agent.fleet_server-default', @@ -117,16 +95,16 @@ describe('getDataStreams', () => { last_activity: 1698914110010, }, { - name: 'logs-elastic_agent.filebeat-default', - size: '1.3mb', - size_bytes: 1459100, - last_activity: 1698902209996, + name: 'logs-elastic_agent.metricbeat-default', + size: '1.6mb', + size_bytes: 1704807, + last_activity: 1698672046707, }, { - name: 'logs-elastic_agent-default', - size: '1gb', - size_bytes: 1170805528, - last_activity: 1698916071000, + name: 'logs-test.test-default', + size: '6.2mb', + size_bytes: 6570447, + last_activity: 1698913802000, }, ]); }); diff --git a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/index.ts b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/index.ts index 2f0f8057cddef..9ec252d096357 100644 --- a/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/index.ts +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/get_data_streams_stats/index.ts @@ -13,9 +13,8 @@ export async function getDataStreamsStats(options: { esClient: ElasticsearchClient; type?: DataStreamTypes; datasetQuery?: string; - sortOrder: 'asc' | 'desc'; }) { - const { esClient, type, datasetQuery, sortOrder } = options; + const { esClient, type, datasetQuery } = options; const matchingDataStreamsStats = await dataStreamService.getMatchingDataStreamsStats(esClient, { type: type ?? '*', @@ -31,15 +30,7 @@ export async function getDataStreamsStats(options: { }; }); - const sortedDataStreams = mappedDataStreams.sort((a, b) => { - if (sortOrder === 'desc') { - return b.name.localeCompare(a.name); - } - - return a.name.localeCompare(b.name); - }); - return { - items: sortedDataStreams, + items: mappedDataStreams, }; } diff --git a/x-pack/plugins/dataset_quality/server/routes/data_streams/routes.ts b/x-pack/plugins/dataset_quality/server/routes/data_streams/routes.ts index f973211cc7341..4217b9711226e 100644 --- a/x-pack/plugins/dataset_quality/server/routes/data_streams/routes.ts +++ b/x-pack/plugins/dataset_quality/server/routes/data_streams/routes.ts @@ -7,7 +7,7 @@ import * as t from 'io-ts'; import { keyBy, merge, values } from 'lodash'; -import { dataStreamTypesRt, sortOrderRt } from '../../types/api_types'; +import { dataStreamTypesRt } from '../../../common/data_streams'; import { DataStreamsStatResponse } from '../../types/data_stream'; import { createDatasetQualityServerRoute } from '../create_datasets_quality_server_route'; import { getDataStreams } from './get_data_streams'; @@ -21,19 +21,22 @@ const statsRoute = createDatasetQualityServerRoute({ t.partial({ datasetQuery: t.string, }), - sortOrderRt, ]), }), options: { tags: [], }, async handler(resources): Promise { - const { context, params } = resources; + const { context, params, plugins } = resources; const coreContext = await context.core; // Query datastreams as the current user as the Kibana internal user may not have all the required permissions const esClient = coreContext.elasticsearch.client.asCurrentUser; + const fleetPluginStart = await plugins.fleet.start(); + const packageClient = fleetPluginStart.packageService.asInternalUser; + const packages = await packageClient.getPackages(); + const [dataStreams, dataStreamsStats] = await Promise.all([ getDataStreams({ esClient, @@ -43,8 +46,22 @@ const statsRoute = createDatasetQualityServerRoute({ getDataStreamsStats({ esClient, ...params.query }), ]); + const installedPackages = dataStreams.items.map((item) => item.integration); + + const integrations = packages + .filter((pkg) => installedPackages.includes(pkg.name)) + .map((p) => ({ + name: p.name, + title: p.title, + version: p.version, + icons: p.icons, + })); + return { - items: values(merge(keyBy(dataStreams.items, 'name'), keyBy(dataStreamsStats.items, 'name'))), + dataStreamsStats: values( + merge(keyBy(dataStreams.items, 'name'), keyBy(dataStreamsStats.items, 'name')) + ), + integrations, }; }, }); diff --git a/x-pack/plugins/dataset_quality/server/types.ts b/x-pack/plugins/dataset_quality/server/types.ts index f9a184cfb768c..3874040f5d3bf 100644 --- a/x-pack/plugins/dataset_quality/server/types.ts +++ b/x-pack/plugins/dataset_quality/server/types.ts @@ -6,12 +6,15 @@ */ import { CustomRequestHandlerContext } from '@kbn/core/server'; +import { FleetSetupContract, FleetStartContract } from '@kbn/fleet-plugin/server'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface DatasetQualityPluginSetupDependencies {} +export interface DatasetQualityPluginSetupDependencies { + fleet: FleetSetupContract; +} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface DatasetQualityPluginStartDependencies {} +export interface DatasetQualityPluginStartDependencies { + fleet: FleetStartContract; +} // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface DatasetQualityPluginSetup {} diff --git a/x-pack/plugins/dataset_quality/server/types/data_stream.ts b/x-pack/plugins/dataset_quality/server/types/data_stream.ts index 582746755ac51..423d85985c599 100644 --- a/x-pack/plugins/dataset_quality/server/types/data_stream.ts +++ b/x-pack/plugins/dataset_quality/server/types/data_stream.ts @@ -6,9 +6,11 @@ */ import { ByteSize } from '@elastic/elasticsearch/lib/api/types'; +import { Integration } from './integration'; export interface DataStreamsStatResponse { - items: DataStreamStat[]; + dataStreamsStats: DataStreamStat[]; + integrations: Integration[]; } export interface DataStreamStat { @@ -16,10 +18,7 @@ export interface DataStreamStat { size?: ByteSize; size_bytes?: number; last_activity?: number; - integration?: { - name?: string; - managed_by?: string; - }; + integration?: Integration; } export type DataStreamTypes = 'logs' | 'metrics' | 'traces' | 'synthetics' | 'profiling'; diff --git a/x-pack/plugins/dataset_quality/server/types/integration.ts b/x-pack/plugins/dataset_quality/server/types/integration.ts new file mode 100644 index 0000000000000..2595a120c8b70 --- /dev/null +++ b/x-pack/plugins/dataset_quality/server/types/integration.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface Integration { + name: string; + title?: string; + version?: string; + icons?: IntegrationIcon[]; +} + +export interface IntegrationIcon { + path: string; + src: string; + title?: string; + size?: string; + type?: string; +} diff --git a/x-pack/plugins/dataset_quality/tsconfig.json b/x-pack/plugins/dataset_quality/tsconfig.json index 8e3ebcdb7e741..32baf4671143e 100644 --- a/x-pack/plugins/dataset_quality/tsconfig.json +++ b/x-pack/plugins/dataset_quality/tsconfig.json @@ -11,10 +11,19 @@ ], "kbn_references": [ "@kbn/core", - "@kbn/server-route-repository", "@kbn/core-plugins-server", "@kbn/core-elasticsearch-server-mocks", + "@kbn/deeplinks-observability", + "@kbn/fleet-plugin", + "@kbn/observability-shared-plugin", + "@kbn/server-route-repository", + "@kbn/share-plugin", "@kbn/std", + "@kbn/i18n", + "@kbn/kibana-react-plugin", + "@kbn/i18n-react", + "@kbn/field-formats-plugin", + "@kbn/field-types" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts index ad54b0d1e8b40..17b84398087b3 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/execute_custom_llm_chain/index.ts @@ -9,12 +9,184 @@ import { initializeAgentExecutorWithOptions } from 'langchain/agents'; import { RetrievalQAChain } from 'langchain/chains'; import { BufferMemory, ChatMessageHistory } from 'langchain/memory'; import { ChainTool, Tool } from 'langchain/tools'; +import { HttpResponseOutputParser } from 'langchain/output_parsers'; +import { PassThrough, Transform, Readable } from 'stream'; +import { Callbacks } from 'langchain/dist/callbacks/manager'; import { ElasticsearchStore } from '../elasticsearch_store/elasticsearch_store'; import { ActionsClientLlm } from '../llm/actions_client_llm'; import { KNOWLEDGE_BASE_INDEX_PATTERN } from '../../../routes/knowledge_base/constants'; import type { AgentExecutorParams, AgentExecutorResponse } from '../executors/types'; +export interface AIStreamCallbacksAndOptions { + /** `onStart`: Called once when the stream is initialized. */ + onStart?: () => Promise | void; + /** `onCompletion`: Called for each tokenized message. */ + onCompletion?: (completion: string) => Promise | void; + /** `onFinal`: Called once when the stream is closed with the final completion message. */ + onFinal?: (completion: string) => Promise | void; + /** `onToken`: Called for each tokenized message. */ + onToken?: (token: string) => Promise | void; + /** + * A flag for enabling the experimental_StreamData class and the new protocol. + * @see https://github.com/vercel-labs/ai/pull/425 + * + * When StreamData is rolled out, this will be removed and the new protocol will be used by default. + */ + // eslint-disable-next-line @typescript-eslint/naming-convention + experimental_streamData?: boolean; +} + +export function createCallbacksTransformer( + cb: AIStreamCallbacksAndOptions | undefined +): TransformStream { + const textEncoder = new TextEncoder(); + let aggregatedResponse = ''; + const callbacks = cb || {}; + + return new TransformStream({ + async start(): Promise { + if (callbacks.onStart) await callbacks.onStart(); + }, + + async transform(message, controller): Promise { + controller.enqueue(textEncoder.encode(message)); + console.log('createCallbacksTransformer, transform'); + aggregatedResponse += message; + if (callbacks.onToken) await callbacks.onToken(message); + }, + + async flush(): Promise { + // If it's OpenAICallbacks, it has an experimental_onFunctionCall which means that the createFunctionCallTransformer + // will handle calling onComplete. + if (callbacks.onCompletion) { + await callbacks.onCompletion(aggregatedResponse); + } + + if (callbacks.onFinal) { + await callbacks.onFinal(aggregatedResponse); + } + }, + }); +} + +/** + * A TransformStream for LLMs that do not have their own transform stream handlers managing encoding (e.g. OpenAIStream has one for function call handling). + * This assumes every chunk is a 'text' chunk. + */ +export function createStreamDataTransformer(experimental_streamData: boolean | undefined) { + if (!experimental_streamData) { + return new TransformStream({ + transform: async (chunk, controller) => { + controller.enqueue(chunk); + }, + }); + } + const encoder = new TextEncoder(); + const decoder = new TextDecoder(); + return new TransformStream({ + transform: async (chunk, controller) => { + const message = decoder.decode(chunk); + console.log('createStreamDataTransformer, transform'); + controller.enqueue(encoder.encode(message)); + }, + }); +} +export function LangChainStream(callbacks?: AIStreamCallbacksAndOptions): { + stream: Readable; + handlers: Callbacks; +} { + const stream = new TransformStream(); + const writer = stream.writable.getWriter(); + + const runs = new Set(); + + const handleError = async (e: Error, runId: string) => { + runs.delete(runId); + await writer.ready; + await writer.abort(e); + }; + + const handleStart = async (runId: string) => { + runs.add(runId); + }; + + const handleEnd = async (runId: string) => { + runs.delete(runId); + + if (runs.size === 0) { + await writer.ready; + await writer.close(); + } + }; + + const streamer = undefined; + + return { + stream, + // .pipeThrough(createCallbacksTransformer(callbacks)) + // .pipeThrough(createStreamDataTransformer(callbacks?.experimental_streamData)), + handlers: [ + { + handleLLMNewToken: async (token: string) => { + console.log('handleLLMNewToken in stream', token); + await writer.ready; + await writer.write(token); + }, + handleLLMStart: async (_llm: any, _prompts: string[], runId: string) => { + console.log('YOOOOOOOOhandleLLMStart', { _llm, _prompts, runId }); + handleStart(runId); + }, + handleLLMEnd: async (_output: any, runId: string) => { + console.log('YOOOOOOOOhandleLLMEnd'); + await handleEnd(runId); + }, + handleLLMError: async (e: Error, runId: string) => { + console.log('YOOOOOOOOhandleLLMError'); + await handleError(e, runId); + }, + handleChainStart: async (_chain: any, _inputs: any, runId: string) => { + console.log('YOOOOOOOOhandleChainStart', { _chain, _inputs, runId }); + + const storedStream = _chain.kwargs?.llm?.getActionResultStream(); + if (storedStream instanceof Transform) { + console.log('The variable is a Transform stream.'); + } else if (storedStream instanceof Transform && !(storedStream instanceof PassThrough)) { + console.log( + `The variable is a Transform stream, not a PassThrough stream.`, + storedStream + ); + } else { + console.log('The variable is not a Transform stream or is a PassThrough stream.'); + } + handleStart(runId); + }, + handleChainEnd: async (_outputs: any, runId: string) => { + console.log('YOOOOOOOOhandleChainEnd'); + await handleEnd(runId); + }, + handleChainError: async (e: Error, runId: string) => { + console.log('YOOOOOOOOhandleChainError'); + await handleError(e, runId); + }, + handleToolStart: async (_tool: any, _input: string, runId: string) => { + console.log('YOOOOOOOOhandleToolStart'); + streamer; + handleStart(runId); + }, + handleToolEnd: async (_output: string, runId: string) => { + console.log('YOOOOOOOOhandleToolEnd'); + await handleEnd(runId); + }, + handleToolError: async (e: Error, runId: string) => { + console.log('YOOOOOOOOhandleToolError'); + await handleError(e, runId); + }, + }, + ], + }; +} + export const callAgentExecutor = async ({ actions, connectorId, @@ -26,7 +198,14 @@ export const callAgentExecutor = async ({ elserId, kbResource, }: AgentExecutorParams): AgentExecutorResponse => { - const llm = new ActionsClientLlm({ actions, connectorId, request, llmType, logger }); + const llm = new ActionsClientLlm({ + actions, + connectorId, + request, + llmType, + logger, + streaming: true, + }); const pastMessages = langChainMessages.slice(0, -1); // all but the last message const latestMessage = langChainMessages.slice(-1); // the last message @@ -66,18 +245,89 @@ export const callAgentExecutor = async ({ chain, }), ]; + const { stream, handlers } = LangChainStream(); const executor = await initializeAgentExecutorWithOptions(tools, llm, { agentType: 'chat-conversational-react-description', memory, verbose: false, }); + const parser = new HttpResponseOutputParser(); + // + // const stream = await llm.pipe(parser).stream({ text: latestMessage[0].content }); + // + // const httpResponse = new Response(stream, { + // headers: { + // 'Content-Type': 'text/plain; charset=utf-8', + // }, + // }); + // console.log('THIS SHOULD BE SECOND', httpResponse); + // + // return httpResponse; - await executor.call({ input: latestMessage[0].content }); + const resp = await executor.stream( + { input: latestMessage[0].content }, + { + callbacks: handlers, + } + ); + return new Promise((resolve) => { + const storedStream = llm.getActionResultStream(); + console.log('THIS SHOULD BE Promise', { stream, resp, storedStream }); + storedStream.on('data', (response) => { + console.log('THIS SHOULD BE storedStream data', response); + }); + storedStream.on('end', () => { + console.log('THIS SHOULD BE storedStream end'); + }); + // stream.pipe(new PassThrough()); - return { - connector_id: connectorId, - data: llm.getActionResultData(), // the response from the actions framework - status: 'ok', - }; + // stream.on('data', (response) => { + // console.log('THIS SHOULD BE stream data', response); + // }); + // stream.on('end', () => { + // console.log('THIS SHOULD BE stream end'); + // }); + resolve(stream); + }); + // await executor.call( + // { input: latestMessage[0].content } + // { + // callbacks: [ + // { + // handleLLMNewToken(token: string) { + // console.log('handleLLMNewToken in call', token); + // }, + // }, + // ], + // } + // ); + console.log('THIS SHOULD BE SECOND', stream); + console.log('THIS SHOULD BE SECOND ALSO', llm.getActionResultStream()); + // return stream; // llm.getActionResultStream().pipe(new PassThrough()); + // return (resp as unknown as Readable).pipe(new PassThrough()); // llm.getActionResultStream(); + // { + // connector_id: connectorId, + // data: llm.getActionResultStream(), // the response from the actions framework + // status: 'ok', + // }; + return new StreamingTextResponse(stream); }; +export class StreamingTextResponse extends Response { + constructor(res: ReadableStream, init?: ResponseInit, data?) { + let processedStream = res; + + if (data) { + processedStream = res.pipeThrough(data.stream); + } + + super(processedStream as any, { + ...init, + status: 200, + headers: { + 'Content-Type': 'text/plain; charset=utf-8', + ...init?.headers, + }, + }); + } +} diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts index 608b15eed384f..e1d6906b87058 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/openai_functions_executor.ts @@ -64,7 +64,7 @@ export const callOpenAIFunctionsExecutor = async ({ }); await executor.call({ input: latestMessage[0].content }); - + console.log('is openai functions executor running???'); return { connector_id: connectorId, data: llm.getActionResultData(), // the response from the actions framework diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts index 1c15ff8c97da4..a50a94fa47cda 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/executors/types.ts @@ -10,6 +10,7 @@ import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import { BaseMessage } from 'langchain/schema'; import { Logger } from '@kbn/logging'; import { KibanaRequest } from '@kbn/core-http-server'; +import { Readable } from 'stream'; import { RequestBody, ResponseBody } from '../types'; export interface AgentExecutorParams { @@ -24,7 +25,7 @@ export interface AgentExecutorParams { elserId?: string; } -export type AgentExecutorResponse = Promise; +export type AgentExecutorResponse = Promise; export type AgentExecutor = (params: AgentExecutorParams) => AgentExecutorResponse; diff --git a/x-pack/plugins/elastic_assistant/server/lib/langchain/llm/actions_client_llm.ts b/x-pack/plugins/elastic_assistant/server/lib/langchain/llm/actions_client_llm.ts index 99fa1ac946909..a369db4888490 100644 --- a/x-pack/plugins/elastic_assistant/server/lib/langchain/llm/actions_client_llm.ts +++ b/x-pack/plugins/elastic_assistant/server/lib/langchain/llm/actions_client_llm.ts @@ -7,11 +7,16 @@ import { KibanaRequest, Logger } from '@kbn/core/server'; import type { PluginStartContract as ActionsPluginStart } from '@kbn/actions-plugin/server'; -import { LLM } from 'langchain/llms/base'; +import { BaseLLMCallOptions, LLM } from 'langchain/llms/base'; import { get } from 'lodash/fp'; -import { getMessageContentAndRole } from '../helpers'; +import { PassThrough, Readable } from 'stream'; +import { Promise } from 'cypress/types/cy-bluebird'; +import { BaseLanguageModelInput } from 'langchain/base_language'; +import { CallbackManagerForLLMRun } from 'langchain/callbacks'; +import { GenerationChunk } from 'langchain/schema'; import { RequestBody } from '../types'; +import { getMessageContentAndRole } from '../helpers'; const LLM_TYPE = 'ActionsClientLlm'; @@ -21,6 +26,9 @@ export class ActionsClientLlm extends LLM { #logger: Logger; #request: KibanaRequest; #actionResultData: string; + #stream: Readable; + + streaming = false; // Local `llmType` as it can change and needs to be accessed by abstract `_llmType()` method // Not using getter as `this._llmType()` is called in the constructor via `super({})` @@ -32,12 +40,14 @@ export class ActionsClientLlm extends LLM { llmType, logger, request, + streaming, }: { actions: ActionsPluginStart; connectorId: string; llmType?: string; logger: Logger; request: KibanaRequest; + streaming: boolean; }) { super({}); @@ -47,12 +57,19 @@ export class ActionsClientLlm extends LLM { this.#logger = logger; this.#request = request; this.#actionResultData = ''; + this.#stream = new PassThrough(); + this.streaming = streaming ?? this.streaming; + console.log('IS IT STREAM?', this.streaming); } getActionResultData(): string { return this.#actionResultData; } + getActionResultStream(): Readable { + return this.#stream; + } + _llmType() { return this.llmType; } @@ -64,14 +81,57 @@ export class ActionsClientLlm extends LLM { return 'base_chat_model'; } - async _call(prompt: string): Promise { - // convert the Langchain prompt to an assistant message: + async *_streamIterator( + input: BaseLanguageModelInput, + options?: BaseLLMCallOptions + ): AsyncGenerator { + console.log('do we do this? _streamIterator'); + return super._streamIterator(input, options); + } + + async *_streamResponseChunks( + prompt: string, + options: this['ParsedCallOptions'], + runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + console.log('do we do this? _streamResponseChunks'); + + // create an actions client from the authenticated request context: + const actionsClient = await this.#actions.getActionsClientWithRequest(this.#request); + const actionStreamResult = await actionsClient.execute( + this.formatRequestForActionsClient(prompt) + ); + + this.#stream = actionStreamResult.data as Readable; + + for await (const data of (actionStreamResult.data as Readable).pipe(new PassThrough())) { + const choice = data.toString(); + if (!choice) { + throw new Error('this seems bad'); + } + console.log('CHUNK:', choice); + const chunk = new GenerationChunk({ + text: choice, + }); + yield chunk; + + void runManager?.handleLLMNewToken(chunk.text ?? ''); + } + if (options.signal?.aborted) { + throw new Error('AbortError'); + } + } + + formatRequestForActionsClient(prompt: string): { + actionId: string; + params: { subActionParams: { messages: Array<{ content?: string; role: string }> } }; + } { const assistantMessage = getMessageContentAndRole(prompt); this.#logger.debug( `ActionsClientLlm#_call assistantMessage:\n${JSON.stringify(assistantMessage)} ` ); // create a new connector request body with the assistant message: - const requestBody = { + return { actionId: this.#connectorId, params: { ...this.#request.body.params, // the original request body params @@ -81,11 +141,45 @@ export class ActionsClientLlm extends LLM { }, }, }; + } + + async _call( + prompt: string, + options: this['ParsedCallOptions'], + runManager?: CallbackManagerForLLMRun + ): Promise { + if (this.streaming) { + // const actionsClient = await this.#actions.getActionsClientWithRequest(this.#request); + // const actionStreamResult = await actionsClient.execute( + // this.formatRequestForActionsClient(prompt) + // ); + // console.log('actionStreamResult', actionStreamResult); + // + // this.#stream = (actionStreamResult.data as Readable).pipe(new PassThrough()); + // + // let responseBody: string = ''; + // this.#stream.on('data', (chunk: string) => { + // responseBody += chunk.toString(); + // }); + // await finished(this.#stream); + // return responseBody; + const stream = this._streamResponseChunks(prompt, options, runManager); + let finalResult: GenerationChunk | undefined; + for await (const chunk of stream) { + if (finalResult === undefined) { + finalResult = chunk; + } else { + finalResult = finalResult.concat(chunk); + } + } + console.log('finalResult', finalResult); + return finalResult?.text ?? ''; + } // create an actions client from the authenticated request context: const actionsClient = await this.#actions.getActionsClientWithRequest(this.#request); - const actionResult = await actionsClient.execute(requestBody); + const actionResult = await actionsClient.execute(this.formatRequestForActionsClient(prompt)); if (actionResult.status === 'error') { throw new Error( diff --git a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts index 299d8ade24a3f..4727ddbb91e0d 100644 --- a/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts +++ b/x-pack/plugins/elastic_assistant/server/routes/post_actions_connector_execute.ts @@ -75,6 +75,8 @@ export const postActionsConnectorExecuteRoute = ( kbResource: ESQL_RESOURCE, }); + console.log('THIS SHOULD BE LAST!!!!!!', langChainResponseBody); + return response.ok({ body: langChainResponseBody, }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx index 37a7c71535869..d1056fe8395e4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/configure_pipeline.tsx @@ -37,7 +37,7 @@ import { InferenceConfiguration } from './inference_config'; import { EMPTY_PIPELINE_CONFIGURATION, MLInferenceLogic } from './ml_inference_logic'; import { MlModelSelectOption } from './model_select_option'; import { PipelineSelectOption } from './pipeline_select_option'; -import { TextExpansionCallOut } from './text_expansion_callout'; +import { TextExpansionCallOut } from './text_expansion_callout/text_expansion_callout'; import { MODEL_REDACTED_VALUE, MODEL_SELECT_PLACEHOLDER } from './utils'; const MODEL_SELECT_PLACEHOLDER_VALUE = 'model_placeholder$$'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/deploy_model.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/deploy_model.test.tsx similarity index 97% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/deploy_model.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/deploy_model.test.tsx index 356de3acc9dc6..6e5e2cb3fbbb8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/deploy_model.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/deploy_model.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { setMockValues } from '../../../../../../__mocks__/kea_logic'; import React from 'react'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/deploy_model.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/deploy_model.tsx similarity index 98% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/deploy_model.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/deploy_model.tsx index ef7dd486e5eb1..594ec2c6b4510 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/deploy_model.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/deploy_model.tsx @@ -21,7 +21,7 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage, FormattedHTMLMessage } from '@kbn/i18n-react'; -import { docLinks } from '../../../../../shared/doc_links'; +import { docLinks } from '../../../../../../shared/doc_links'; import { TextExpansionCallOutState, TextExpansionDismissButton } from './text_expansion_callout'; import { TextExpansionCalloutLogic } from './text_expansion_callout_logic'; @@ -55,7 +55,7 @@ export const DeployModel = ({

    {i18n.translate( 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.title', - { defaultMessage: 'Improve your results with ELSER v2' } + { defaultMessage: 'Improve your results with ELSER' } )}

    diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployed.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployed.test.tsx similarity index 97% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployed.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployed.test.tsx index a17eae3ef75f6..84172ce34ccc5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployed.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployed.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { setMockValues } from '../../../../../../__mocks__/kea_logic'; import React from 'react'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployed.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployed.tsx similarity index 97% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployed.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployed.tsx index 50d8ea47fb8f1..fe8f0b7953c7d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployed.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployed.tsx @@ -51,7 +51,7 @@ export const ModelDeployed = ({

    {i18n.translate( 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployedTitle', - { defaultMessage: 'Your ELSER v2 model has deployed but not started.' } + { defaultMessage: 'Your ELSER model has deployed but not started.' } )}

    diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployment_in_progress.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployment_in_progress.test.tsx similarity index 94% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployment_in_progress.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployment_in_progress.test.tsx index f147778539f55..e2493fad0e4c3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployment_in_progress.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployment_in_progress.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { setMockValues } from '../../../../../../__mocks__/kea_logic'; import React from 'react'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployment_in_progress.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployment_in_progress.tsx similarity index 96% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployment_in_progress.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployment_in_progress.tsx index 8804f4ec58439..f9b9439833255 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_deployment_in_progress.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_deployment_in_progress.tsx @@ -28,7 +28,7 @@ export const ModelDeploymentInProgress = ({

    {i18n.translate( 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployingTitle', - { defaultMessage: 'Your ELSER v2 model is deploying.' } + { defaultMessage: 'Your ELSER model is deploying.' } )}

    diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_started.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_started.test.tsx similarity index 96% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_started.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_started.test.tsx index c98ca42a41121..e5bf09b61e412 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_started.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_started.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { setMockValues } from '../../../../../../__mocks__/kea_logic'; import React from 'react'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_started.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_started.tsx similarity index 88% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_started.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_started.tsx index fa5a46d438041..1a15b8e96ab36 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/model_started.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/model_started.tsx @@ -17,14 +17,15 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { KibanaLogic } from '../../../../../shared/kibana'; +import { KibanaLogic } from '../../../../../../shared/kibana'; + +import { TRAINED_MODELS_PATH } from '../utils'; import { TextExpansionCallOutState, TextExpansionDismissButton, FineTuneModelsButton, } from './text_expansion_callout'; -import { TRAINED_MODELS_PATH } from './utils'; export const ModelStarted = ({ dismiss, @@ -49,20 +50,20 @@ export const ModelStarted = ({ ? isCompact ? i18n.translate( 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedSingleThreadedTitleCompact', - { defaultMessage: 'Your ELSER v2 model is running single-threaded.' } + { defaultMessage: 'Your ELSER model is running single-threaded.' } ) : i18n.translate( 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedSingleThreadedTitle', - { defaultMessage: 'Your ELSER v2 model has started single-threaded.' } + { defaultMessage: 'Your ELSER model has started single-threaded.' } ) : isCompact ? i18n.translate( 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedTitleCompact', - { defaultMessage: 'Your ELSER v2 model is running.' } + { defaultMessage: 'Your ELSER model is running.' } ) : i18n.translate( 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedTitle', - { defaultMessage: 'Your ELSER v2 model has started.' } + { defaultMessage: 'Your ELSER model has started.' } )} @@ -91,7 +92,7 @@ export const ModelStarted = ({ 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedBody', { defaultMessage: - 'Enjoy the power of ELSER v2 in your custom Inference pipeline.', + 'Enjoy the power of ELSER in your custom Inference pipeline.', } )}

    diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout.test.tsx similarity index 97% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout.test.tsx index 1ef7480b25c81..4abd583e4a79f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { setMockValues } from '../../../../../../__mocks__/kea_logic'; import React from 'react'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout.tsx similarity index 95% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout.tsx index 310f8f273a2cb..1ea2c63ccaaa3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout.tsx @@ -12,8 +12,10 @@ import { useValues } from 'kea'; import { EuiButtonEmpty, EuiButtonIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { KibanaLogic } from '../../../../../shared/kibana'; -import { IndexViewLogic } from '../../index_view_logic'; +import { KibanaLogic } from '../../../../../../shared/kibana'; +import { IndexViewLogic } from '../../../index_view_logic'; + +import { TRAINED_MODELS_PATH } from '../utils'; import { DeployModel } from './deploy_model'; import { ModelDeployed } from './model_deployed'; @@ -22,7 +24,6 @@ import { ModelStarted } from './model_started'; import { useTextExpansionCallOutData } from './text_expansion_callout_data'; import { TextExpansionCalloutLogic } from './text_expansion_callout_logic'; import { TextExpansionErrors } from './text_expansion_errors'; -import { TRAINED_MODELS_PATH } from './utils'; export interface TextExpansionCallOutState { dismiss: () => void; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_data.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_data.tsx similarity index 96% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_data.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_data.tsx index 849bcd7964f76..4cddec9b7d2d6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_data.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_data.tsx @@ -9,7 +9,7 @@ import { useCallback, useEffect, useState } from 'react'; import { useValues } from 'kea'; -import { IndexViewLogic } from '../../index_view_logic'; +import { IndexViewLogic } from '../../../index_view_logic'; import { TextExpansionCallOutProps, TextExpansionCallOutState } from './text_expansion_callout'; import { TextExpansionCalloutLogic } from './text_expansion_callout_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_logic.test.ts similarity index 94% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.test.ts rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_logic.test.ts index e39230ee2b69b..1380e05e4c57f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_logic.test.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { LogicMounter } from '../../../../../__mocks__/kea_logic'; +import { LogicMounter } from '../../../../../../__mocks__/kea_logic'; import { HttpResponse } from '@kbn/core/public'; -import { ErrorResponse, HttpError, Status } from '../../../../../../../common/types/api'; -import { MlModelDeploymentState } from '../../../../../../../common/types/ml'; -import { CreateTextExpansionModelApiLogic } from '../../../../api/ml_models/text_expansion/create_text_expansion_model_api_logic'; -import { FetchTextExpansionModelApiLogic } from '../../../../api/ml_models/text_expansion/fetch_text_expansion_model_api_logic'; -import { StartTextExpansionModelApiLogic } from '../../../../api/ml_models/text_expansion/start_text_expansion_model_api_logic'; +import { ErrorResponse, HttpError, Status } from '../../../../../../../../common/types/api'; +import { MlModelDeploymentState } from '../../../../../../../../common/types/ml'; +import { CreateTextExpansionModelApiLogic } from '../../../../../api/ml_models/text_expansion/create_text_expansion_model_api_logic'; +import { FetchTextExpansionModelApiLogic } from '../../../../../api/ml_models/text_expansion/fetch_text_expansion_model_api_logic'; +import { StartTextExpansionModelApiLogic } from '../../../../../api/ml_models/text_expansion/start_text_expansion_model_api_logic'; import { getTextExpansionError, @@ -80,19 +80,19 @@ describe('TextExpansionCalloutLogic', () => { }); it('uses the correct title and message from a create error', () => { expect(getTextExpansionError(error, undefined, undefined)).toEqual({ - title: 'Error with ELSER v2 deployment', + title: 'Error with ELSER deployment', message: error.body?.message, }); }); it('uses the correct title and message from a fetch error', () => { expect(getTextExpansionError(undefined, error, undefined)).toEqual({ - title: 'Error fetching ELSER v2 model', + title: 'Error fetching ELSER model', message: error.body?.message, }); }); it('uses the correct title and message from a start error', () => { expect(getTextExpansionError(undefined, undefined, error)).toEqual({ - title: 'Error starting ELSER v2 deployment', + title: 'Error starting ELSER deployment', message: error.body?.message, }); }); @@ -303,7 +303,7 @@ describe('TextExpansionCalloutLogic', () => { describe('textExpansionError', () => { const error = { body: { - error: 'Error with ELSER v2 deployment', + error: 'Error with ELSER deployment', message: 'Mocked error message', statusCode: 500, }, @@ -318,21 +318,21 @@ describe('TextExpansionCalloutLogic', () => { it('returns extracted error for create', () => { CreateTextExpansionModelApiLogic.actions.apiError(error); expect(TextExpansionCalloutLogic.values.textExpansionError).toStrictEqual({ - title: 'Error with ELSER v2 deployment', + title: 'Error with ELSER deployment', message: 'Mocked error message', }); }); it('returns extracted error for fetch', () => { FetchTextExpansionModelApiLogic.actions.apiError(error); expect(TextExpansionCalloutLogic.values.textExpansionError).toStrictEqual({ - title: 'Error fetching ELSER v2 model', + title: 'Error fetching ELSER model', message: 'Mocked error message', }); }); it('returns extracted error for start', () => { StartTextExpansionModelApiLogic.actions.apiError(error); expect(TextExpansionCalloutLogic.values.textExpansionError).toStrictEqual({ - title: 'Error starting ELSER v2 deployment', + title: 'Error starting ELSER deployment', message: 'Mocked error message', }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_logic.ts similarity index 93% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.ts rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_logic.ts index e8e6913c38ce8..06d4f553bbabd 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_callout_logic.ts @@ -9,26 +9,26 @@ import { kea, MakeLogicType } from 'kea'; import { i18n } from '@kbn/i18n'; -import { HttpError, Status } from '../../../../../../../common/types/api'; -import { MlModelDeploymentState } from '../../../../../../../common/types/ml'; -import { getErrorsFromHttpResponse } from '../../../../../shared/flash_messages/handle_api_errors'; +import { HttpError, Status } from '../../../../../../../../common/types/api'; +import { MlModelDeploymentState } from '../../../../../../../../common/types/ml'; +import { getErrorsFromHttpResponse } from '../../../../../../shared/flash_messages/handle_api_errors'; -import { KibanaLogic } from '../../../../../shared/kibana'; +import { KibanaLogic } from '../../../../../../shared/kibana'; import { CreateTextExpansionModelApiLogic, CreateTextExpansionModelApiLogicActions, CreateTextExpansionModelResponse, -} from '../../../../api/ml_models/text_expansion/create_text_expansion_model_api_logic'; +} from '../../../../../api/ml_models/text_expansion/create_text_expansion_model_api_logic'; import { FetchTextExpansionModelApiLogic, FetchTextExpansionModelApiLogicActions, FetchTextExpansionModelResponse, -} from '../../../../api/ml_models/text_expansion/fetch_text_expansion_model_api_logic'; +} from '../../../../../api/ml_models/text_expansion/fetch_text_expansion_model_api_logic'; import { StartTextExpansionModelApiLogic, StartTextExpansionModelApiLogicActions, -} from '../../../../api/ml_models/text_expansion/start_text_expansion_model_api_logic'; +} from '../../../../../api/ml_models/text_expansion/start_text_expansion_model_api_logic'; const FETCH_TEXT_EXPANSION_MODEL_POLLING_DURATION = 5000; // 5 seconds const FETCH_TEXT_EXPANSION_MODEL_POLLING_DURATION_ON_FAILURE = 30000; // 30 seconds @@ -97,7 +97,7 @@ export const getTextExpansionError = ( title: i18n.translate( 'xpack.enterpriseSearch.content.indices.pipelines.textExpansionCreateError.title', { - defaultMessage: 'Error with ELSER v2 deployment', + defaultMessage: 'Error with ELSER deployment', } ), message: getErrorsFromHttpResponse(createError)[0], @@ -107,7 +107,7 @@ export const getTextExpansionError = ( title: i18n.translate( 'xpack.enterpriseSearch.content.indices.pipelines.textExpansionStartError.title', { - defaultMessage: 'Error starting ELSER v2 deployment', + defaultMessage: 'Error starting ELSER deployment', } ), message: getErrorsFromHttpResponse(startError)[0], @@ -117,7 +117,7 @@ export const getTextExpansionError = ( title: i18n.translate( 'xpack.enterpriseSearch.content.indices.pipelines.textExpansionFetchError.title', { - defaultMessage: 'Error fetching ELSER v2 model', + defaultMessage: 'Error fetching ELSER model', } ), message: getErrorsFromHttpResponse(fetchError)[0], diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_errors.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_errors.test.tsx similarity index 93% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_errors.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_errors.test.tsx index cb15c2c5c5411..2a7a6ea610bda 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_errors.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_errors.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { setMockValues } from '../../../../../../__mocks__/kea_logic'; import React from 'react'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_errors.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_errors.tsx similarity index 84% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_errors.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_errors.tsx index a46105586af1e..e55f6109c177f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_errors.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout/text_expansion_errors.tsx @@ -13,10 +13,10 @@ import { EuiCallOut, EuiLink } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { HttpLogic } from '../../../../../shared/http'; +import { HttpLogic } from '../../../../../../shared/http'; -import { SendEnterpriseSearchTelemetry } from '../../../../../shared/telemetry'; -import { ML_NOTIFICATIONS_PATH } from '../../../../routes'; +import { SendEnterpriseSearchTelemetry } from '../../../../../../shared/telemetry'; +import { ML_NOTIFICATIONS_PATH } from '../../../../../routes'; export const TextExpansionErrors = ({ error }: { error: { title: string; message: string } }) => { const { http } = useValues(HttpLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference_pipeline_processors_card.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference_pipeline_processors_card.tsx index 6d3ad46a985c0..718138535afba 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference_pipeline_processors_card.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference_pipeline_processors_card.tsx @@ -18,7 +18,7 @@ import { IndexNameLogic } from '../index_name_logic'; import { InferencePipelineCard } from './inference_pipeline_card'; import { AddMLInferencePipelineButton } from './ml_inference/add_ml_inference_button'; -import { TextExpansionCallOut } from './ml_inference/text_expansion_callout'; +import { TextExpansionCallOut } from './ml_inference/text_expansion_callout/text_expansion_callout'; import { PipelinesLogic } from './pipelines_logic'; export const MlInferencePipelineProcessorsCard: React.FC = () => { diff --git a/x-pack/plugins/features/server/feature_registry.test.ts b/x-pack/plugins/features/server/feature_registry.test.ts index d3021bf339473..e0d0591c67d88 100644 --- a/x-pack/plugins/features/server/feature_registry.test.ts +++ b/x-pack/plugins/features/server/feature_registry.test.ts @@ -52,7 +52,7 @@ describe('FeatureRegistry', () => { app: ['app1'], savedObject: { all: ['space', 'etc', 'telemetry'], - read: ['canvas', 'config', 'url'], + read: ['canvas', 'config', 'config-global', 'url'], }, api: ['someApiEndpointTag', 'anotherEndpointTag'], ui: ['allowsFoo', 'showBar', 'showBaz'], @@ -60,7 +60,7 @@ describe('FeatureRegistry', () => { read: { savedObject: { all: [], - read: ['config', 'url', 'telemetry'], + read: ['config', 'config-global', 'url', 'telemetry'], }, ui: [], }, @@ -125,7 +125,7 @@ describe('FeatureRegistry', () => { app: ['app1'], savedObject: { all: ['space', 'etc', 'telemetry'], - read: ['canvas', 'config', 'url'], + read: ['canvas', 'config', 'config-global', 'url'], }, api: ['someApiEndpointTag', 'anotherEndpointTag'], ui: ['allowsFoo', 'showBar', 'showBaz'], @@ -290,7 +290,7 @@ describe('FeatureRegistry', () => { expect(allPrivilege?.savedObject.all).toEqual(['telemetry']); }); - it(`automatically grants access to config, url, and telemetry saved objects`, () => { + it(`automatically grants access to config, config-global, url, and telemetry saved objects`, () => { const feature: KibanaFeatureConfig = { id: 'test-feature', name: 'Test Feature', @@ -324,11 +324,16 @@ describe('FeatureRegistry', () => { const allPrivilege = result[0].privileges?.all; const readPrivilege = result[0].privileges?.read; - expect(allPrivilege?.savedObject.read).toEqual(['config', 'url']); - expect(readPrivilege?.savedObject.read).toEqual(['config', 'telemetry', 'url']); + expect(allPrivilege?.savedObject.read).toEqual(['config', 'config-global', 'url']); + expect(readPrivilege?.savedObject.read).toEqual([ + 'config', + 'config-global', + 'telemetry', + 'url', + ]); }); - it(`automatically grants 'all' access to telemetry and 'read' to [config, url] saved objects for the reserved privilege`, () => { + it(`automatically grants 'all' access to telemetry and 'read' to [config, config-global, url] saved objects for the reserved privilege`, () => { const feature: KibanaFeatureConfig = { id: 'test-feature', name: 'Test Feature', @@ -359,7 +364,7 @@ describe('FeatureRegistry', () => { const reservedPrivilege = result[0]!.reserved!.privileges[0].privilege; expect(reservedPrivilege.savedObject.all).toEqual(['telemetry']); - expect(reservedPrivilege.savedObject.read).toEqual(['config', 'url']); + expect(reservedPrivilege.savedObject.read).toEqual(['config', 'config-global', 'url']); }); it(`does not duplicate the automatic grants if specified on the incoming feature`, () => { @@ -373,14 +378,14 @@ describe('FeatureRegistry', () => { ui: [], savedObject: { all: ['telemetry'], - read: ['config', 'url'], + read: ['config', 'config-global', 'url'], }, }, read: { ui: [], savedObject: { all: [], - read: ['config', 'url'], + read: ['config', 'config-global', 'url'], }, }, }, @@ -397,8 +402,13 @@ describe('FeatureRegistry', () => { const allPrivilege = result[0].privileges!.all; const readPrivilege = result[0].privileges!.read; expect(allPrivilege?.savedObject.all).toEqual(['telemetry']); - expect(allPrivilege?.savedObject.read).toEqual(['config', 'url']); - expect(readPrivilege?.savedObject.read).toEqual(['config', 'url', 'telemetry']); + expect(allPrivilege?.savedObject.read).toEqual(['config', 'config-global', 'url']); + expect(readPrivilege?.savedObject.read).toEqual([ + 'config', + 'config-global', + 'url', + 'telemetry', + ]); }); it(`does not allow duplicate features to be registered`, () => { @@ -484,7 +494,7 @@ describe('FeatureRegistry', () => { name: 'Foo', app: ['app1', 'app2'], savedObject: { - all: ['config', 'space', 'etc'], + all: ['config', 'config-global', 'space', 'etc'], read: ['canvas'], }, api: ['someApiEndpointTag', 'anotherEndpointTag'], diff --git a/x-pack/plugins/features/server/feature_registry.ts b/x-pack/plugins/features/server/feature_registry.ts index cbcd426f6accf..40c278b2fe4ed 100644 --- a/x-pack/plugins/features/server/feature_registry.ts +++ b/x-pack/plugins/features/server/feature_registry.ts @@ -118,7 +118,12 @@ function applyAutomaticAllPrivilegeGrants( allPrivileges.forEach((allPrivilege) => { if (allPrivilege) { allPrivilege.savedObject.all = uniq([...allPrivilege.savedObject.all, 'telemetry']); - allPrivilege.savedObject.read = uniq([...allPrivilege.savedObject.read, 'config', 'url']); + allPrivilege.savedObject.read = uniq([ + ...allPrivilege.savedObject.read, + 'config', + 'config-global', + 'url', + ]); } }); } @@ -131,6 +136,7 @@ function applyAutomaticReadPrivilegeGrants( readPrivilege.savedObject.read = uniq([ ...readPrivilege.savedObject.read, 'config', + 'config-global', 'telemetry', 'url', ]); diff --git a/x-pack/plugins/fleet/cypress/tasks/common.ts b/x-pack/plugins/fleet/cypress/tasks/common.ts index ebb631b310b17..6d922f6b003fa 100644 --- a/x-pack/plugins/fleet/cypress/tasks/common.ts +++ b/x-pack/plugins/fleet/cypress/tasks/common.ts @@ -49,6 +49,7 @@ export const request = ({ const NEW_FEATURES_TOUR_STORAGE_KEYS = { RULE_MANAGEMENT_PAGE: 'securitySolution.rulesManagementPage.newFeaturesTour.v8.9', + TIMELINES: 'securitySolution.security.timelineFlyoutHeader.saveTimelineTour', }; const disableNewFeaturesTours = (window: Window) => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx index 6de1a3caaa2c1..6e965dc9eca6a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx @@ -63,6 +63,8 @@ describe('AgentLogsUI', () => { const state = { datasets: ['elastic_agent'], logLevels: ['info', 'error'], + start: '2023-20-04T14:00:00.340Z', + end: '2023-20-04T14:20:00.340Z', query: '', } as any; return render(); @@ -97,7 +99,10 @@ describe('AgentLogsUI', () => { it('should render Open in Logs UI if capabilities not set', () => { mockStartServices(); const result = renderComponent(); - expect(result.getByTestId('viewInLogsBtn')).not.toBeNull(); + expect(result.getByTestId('viewInLogsBtn')).toHaveAttribute( + 'href', + `http://localhost:5620/app/logs/stream?logPosition=(end%3A'2023-20-04T14%3A20%3A00.340Z'%2Cstart%3A'2023-20-04T14%3A00%3A00.340Z'%2CstreamLive%3A!f)&logFilter=(expression%3A'elastic_agent.id%3Aagent1%20and%20(data_stream.dataset%3Aelastic_agent)%20and%20(log.level%3Ainfo%20or%20log.level%3Aerror)'%2Ckind%3Akuery)` + ); }); it('should render Open in Discover if serverless enabled', () => { @@ -106,7 +111,7 @@ describe('AgentLogsUI', () => { const viewInDiscover = result.getByTestId('viewInDiscoverBtn'); expect(viewInDiscover).toHaveAttribute( 'href', - `http://localhost:5620/app/discover#/?_a=(index:'logs-*',query:(language:kuery,query:'data_stream.dataset:elastic_agent%20AND%20elastic_agent.id:agent1'))` + `http://localhost:5620/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'2023-20-04T14:00:00.340Z',to:'2023-20-04T14:20:00.340Z'))&_a=(columns:!(event.dataset,message),index:'logs-*',query:(language:kuery,query:'elastic_agent.id:agent1 and (data_stream.dataset:elastic_agent) and (log.level:info or log.level:error)'))` ); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx index 8efef6592f870..05efb3abfdcaa 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx @@ -4,21 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import url from 'url'; -import { stringify } from 'querystring'; - import React, { memo, useMemo, useState, useCallback, useEffect } from 'react'; import styled from 'styled-components'; -import { encode } from '@kbn/rison'; import { EuiFlexGroup, EuiFlexItem, EuiSuperDatePicker, EuiFilterGroup, EuiPanel, - EuiButton, - EuiButtonEmpty, EuiCallOut, EuiLink, } from '@elastic/eui'; @@ -42,6 +35,7 @@ import { LogLevelFilter } from './filter_log_level'; import { LogQueryBar } from './query_bar'; import { buildQuery } from './build_query'; import { SelectLogLevel } from './select_log_level'; +import { ViewLogsButton } from './view_logs_button'; const WrapperFlexGroup = styled(EuiFlexGroup)` height: 100%; @@ -118,7 +112,7 @@ const AgentPolicyLogsNotEnabledCallout: React.FunctionComponent<{ agentPolicy: A export const AgentLogsUI: React.FunctionComponent = memo( ({ agent, agentPolicy, state }) => { - const { data, application, http, cloud } = useStartServices(); + const { data, application, cloud } = useStartServices(); const { update: updateState } = AgentLogsUrlStateHelper.useTransitions(); const isLogsUIAvailable = !cloud?.isServerlessEnabled; @@ -218,37 +212,6 @@ export const AgentLogsUI: React.FunctionComponent = memo( [agent.id, state.datasets, state.logLevels, state.query] ); - // Generate URL to pass page state to Logs UI - const viewInLogsUrl = useMemo( - () => - http.basePath.prepend( - url.format({ - pathname: '/app/logs/stream', - search: stringify({ - logPosition: encode({ - start: state.start, - end: state.end, - streamLive: false, - }), - logFilter: encode({ - expression: logStreamQuery, - kind: 'kuery', - }), - }), - }) - ), - [http.basePath, state.start, state.end, logStreamQuery] - ); - - const viewInDiscoverUrl = useMemo(() => { - const index = 'logs-*'; - const datasetQuery = 'data_stream.dataset:elastic_agent'; - const agentIdQuery = `elastic_agent.id:${agent.id}`; - return http.basePath.prepend( - `/app/discover#/?_a=(index:'${index}',query:(language:kuery,query:'${datasetQuery}%20AND%20${agentIdQuery}'))` - ); - }, [http.basePath, agent.id]); - const agentVersion = agent.local_metadata?.elastic?.agent?.version; const isLogFeatureAvailable = useMemo(() => { if (!agentVersion) { @@ -357,30 +320,12 @@ export const AgentLogsUI: React.FunctionComponent = memo( application, }} > - {isLogsUIAvailable ? ( - - - - ) : ( - - - - )} + diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx new file mode 100644 index 0000000000000..762c34ad7bc36 --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import url from 'url'; +import { stringify } from 'querystring'; + +import React, { useMemo } from 'react'; +import { encode } from '@kbn/rison'; +import { EuiButton } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { useStartServices } from '../../../../../hooks'; + +interface ViewLogsProps { + viewInLogs: boolean; + logStreamQuery: string; + startTime: string; + endTime: string; +} + +/* + Button that takes to the Logs view Ui when that is available, otherwise fallback to the Discover UI + The urls are built using same logStreamQuery (provided by a prop), startTime and endTime, ensuring that they'll both will target same log lines +*/ +export const ViewLogsButton: React.FunctionComponent = ({ + viewInLogs, + logStreamQuery, + startTime, + endTime, +}) => { + const { http } = useStartServices(); + + // Generate URL to pass page state to Logs UI + const viewInLogsUrl = useMemo( + () => + http.basePath.prepend( + url.format({ + pathname: '/app/logs/stream', + search: stringify({ + logPosition: encode({ + start: startTime, + end: endTime, + streamLive: false, + }), + logFilter: encode({ + expression: logStreamQuery, + kind: 'kuery', + }), + }), + }) + ), + [http.basePath, startTime, endTime, logStreamQuery] + ); + + const viewInDiscoverUrl = useMemo(() => { + const index = 'logs-*'; + const query = encode({ + query: logStreamQuery, + language: 'kuery', + }); + return http.basePath.prepend( + `/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'${startTime}',to:'${endTime}'))&_a=(columns:!(event.dataset,message),index:'${index}',query:${query})` + ); + }, [logStreamQuery, http.basePath, startTime, endTime]); + + return viewInLogs ? ( + + + + ) : ( + + + + ); +}; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx index dffa4bc665bdb..1518a68fd6f0c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.test.tsx @@ -244,8 +244,7 @@ describe('AgentUpgradeStatus', () => { expect(results.queryAllByText('Info')).toEqual([]); }); - // Unskip this test when minVersion is set. - it.skip('should render an icon with tooltip if the agent is upgrading', async () => { + it('should render an icon with tooltip if the agent is upgrading', async () => { const results = render({ agentUpgradeStartedAt: '2023-10-03T14:34:12Z', agentUpgradedAt: null, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx index 572b86d62c73d..ab4835757f94d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_upgrade_status.tsx @@ -225,7 +225,7 @@ export const AgentUpgradeStatus: React.FC<{ [agentUpgradeStartedAt, agentUpgradedAt] ); const status = useMemo(() => getStatusComponents(agentUpgradeDetails), [agentUpgradeDetails]); - const minVersion = undefined; // Change this to a string in order for a tooltip to render for upgrading agents with no upgrade details. + const minVersion = '8.12'; if (isAgentUpgradable) { return ( @@ -249,7 +249,7 @@ export const AgentUpgradeStatus: React.FC<{ ); } - if (minVersion && isAgentUpgrading) { + if (isAgentUpgrading) { return ( { + return { + ...jest.requireActual('../../../../hooks'), + useLink: jest.fn(), + useStartServices: jest.fn(), + }; +}); + +const mockUseStartServices = useStartServices as jest.Mock; + jest.mock('@kbn/shared-ux-link-redirect-app', () => ({ RedirectAppLinks: (props: any) => { return
    {props.children}
    ; }, })); -jest.mock('../../../../hooks', () => { - return { - useStartServices: jest.fn().mockReturnValue({ - http: { - basePath: { - prepend: jest.fn().mockImplementation((str) => 'http://localhost' + str), +const mockStartServices = (isServerlessEnabled?: boolean) => { + mockUseStartServices.mockReturnValue({ + application: {}, + data: { + query: { + timefilter: { + timefilter: { + calculateBounds: jest.fn().mockReturnValue({ + min: '2023-10-04T13:08:53.340Z', + max: '2023-10-05T13:08:53.340Z', + }), + }, }, }, - }), - }; -}); + }, + http: { + basePath: { + prepend: (url: string) => 'http://localhost:5620' + url, + }, + }, + cloud: { + isServerlessEnabled, + }, + }); +}; describe('ViewErrors', () => { const renderComponent = (action: ActionStatus) => { @@ -41,7 +67,30 @@ describe('ViewErrors', () => { ); }; - it('should render error message with btn to logs', () => { + it('should render error message with btn to Logs view if serverless not enabled', () => { + mockStartServices(); + const result = renderComponent({ + actionId: 'action1', + latestErrors: [ + { + agentId: 'agent1', + error: 'Agent agent1 is not upgradeable', + timestamp: '2023-03-06T14:51:24.709Z', + }, + ], + } as any); + + const errorText = result.getByTestId('errorText'); + expect(errorText.textContent).toEqual('Agent agent1 is not upgradeable'); + + const viewErrorBtn = result.getByTestId('viewInLogsBtn'); + expect(viewErrorBtn.getAttribute('href')).toEqual( + `http://localhost:5620/app/logs/stream?logPosition=(end%3A'2023-03-06T14%3A56%3A24.709Z'%2Cstart%3A'2023-03-06T14%3A46%3A24.709Z'%2CstreamLive%3A!f)&logFilter=(expression%3A'elastic_agent.id%3Aagent1%20and%20(data_stream.dataset%3Aelastic_agent)%20and%20(log.level%3Aerror)'%2Ckind%3Akuery)` + ); + }); + + it('should render error message with btn to Discover view if serverless enabled', () => { + mockStartServices(true); const result = renderComponent({ actionId: 'action1', latestErrors: [ @@ -56,9 +105,9 @@ describe('ViewErrors', () => { const errorText = result.getByTestId('errorText'); expect(errorText.textContent).toEqual('Agent agent1 is not upgradeable'); - const viewErrorBtn = result.getByTestId('viewLogsBtn'); + const viewErrorBtn = result.getByTestId('viewInDiscoverBtn'); expect(viewErrorBtn.getAttribute('href')).toEqual( - `http://localhost/app/logs/stream?logPosition=(position%3A(time%3A1678114284709)%2CstreamLive%3A!f)&logFilter=(expression%3A'elastic_agent.id%3Aagent1%20and%20(data_stream.dataset%3Aelastic_agent)%20and%20(log.level%3Aerror)'%2Ckind%3Akuery)` + `http://localhost:5620/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'2023-03-06T14:46:24.709Z',to:'2023-03-06T14:56:24.709Z'))&_a=(columns:!(event.dataset,message),index:'logs-*',query:(language:kuery,query:'elastic_agent.id:agent1 and (data_stream.dataset:elastic_agent) and (log.level:error)'))` ); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx index d49be8d4cacda..4d43c9a60a618 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx @@ -5,21 +5,19 @@ * 2.0. */ -import { stringify } from 'querystring'; - import styled from 'styled-components'; import React from 'react'; -import { encode } from '@kbn/rison'; import type { EuiBasicTableProps } from '@elastic/eui'; -import { EuiButton, EuiAccordion, EuiToolTip, EuiText, EuiBasicTable } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiAccordion, EuiToolTip, EuiText, EuiBasicTable } from '@elastic/eui'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; +import moment from 'moment'; import { i18n } from '@kbn/i18n'; import type { ActionErrorResult } from '../../../../../../../common/types'; import { buildQuery } from '../../agent_details_page/components/agent_logs/build_query'; +import { ViewLogsButton } from '../../agent_details_page/components/agent_logs/view_logs_button'; import type { ActionStatus } from '../../../../types'; import { useStartServices } from '../../../../hooks'; @@ -32,27 +30,26 @@ const TruncatedEuiText = styled(EuiText)` export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ action }) => { const coreStart = useStartServices(); + const isLogsUIAvailable = !coreStart.cloud?.isServerlessEnabled; + + const getLogsButton = (agentId: string, timestamp: string, viewInLogs: boolean) => { + const startTime = moment(timestamp).subtract(5, 'm').toISOString(); + const endTime = moment(timestamp).add(5, 'm').toISOString(); - const logStreamQuery = (agentId: string) => - buildQuery({ + const logStreamQuery = buildQuery({ agentId, datasets: ['elastic_agent'], logLevels: ['error'], userQuery: '', }); - - const getErrorLogsUrl = (agentId: string, timestamp: string) => { - const queryParams = stringify({ - logPosition: encode({ - position: { time: Date.parse(timestamp) }, - streamLive: false, - }), - logFilter: encode({ - expression: logStreamQuery(agentId), - kind: 'kuery', - }), - }); - return coreStart.http.basePath.prepend(`/app/logs/stream?${queryParams}`); + return ( + + ); }; const columns: EuiBasicTableProps['columns'] = [ @@ -89,16 +86,7 @@ export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ const errorItem = (action.latestErrors ?? []).find((item) => item.agentId === agentId); return ( - - - + {getLogsButton(agentId, errorItem!.timestamp, !!isLogsUIAvailable)} ); }, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx index ddd68d8380419..2308cc824db6d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.test.tsx @@ -11,6 +11,7 @@ import type { Output } from '../../../../types'; import { createFleetTestRendererMock } from '../../../../../../mock'; import { useFleetStatus } from '../../../../../../hooks/use_fleet_status'; import { ExperimentalFeaturesService } from '../../../../../../services'; +import { useStartServices } from '../../../../hooks'; import { EditOutputFlyout } from '.'; @@ -25,6 +26,16 @@ jest.mock('../../../../../../hooks/use_fleet_status', () => ({ useFleetStatus: jest.fn().mockReturnValue({}), })); +jest.mock('../../../../hooks', () => { + return { + ...jest.requireActual('../../../../hooks'), + useBreadcrumbs: jest.fn(), + useStartServices: jest.fn(), + }; +}); + +const mockUseStartServices = useStartServices as jest.Mock; + const mockedUsedFleetStatus = useFleetStatus as jest.MockedFunction; function renderFlyout(output?: Output) { @@ -67,6 +78,22 @@ const kafkaSectionsLabels = [ const remoteEsOutputLabels = ['Hosts', 'Service Token']; describe('EditOutputFlyout', () => { + const mockStartServices = (isServerlessEnabled?: boolean) => { + mockUseStartServices.mockReturnValue({ + notifications: { toasts: {} }, + docLinks: { + links: { fleet: {}, logstash: {}, kibana: {} }, + }, + cloud: { + isServerlessEnabled, + }, + }); + }; + + beforeEach(() => { + mockStartServices(false); + }); + it('should render the flyout if there is not output provided', async () => { renderFlyout(); }); @@ -177,5 +204,26 @@ describe('EditOutputFlyout', () => { expect(utils.queryByLabelText(label)).not.toBeNull(); }); expect(utils.queryByTestId('serviceTokenCallout')).not.toBeNull(); + + expect(utils.queryByTestId('settingsOutputsFlyout.typeInput')?.textContent).toContain( + 'Remote Elasticsearch' + ); + }); + + it('should not display remote ES output in type lists if serverless', async () => { + jest.spyOn(ExperimentalFeaturesService, 'get').mockReturnValue({ remoteESOutput: true }); + mockUseStartServices.mockReset(); + mockStartServices(true); + const { utils } = renderFlyout({ + type: 'elasticsearch', + name: 'dummy', + id: 'output', + is_default: false, + is_default_monitoring: false, + }); + + expect(utils.queryByTestId('settingsOutputsFlyout.typeInput')?.textContent).not.toContain( + 'Remote Elasticsearch' + ); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx index b35162bc51667..62732c12d189c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/edit_output_flyout/index.tsx @@ -70,7 +70,7 @@ export const EditOutputFlyout: React.FunctionComponent = useBreadcrumbs('settings'); const form = useOutputForm(onClose, output); const inputs = form.inputs; - const { docLinks } = useStartServices(); + const { docLinks, cloud } = useStartServices(); const { euiTheme } = useEuiTheme(); const { outputSecretsStorage: isOutputSecretsStorageEnabled } = ExperimentalFeaturesService.get(); const [useSecretsStorage, setUseSecretsStorage] = React.useState(isOutputSecretsStorageEnabled); @@ -87,10 +87,12 @@ export const EditOutputFlyout: React.FunctionComponent = const { kafkaOutput: isKafkaOutputEnabled, remoteESOutput: isRemoteESOutputEnabled } = ExperimentalFeaturesService.get(); const isRemoteESOutput = inputs.typeInput.value === outputType.RemoteElasticsearch; + // Remote ES output not yet supported in serverless + const isStateful = !cloud?.isServerlessEnabled; const OUTPUT_TYPE_OPTIONS = [ { value: outputType.Elasticsearch, text: 'Elasticsearch' }, - ...(isRemoteESOutputEnabled + ...(isRemoteESOutputEnabled && isStateful ? [{ value: outputType.RemoteElasticsearch, text: 'Remote Elasticsearch' }] : []), { value: outputType.Logstash, text: 'Logstash' }, @@ -320,7 +322,7 @@ export const EditOutputFlyout: React.FunctionComponent = case outputType.Elasticsearch: return i18n.translate('xpack.fleet.settings.editOutputFlyout.esOutputTypeCallout', { defaultMessage: - 'This output type does not support connectivity to a remote Elasticsearch cluster, please the Remote Elasticsearch type for that.', + 'This output type does not support connectivity to a remote Elasticsearch cluster, please use the Remote Elasticsearch type for that.', }); } }; @@ -333,7 +335,7 @@ export const EditOutputFlyout: React.FunctionComponent = defaultMessage="Enter your output hosts, service token for your remote cluster, and any advanced YAML configuration. Learn more about how to use these parameters in {doc}." values={{ doc: ( - + {i18n.translate('xpack.fleet.settings.editOutputFlyout.docLabel', { defaultMessage: 'our documentation', })} diff --git a/x-pack/plugins/fleet/public/applications/integrations/components/header/deployment_details.tsx b/x-pack/plugins/fleet/public/applications/integrations/components/header/deployment_details.tsx index ea17bc3f201c4..dd43244da0c41 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/components/header/deployment_details.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/components/header/deployment_details.tsx @@ -32,9 +32,9 @@ export const DeploymentDetails = () => { } const button = ( - setIsOpen(!isOpen)} iconType="iInCircle" iconSide="left" isActive> - {i18n.translate('xpack.fleet.integrations.endpointsButton', { - defaultMessage: 'Endpoints', + setIsOpen(!isOpen)} isActive> + {i18n.translate('xpack.fleet.integrations.connectionDetailsButton', { + defaultMessage: 'Connection details', })} ); diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx index 9c2ca98479a85..adeb17a5efdcc 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/settings/settings.tsx @@ -141,6 +141,11 @@ export const SettingsPage: React.FC = memo(({ packageInfo, theme$ }: Prop [packagePoliciesData] ); + const agentPolicyIds = useMemo( + () => packagePoliciesData?.items.map(({ policy_id: agentPolicyId }) => agentPolicyId) ?? [], + [packagePoliciesData] + ); + const { data: dryRunData } = useUpgradePackagePolicyDryRunQuery( packagePolicyIds ?? [], latestVersion, @@ -329,6 +334,7 @@ export const SettingsPage: React.FC = memo(({ packageInfo, theme$ }: Prop { dryRunData?: UpgradePackagePolicyDryRunResponse | null; packagePolicyIds?: string[]; + agentPolicyIds: string[]; isUpgradingPackagePolicies?: boolean; setIsUpgradingPackagePolicies?: React.Dispatch>; theme$: Observable; @@ -73,6 +73,7 @@ export const UpdateButton: React.FunctionComponent = ({ isUpgradingPackagePolicies = false, name, packagePolicyIds = [], + agentPolicyIds = [], setIsUpgradingPackagePolicies = () => {}, title, version, @@ -92,16 +93,7 @@ export const UpdateButton: React.FunctionComponent = ({ const [isUpdateModalVisible, setIsUpdateModalVisible] = useState(false); const [upgradePackagePolicies, setUpgradePackagePolicies] = useState(true); - const { data: agentPolicyData } = useGetAgentPoliciesQuery({ - perPage: SO_SEARCH_LIMIT, - page: 1, - // Fetch all agent policies that include one of the eligible package policies - kuery: packagePolicyIds.length - ? `${AGENT_POLICY_SAVED_OBJECT_TYPE}.package_policies:${packagePolicyIds - .map((id) => `"${id}"`) - .join(' or ')}` - : '', - }); + const { data: agentPolicyData } = useBulkGetAgentPoliciesQuery(agentPolicyIds, { full: true }); const packagePolicyCount = useMemo(() => packagePolicyIds.length, [packagePolicyIds]); diff --git a/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx b/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx index 4090c4520bf2a..26668c4062981 100644 --- a/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx +++ b/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx @@ -14,8 +14,12 @@ import { useStartServices } from './hooks'; import type { PackageAssetsComponent } from './types'; export const CustomLogsAssetsExtension: PackageAssetsComponent = () => { - const { http } = useStartServices(); - const logStreamUrl = http.basePath.prepend('/app/logs/stream'); + const { http, cloud } = useStartServices(); + const isLogsUIAvailable = !cloud?.isServerlessEnabled; + // if logs ui is not available, link to discover + const logStreamUrl = isLogsUIAvailable + ? http.basePath.prepend('/app/logs/stream') + : http.basePath.prepend('/app/discover'); const views: CustomAssetsAccordionProps['views'] = [ { diff --git a/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts b/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts index ee0481bd373af..6ce49febdeca2 100644 --- a/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts +++ b/x-pack/plugins/fleet/public/hooks/use_request/agent_policy.ts @@ -22,6 +22,7 @@ import type { CopyAgentPolicyResponse, DeleteAgentPolicyRequest, DeleteAgentPolicyResponse, + BulkGetAgentPoliciesResponse, } from '../../types'; import { useRequest, sendRequest, useConditionalRequest, sendRequestForRq } from './use_request'; @@ -47,6 +48,17 @@ export const useGetAgentPoliciesQuery = (query?: GetAgentPoliciesRequest['query' ); }; +export const useBulkGetAgentPoliciesQuery = (ids: string[], options?: { full?: boolean }) => { + return useQuery(['agentPolicies', ids], () => + sendRequestForRq({ + path: agentPolicyRouteService.getBulkGetPath(), + method: 'post', + body: JSON.stringify({ ids, full: options?.full }), + version: API_VERSIONS.public.v1, + }) + ); +}; + export const sendGetAgentPolicies = (query?: GetAgentPoliciesRequest['query']) => { return sendRequest({ path: agentPolicyRouteService.getListPath(), diff --git a/x-pack/plugins/fleet/public/types/index.ts b/x-pack/plugins/fleet/public/types/index.ts index 8c7d3ddcf5b45..63837dc809559 100644 --- a/x-pack/plugins/fleet/public/types/index.ts +++ b/x-pack/plugins/fleet/public/types/index.ts @@ -137,6 +137,7 @@ export type { KibanaSavedObjectType, GetInputsTemplatesRequest, GetInputsTemplatesResponse, + BulkGetAgentPoliciesResponse, } from '../../common/types'; export { entries, diff --git a/x-pack/plugins/fleet/server/errors/handlers.ts b/x-pack/plugins/fleet/server/errors/handlers.ts index edc34d50598ec..7bd380af258e2 100644 --- a/x-pack/plugins/fleet/server/errors/handlers.ts +++ b/x-pack/plugins/fleet/server/errors/handlers.ts @@ -34,6 +34,13 @@ import { PackagePolicyNotFoundError, FleetUnauthorizedError, PackagePolicyNameExistsError, + PackageOutdatedError, + PackageInvalidArchiveError, + BundledPackageLocationNotFoundError, + PackageRemovalError, + PackageESError, + KibanaSOReferenceError, + PackageAlreadyInstalledError, } from '.'; type IngestErrorHandler = ( @@ -47,30 +54,30 @@ interface IngestErrorHandlerParams { } // unsure if this is correct. would prefer to use something "official" // this type is based on BadRequest values observed while debugging https://github.com/elastic/kibana/issues/75862 - const getHTTPResponseCode = (error: FleetError): number => { - if (error instanceof RegistryResponseError) { - // 4xx/5xx's from EPR - return 500; + // Bad Request + if (error instanceof PackageFailedVerificationError) { + return 400; } - if (error instanceof RegistryConnectionError || error instanceof RegistryError) { - // Connection errors (ie. RegistryConnectionError) / fallback (RegistryError) from EPR - return 502; // Bad Gateway + if (error instanceof PackageOutdatedError) { + return 400; } - if (error instanceof PackageNotFoundError || error instanceof PackagePolicyNotFoundError) { - return 404; // Not Found + if (error instanceof PackageInvalidArchiveError) { + return 400; } - if (error instanceof AgentPolicyNameExistsError) { - return 409; // Conflict + if (error instanceof PackageRemovalError) { + return 400; } - if (error instanceof PackageUnsupportedMediaTypeError) { - return 415; // Unsupported Media Type + if (error instanceof KibanaSOReferenceError) { + return 400; } - if (error instanceof PackageFailedVerificationError) { - return 400; // Bad Request + // Unauthorized + if (error instanceof FleetUnauthorizedError) { + return 403; } - if (error instanceof ConcurrentInstallOperationError) { - return 409; // Conflict + // Not Found + if (error instanceof PackageNotFoundError || error instanceof PackagePolicyNotFoundError) { + return 404; } if (error instanceof AgentNotFoundError) { return 404; @@ -78,14 +85,41 @@ const getHTTPResponseCode = (error: FleetError): number => { if (error instanceof AgentActionNotFoundError) { return 404; } - if (error instanceof FleetUnauthorizedError) { - return 403; // Unauthorized + // Conflict + if (error instanceof AgentPolicyNameExistsError) { + return 409; + } + if (error instanceof ConcurrentInstallOperationError) { + return 409; } if (error instanceof PackagePolicyNameExistsError) { - return 409; // Conflict + return 409; + } + if (error instanceof PackageAlreadyInstalledError) { + return 409; + } + // Unsupported Media Type + if (error instanceof PackageUnsupportedMediaTypeError) { + return 415; } + // Internal Server Error if (error instanceof UninstallTokenError) { - return 500; // Internal Error + return 500; + } + if (error instanceof BundledPackageLocationNotFoundError) { + return 500; + } + if (error instanceof PackageESError) { + return 500; + } + if (error instanceof RegistryResponseError) { + // 4xx/5xx's from EPR + return 500; + } + // Bad Gateway + if (error instanceof RegistryConnectionError || error instanceof RegistryError) { + // Connection errors (ie. RegistryConnectionError) / fallback (RegistryError) from EPR + return 502; } return 400; // Bad Request }; @@ -115,7 +149,7 @@ export function fleetErrorToResponseOptions(error: IngestErrorHandlerParams['err }; } - // not sure what type of error this is. log as much as possible + // default response is 500 logger.error(error); return { statusCode: 500, diff --git a/x-pack/plugins/fleet/server/errors/index.ts b/x-pack/plugins/fleet/server/errors/index.ts index 0b2c6b0fc5e93..7f607f4692774 100644 --- a/x-pack/plugins/fleet/server/errors/index.ts +++ b/x-pack/plugins/fleet/server/errors/index.ts @@ -26,8 +26,9 @@ export class RegistryResponseError extends RegistryError { super(message); } } + +// Package errors export class PackageNotFoundError extends FleetError {} -export class PackageKeyInvalidError extends FleetError {} export class PackageOutdatedError extends FleetError {} export class PackageFailedVerificationError extends FleetError { constructor(pkgName: string, pkgVersion: string) { @@ -37,22 +38,25 @@ export class PackageFailedVerificationError extends FleetError { }; } } +export class PackageUnsupportedMediaTypeError extends FleetError {} +export class PackageInvalidArchiveError extends FleetError {} +export class PackageRemovalError extends FleetError {} +export class PackageESError extends FleetError {} +export class ConcurrentInstallOperationError extends FleetError {} +export class BundledPackageLocationNotFoundError extends FleetError {} +export class KibanaSOReferenceError extends FleetError {} +export class PackageAlreadyInstalledError extends FleetError {} + export class AgentPolicyError extends FleetError {} export class AgentPolicyNotFoundError extends FleetError {} export class AgentNotFoundError extends FleetError {} export class AgentActionNotFoundError extends FleetError {} export class AgentPolicyNameExistsError extends AgentPolicyError {} -export class PackageUnsupportedMediaTypeError extends FleetError {} -export class PackageInvalidArchiveError extends FleetError {} -export class PackageCacheError extends FleetError {} -export class PackageOperationNotSupportedError extends FleetError {} -export class ConcurrentInstallOperationError extends FleetError {} export class AgentReassignmentError extends FleetError {} export class PackagePolicyIneligibleForUpgradeError extends FleetError {} export class PackagePolicyValidationError extends FleetError {} export class PackagePolicyNameExistsError extends FleetError {} export class PackagePolicyNotFoundError extends FleetError {} -export class BundledPackageNotFoundError extends FleetError {} export class HostedAgentPolicyRestrictionRelatedError extends FleetError { constructor(message = 'Cannot perform that action') { super( diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index 0373971c664e2..8333d0257a8f0 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -524,6 +524,9 @@ export class FleetPlugin this.policyWatcher.start(licenseService); + // We only retry when this feature flag is enabled (Serverless) + const setupAttempts = this.configInitialValue.internal?.retrySetupOnBoot ? 25 : 1; + const fleetSetupPromise = (async () => { try { // Fleet remains `available` during setup as to excessively delay Kibana's boot process. @@ -555,10 +558,9 @@ export class FleetPlugin ); }, { - // We only retry when this feature flag is enabled - numOfAttempts: this.configInitialValue.internal?.retrySetupOnBoot ? Infinity : 1, - // 250ms initial backoff - startingDelay: 250, + numOfAttempts: setupAttempts, + // 1s initial backoff + startingDelay: 1000, // 5m max backoff maxDelay: 60000 * 5, timeMultiple: 2, @@ -566,7 +568,7 @@ export class FleetPlugin jitter: 'full', retry: (error: any, attemptCount: number) => { const summary = `Fleet setup attempt ${attemptCount} failed, will retry after backoff`; - logger.debug(summary, { error: { message: error } }); + logger.warn(summary, { error: { message: error } }); this.fleetStatus$.next({ level: ServiceStatusLevels.available, @@ -586,7 +588,9 @@ export class FleetPlugin summary: 'Fleet is available', }); } catch (error) { - logger.warn('Fleet setup failed', { error: { message: error } }); + logger.warn(`Fleet setup failed after ${setupAttempts} attempts`, { + error: { message: error }, + }); this.fleetStatus$.next({ // As long as Fleet has a dependency on EPR, we can't reliably set Kibana status to `unavailable` here. diff --git a/x-pack/plugins/fleet/server/routes/output/handler.test.ts b/x-pack/plugins/fleet/server/routes/output/handler.test.ts new file mode 100644 index 0000000000000..84443b3ad7196 --- /dev/null +++ b/x-pack/plugins/fleet/server/routes/output/handler.test.ts @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { agentPolicyService, appContextService, outputService } from '../../services'; + +import { postOutputHandler, putOutputHandler } from './handler'; + +describe('output handler', () => { + const mockContext = { + core: Promise.resolve({ + savedObjects: {}, + elasticsearch: { + client: {}, + }, + }), + } as any; + const mockResponse = { + customError: jest.fn().mockImplementation((options) => options), + ok: jest.fn().mockImplementation((options) => options), + }; + + beforeEach(() => { + jest.spyOn(appContextService, 'getLogger').mockReturnValue({ error: jest.fn() } as any); + jest.spyOn(outputService, 'create').mockResolvedValue({ id: 'output1' } as any); + jest.spyOn(outputService, 'update').mockResolvedValue({ id: 'output1' } as any); + jest.spyOn(outputService, 'get').mockResolvedValue({ id: 'output1' } as any); + jest.spyOn(agentPolicyService, 'bumpAllAgentPoliciesForOutput').mockResolvedValue({} as any); + }); + + it('should return error on post output using remote_elasticsearch in serverless', async () => { + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); + + const res = await postOutputHandler( + mockContext, + { body: { id: 'output1', type: 'remote_elasticsearch' } } as any, + mockResponse as any + ); + + expect(res).toEqual({ + body: { message: 'Output type remote_elasticsearch not supported in serverless' }, + statusCode: 400, + }); + }); + + it('should return ok on post output using remote_elasticsearch in stateful', async () => { + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: false } as any); + + const res = await postOutputHandler( + mockContext, + { body: { type: 'remote_elasticsearch' } } as any, + mockResponse as any + ); + + expect(res).toEqual({ body: { item: { id: 'output1' } } }); + }); + + it('should return error on put output using remote_elasticsearch in serverless', async () => { + jest.spyOn(appContextService, 'getCloud').mockReturnValue({ isServerlessEnabled: true } as any); + + const res = await putOutputHandler( + mockContext, + { body: { id: 'output1', type: 'remote_elasticsearch' } } as any, + mockResponse as any + ); + + expect(res).toEqual({ + body: { message: 'Output type remote_elasticsearch not supported in serverless' }, + statusCode: 400, + }); + }); + + it('should return ok on put output using remote_elasticsearch in stateful', async () => { + jest + .spyOn(appContextService, 'getCloud') + .mockReturnValue({ isServerlessEnabled: false } as any); + + const res = await putOutputHandler( + mockContext, + { body: { type: 'remote_elasticsearch' }, params: { outputId: 'output1' } } as any, + mockResponse as any + ); + + expect(res).toEqual({ body: { item: { id: 'output1' } } }); + }); +}); diff --git a/x-pack/plugins/fleet/server/routes/output/handler.ts b/x-pack/plugins/fleet/server/routes/output/handler.ts index 475e7e9625504..e100d9fd67e47 100644 --- a/x-pack/plugins/fleet/server/routes/output/handler.ts +++ b/x-pack/plugins/fleet/server/routes/output/handler.ts @@ -10,6 +10,8 @@ import type { TypeOf } from '@kbn/config-schema'; import Boom from '@hapi/boom'; +import type { ValueOf } from '@elastic/eui'; + import { outputType } from '../../../common/constants'; import type { @@ -23,11 +25,12 @@ import type { GetOneOutputResponse, GetOutputsResponse, Output, + OutputType, PostLogstashApiKeyResponse, } from '../../../common/types'; import { outputService } from '../../services/output'; import { defaultFleetErrorHandler, FleetUnauthorizedError } from '../../errors'; -import { agentPolicyService } from '../../services'; +import { agentPolicyService, appContextService } from '../../services'; import { generateLogstashApiKey, canCreateLogstashApiKey } from '../../services/api_keys'; function ensureNoDuplicateSecrets(output: Partial) { @@ -89,8 +92,9 @@ export const putOutputHandler: RequestHandler< const soClient = coreContext.savedObjects.client; const esClient = coreContext.elasticsearch.client.asInternalUser; const outputUpdate = request.body; - ensureNoDuplicateSecrets(outputUpdate); try { + validateOutputServerless(outputUpdate.type); + ensureNoDuplicateSecrets(outputUpdate); await outputService.update(soClient, esClient, request.params.outputId, outputUpdate); const output = await outputService.get(soClient, request.params.outputId); if (output.is_default || output.is_default_monitoring) { @@ -125,6 +129,7 @@ export const postOutputHandler: RequestHandler< const esClient = coreContext.elasticsearch.client.asInternalUser; try { const { id, ...newOutput } = request.body; + validateOutputServerless(newOutput.type); ensureNoDuplicateSecrets(newOutput); const output = await outputService.create(soClient, esClient, newOutput, { id }); if (output.is_default || output.is_default_monitoring) { @@ -141,6 +146,13 @@ export const postOutputHandler: RequestHandler< } }; +function validateOutputServerless(type?: ValueOf): void { + const cloudSetup = appContextService.getCloud(); + if (cloudSetup?.isServerlessEnabled && type === outputType.RemoteElasticsearch) { + throw Boom.badRequest('Output type remote_elasticsearch not supported in serverless'); + } +} + export const deleteOutputHandler: RequestHandler< TypeOf > = async (context, request, response) => { diff --git a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts index 8bd0f823cb5c6..10d8c7560b269 100644 --- a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts +++ b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts @@ -368,7 +368,7 @@ spec: value: "1" # Set to true to communicate with Fleet with either insecure HTTP or unverified HTTPS - name: FLEET_INSECURE - value: "true" + value: "false" # Fleet Server URL to enroll the Elastic Agent into # FLEET_URL can be found in Kibana, go to Management > Fleet > Settings - name: FLEET_URL @@ -393,7 +393,7 @@ spec: valueFrom: fieldRef: fieldPath: metadata.name - # The following ELASTIC_NETINFO:false variable will disable the netinfo.enabled option of add-host-metadata processor. This will remove fields host.ip and host.mac. + # The following ELASTIC_NETINFO:false variable will disable the netinfo.enabled option of add-host-metadata processor. This will remove fields host.ip and host.mac. # For more info: https://www.elastic.co/guide/en/beats/metricbeat/current/add-host-metadata.html - name: ELASTIC_NETINFO value: "false" diff --git a/x-pack/plugins/fleet/server/services/epm/agent/agent.ts b/x-pack/plugins/fleet/server/services/epm/agent/agent.ts index 077aa720b96d8..0bc220a500fb1 100644 --- a/x-pack/plugins/fleet/server/services/epm/agent/agent.ts +++ b/x-pack/plugins/fleet/server/services/epm/agent/agent.ts @@ -10,17 +10,18 @@ import { safeLoad, safeDump } from 'js-yaml'; import type { PackagePolicyConfigRecord } from '../../../../common/types'; import { toCompiledSecretRef } from '../../secrets'; +import { PackageInvalidArchiveError } from '../../../errors'; const handlebars = Handlebars.create(); export function compileTemplate(variables: PackagePolicyConfigRecord, templateStr: string) { - const { vars, yamlValues } = buildTemplateVariables(variables, templateStr); + const { vars, yamlValues } = buildTemplateVariables(variables); let compiledTemplate: string; try { const template = handlebars.compile(templateStr, { noEscape: true }); compiledTemplate = template(vars); } catch (err) { - throw new Error(`Error while compiling agent template: ${err.message}`); + throw new PackageInvalidArchiveError(`Error while compiling agent template: ${err.message}`); } compiledTemplate = replaceRootLevelYamlVariables(yamlValues, compiledTemplate); @@ -64,7 +65,7 @@ function replaceVariablesInYaml(yamlVariables: { [k: string]: any }, yaml: any) return yaml; } -function buildTemplateVariables(variables: PackagePolicyConfigRecord, templateStr: string) { +function buildTemplateVariables(variables: PackagePolicyConfigRecord) { const yamlValues: { [k: string]: any } = {}; const vars = Object.entries(variables).reduce((acc, [key, recordEntry]) => { // support variables with . like key.patterns @@ -72,13 +73,17 @@ function buildTemplateVariables(variables: PackagePolicyConfigRecord, templateSt const lastKeyPart = keyParts.pop(); if (!lastKeyPart || !isValidKey(lastKeyPart)) { - throw new Error('Invalid key'); + throw new PackageInvalidArchiveError( + `Error while compiling agent template: Invalid key ${lastKeyPart}` + ); } let varPart = acc; for (const keyPart of keyParts) { if (!isValidKey(keyPart)) { - throw new Error('Invalid key'); + throw new PackageInvalidArchiveError( + `Error while compiling agent template: Invalid key ${keyPart}` + ); } if (!varPart[keyPart]) { varPart[keyPart] = {}; diff --git a/x-pack/plugins/fleet/server/services/epm/archive/storage.ts b/x-pack/plugins/fleet/server/services/epm/archive/storage.ts index cfa110589a010..81d55c5fd3138 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/storage.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/storage.ts @@ -19,6 +19,7 @@ import type { InstallSource, PackageAssetReference, } from '../../../../common/types'; +import { PackageInvalidArchiveError, PackageNotFoundError } from '../../../errors'; import { appContextService } from '../../app_context'; @@ -70,13 +71,13 @@ export async function archiveEntryToESDocument(opts: { // validation: filesize? asset type? anything else if (dataUtf8.length > currentMaxAssetBytes) { - throw new Error( + throw new PackageInvalidArchiveError( `File at ${path} is larger than maximum allowed size of ${currentMaxAssetBytes}` ); } if (dataBase64.length > currentMaxAssetBytes) { - throw new Error( + throw new PackageInvalidArchiveError( `After base64 encoding file at ${path} is larger than maximum allowed size of ${currentMaxAssetBytes}` ); } @@ -113,7 +114,7 @@ export async function saveArchiveEntries(opts: { const bulkBody = await Promise.all( paths.map((path) => { const buffer = getArchiveEntry(path); - if (!buffer) throw new Error(`Could not find ArchiveEntry at ${path}`); + if (!buffer) throw new PackageNotFoundError(`Could not find ArchiveEntry at ${path}`); const { name, version } = packageInfo; return archiveEntryToBulkCreateObject({ path, buffer, name, version, installSource }); }) diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts index 3aa86b526addd..61a75d28b7999 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/ilm/install.ts @@ -14,6 +14,7 @@ import { getAsset, getPathParts } from '../../archive'; import { updateEsAssetReferences } from '../../packages/install'; import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; +import { PackageInvalidArchiveError } from '../../../../errors'; export async function installILMPolicy( packageInfo: InstallablePackage, @@ -57,7 +58,7 @@ export async function installILMPolicy( { logger } ); } catch (err) { - throw new Error(err.message); + throw new PackageInvalidArchiveError(`Couldn't install ilm policies: ${err.message}`); } }) ); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts index d65d8de5a3828..2e67c70874e4e 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/install.ts @@ -535,7 +535,7 @@ export function prepareTemplate({ const validFields = processFields(fields); - const mappings = generateMappings(validFields); + const mappings = generateMappings(validFields, isIndexModeTimeSeries); const templateName = generateTemplateName(dataStream); const templateIndexPattern = generateTemplateIndexPattern(dataStream); const templatePriority = getTemplatePriority(dataStream); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts index 96a2547c9e58d..a621df33062a8 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.test.ts @@ -897,7 +897,30 @@ describe('EPM template', () => { }; const fields: Field[] = safeLoad(literalYml); const processedFields = processFields(fields); - const mappings = generateMappings(processedFields); + const mappings = generateMappings(processedFields, true); + expect(mappings).toEqual(expectedMapping); + }); + + it('tests processing dimension field on a keyword - tsdb disabled', () => { + const literalYml = ` +- name: example.id + type: keyword + dimension: true + `; + const expectedMapping = { + properties: { + example: { + properties: { + id: { + type: 'keyword', + }, + }, + }, + }, + }; + const fields: Field[] = safeLoad(literalYml); + const processedFields = processFields(fields); + const mappings = generateMappings(processedFields, false); expect(mappings).toEqual(expectedMapping); }); @@ -921,7 +944,7 @@ describe('EPM template', () => { }; const fields: Field[] = safeLoad(literalYml); const processedFields = processFields(fields); - const mappings = generateMappings(processedFields); + const mappings = generateMappings(processedFields, true); expect(mappings).toEqual(expectedMapping); }); @@ -955,7 +978,40 @@ describe('EPM template', () => { }; const fields: Field[] = safeLoad(literalYml); const processedFields = processFields(fields); - const mappings = generateMappings(processedFields); + const mappings = generateMappings(processedFields, true); + expect(mappings).toEqual(expectedMapping); + }); + + it('tests processing metric_type field - tsdb disabled', () => { + const literalYml = ` +- name: total.norm.pct + type: scaled_float + metric_type: gauge + unit: percent + format: percent +`; + const expectedMapping = { + properties: { + total: { + properties: { + norm: { + properties: { + pct: { + scaling_factor: 1000, + type: 'scaled_float', + meta: { + unit: 'percent', + }, + }, + }, + }, + }, + }, + }, + }; + const fields: Field[] = safeLoad(literalYml); + const processedFields = processFields(fields); + const mappings = generateMappings(processedFields, false); expect(mappings).toEqual(expectedMapping); }); @@ -982,7 +1038,7 @@ describe('EPM template', () => { }; const fields: Field[] = safeLoad(literalYml); const processedFields = processFields(fields); - const mappings = generateMappings(processedFields); + const mappings = generateMappings(processedFields, true); expect(mappings).toEqual(expectedMapping); }); @@ -1292,7 +1348,7 @@ describe('EPM template', () => { }; const fields: Field[] = safeLoad(textWithRuntimeFieldsLiteralYml); const processedFields = processFields(fields); - const mappings = generateMappings(processedFields); + const mappings = generateMappings(processedFields, true); expect(mappings).toEqual(runtimeFieldMapping); }); diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts index 622538e152836..a26aa2c8e0114 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts @@ -33,6 +33,7 @@ import { } from '../../../../constants'; import { getESAssetMetadata } from '../meta'; import { retryTransientEsErrors } from '../retry'; +import { PackageESError, PackageInvalidArchiveError } from '../../../../errors'; import { getDefaultProperties, histogram, keyword, scaledFloat } from './mappings'; @@ -102,7 +103,9 @@ export function getTemplate({ isIndexModeTimeSeries, }); if (template.template.settings.index.final_pipeline) { - throw new Error(`Error template for ${templateIndexPattern} contains a final_pipeline`); + throw new PackageInvalidArchiveError( + `Error template for ${templateIndexPattern} contains a final_pipeline` + ); } const esBaseComponents = getBaseEsComponents(type, !!isIndexModeTimeSeries); @@ -141,46 +144,53 @@ const getBaseEsComponents = (type: string, isIndexModeTimeSeries: boolean): stri * * @param fields */ -export function generateMappings(fields: Field[]): IndexTemplateMappings { +export function generateMappings( + fields: Field[], + isIndexModeTimeSeries = false +): IndexTemplateMappings { const dynamicTemplates: Array> = []; const dynamicTemplateNames = new Set(); const runtimeFields: RuntimeFields = {}; - const { properties } = _generateMappings(fields, { - addDynamicMapping: (dynamicMapping: { - path: string; - matchingType: string; - pathMatch: string; - properties: Properties; - runtimeProperties?: Properties; - }) => { - const name = dynamicMapping.path; - if (dynamicTemplateNames.has(name)) { - return; - } + const { properties } = _generateMappings( + fields, + { + addDynamicMapping: (dynamicMapping: { + path: string; + matchingType: string; + pathMatch: string; + properties: Properties; + runtimeProperties?: Properties; + }) => { + const name = dynamicMapping.path; + if (dynamicTemplateNames.has(name)) { + return; + } - const dynamicTemplate: Properties = {}; - if (dynamicMapping.runtimeProperties !== undefined) { - dynamicTemplate.runtime = dynamicMapping.runtimeProperties; - } else { - dynamicTemplate.mapping = dynamicMapping.properties; - } + const dynamicTemplate: Properties = {}; + if (dynamicMapping.runtimeProperties !== undefined) { + dynamicTemplate.runtime = dynamicMapping.runtimeProperties; + } else { + dynamicTemplate.mapping = dynamicMapping.properties; + } - if (dynamicMapping.matchingType) { - dynamicTemplate.match_mapping_type = dynamicMapping.matchingType; - } + if (dynamicMapping.matchingType) { + dynamicTemplate.match_mapping_type = dynamicMapping.matchingType; + } - if (dynamicMapping.pathMatch) { - dynamicTemplate.path_match = dynamicMapping.pathMatch; - } + if (dynamicMapping.pathMatch) { + dynamicTemplate.path_match = dynamicMapping.pathMatch; + } - dynamicTemplateNames.add(name); - dynamicTemplates.push({ [dynamicMapping.path]: dynamicTemplate }); - }, - addRuntimeField: (runtimeField: { path: string; properties: Properties }) => { - runtimeFields[`${runtimeField.path}`] = runtimeField.properties; + dynamicTemplateNames.add(name); + dynamicTemplates.push({ [dynamicMapping.path]: dynamicTemplate }); + }, + addRuntimeField: (runtimeField: { path: string; properties: Properties }) => { + runtimeFields[`${runtimeField.path}`] = runtimeField.properties; + }, }, - }); + isIndexModeTimeSeries + ); const indexTemplateMappings: IndexTemplateMappings = { properties }; if (dynamicTemplates.length > 0) { @@ -206,7 +216,8 @@ function _generateMappings( addDynamicMapping: any; addRuntimeField: any; groupFieldName?: string; - } + }, + isIndexModeTimeSeries: boolean ): { properties: IndexTemplateMappings['properties']; hasNonDynamicTemplateMappings: boolean; @@ -294,7 +305,9 @@ function _generateMappings( case 'long': case 'boolean': dynProperties.type = field.object_type; - dynProperties.time_series_metric = field.metric_type; + if (isIndexModeTimeSeries) { + dynProperties.time_series_metric = field.metric_type; + } matchingType = field.object_type_mapping_type ?? field.object_type; default: break; @@ -359,7 +372,9 @@ function _generateMappings( case 'float': case 'half_float': dynProperties.type = field.object_type; - dynProperties.time_series_metric = field.metric_type; + if (isIndexModeTimeSeries) { + dynProperties.time_series_metric = field.metric_type; + } matchingType = field.object_type_mapping_type ?? 'double'; break; case 'byte': @@ -367,18 +382,24 @@ function _generateMappings( case 'short': case 'unsigned_long': dynProperties.type = field.object_type; - dynProperties.time_series_metric = field.metric_type; + if (isIndexModeTimeSeries) { + dynProperties.time_series_metric = field.metric_type; + } matchingType = field.object_type_mapping_type ?? 'long'; break; case 'integer': // Map integers as long, as in other cases. dynProperties.type = 'long'; - dynProperties.time_series_metric = field.metric_type; + if (isIndexModeTimeSeries) { + dynProperties.time_series_metric = field.metric_type; + } matchingType = field.object_type_mapping_type ?? 'long'; break; case 'boolean': dynProperties.type = field.object_type; - dynProperties.time_series_metric = field.metric_type; + if (isIndexModeTimeSeries) { + dynProperties.time_series_metric = field.metric_type; + } matchingType = field.object_type_mapping_type ?? field.object_type; break; case 'group': @@ -390,12 +411,16 @@ function _generateMappings( type: 'object', object_type: subField.object_type ?? subField.type, })); - const mappings = _generateMappings(subFields, { - ...ctx, - groupFieldName: ctx.groupFieldName - ? `${ctx.groupFieldName}.${field.name}` - : field.name, - }); + const mappings = _generateMappings( + subFields, + { + ...ctx, + groupFieldName: ctx.groupFieldName + ? `${ctx.groupFieldName}.${field.name}` + : field.name, + }, + isIndexModeTimeSeries + ); if (mappings.hasDynamicTemplateMappings) { hasDynamicTemplateMappings = true; } @@ -405,8 +430,8 @@ function _generateMappings( matchingType = field.object_type_mapping_type ?? 'object'; break; default: - throw new Error( - `no dynamic mapping generated for field ${path} of type ${field.object_type}` + throw new PackageInvalidArchiveError( + `No dynamic mapping generated for field ${path} of type ${field.object_type}` ); } @@ -422,12 +447,16 @@ function _generateMappings( switch (type) { case 'group': - const mappings = _generateMappings(field.fields!, { - ...ctx, - groupFieldName: ctx.groupFieldName - ? `${ctx.groupFieldName}.${field.name}` - : field.name, - }); + const mappings = _generateMappings( + field.fields!, + { + ...ctx, + groupFieldName: ctx.groupFieldName + ? `${ctx.groupFieldName}.${field.name}` + : field.name, + }, + isIndexModeTimeSeries + ); if (mappings.hasNonDynamicTemplateMappings) { fieldProps = { properties: @@ -450,12 +479,16 @@ function _generateMappings( break; case 'group-nested': fieldProps = { - properties: _generateMappings(field.fields!, { - ...ctx, - groupFieldName: ctx.groupFieldName - ? `${ctx.groupFieldName}.${field.name}` - : field.name, - }).properties, + properties: _generateMappings( + field.fields!, + { + ...ctx, + groupFieldName: ctx.groupFieldName + ? `${ctx.groupFieldName}.${field.name}` + : field.name, + }, + isIndexModeTimeSeries + ).properties, ...generateNestedProps(field), type: 'nested', }; @@ -543,10 +576,10 @@ function _generateMappings( } } - if ('metric_type' in field) { + if ('metric_type' in field && isIndexModeTimeSeries) { fieldProps.time_series_metric = field.metric_type; } - if (field.dimension) { + if (field.dimension && isIndexModeTimeSeries) { fieldProps.time_series_dimension = field.dimension; } @@ -878,7 +911,9 @@ const rolloverDataStream = (dataStreamName: string, esClient: ElasticsearchClien alias: dataStreamName, }); } catch (error) { - throw new Error(`cannot rollover data stream [${dataStreamName}] due to error: ${error}`); + throw new PackageESError( + `Cannot rollover data stream [${dataStreamName}] due to error: ${error}` + ); } }; @@ -1025,7 +1060,11 @@ const updateExistingDataStream = async ({ { logger } ); } catch (err) { - throw new Error(`could not update lifecycle settings for ${dataStreamName}: ${err.message}`); + // Check if this error can happen because of invalid settings; + // We are returning a 500 but in that case it should be a 400 instead + throw new PackageESError( + `Could not update lifecycle settings for ${dataStreamName}: ${err.message}` + ); } } @@ -1048,6 +1087,8 @@ const updateExistingDataStream = async ({ { logger } ); } catch (err) { - throw new Error(`could not update index template settings for ${dataStreamName}`); + // Same as above - Check if this error can happen because of invalid settings; + // We are returning a 500 but in that case it should be a 400 instead + throw new PackageESError(`Could not update index template settings for ${dataStreamName}`); } }; diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts index 20a0484c77a4a..23327a2253f86 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts @@ -35,6 +35,7 @@ import { savedObjectTypes } from '../../packages'; import { indexPatternTypes, getIndexPatternSavedObjects } from '../index_pattern/install'; import { saveKibanaAssetsRefs } from '../../packages/install'; import { deleteKibanaSavedObjectsAssets } from '../../packages/remove'; +import { KibanaSOReferenceError } from '../../../../errors'; import { withPackageSpan } from '../../packages/utils'; @@ -340,7 +341,7 @@ export async function installKibanaSavedObjects({ ); if (otherErrors?.length) { - throw new Error( + throw new KibanaSOReferenceError( `Encountered ${ otherErrors.length } errors creating saved objects: ${formatImportErrorsForLog(otherErrors)}` @@ -383,7 +384,7 @@ export async function installKibanaSavedObjects({ }); if (resolveErrors?.length) { - throw new Error( + throw new KibanaSOReferenceError( `Encountered ${ resolveErrors.length } errors resolving reference errors: ${formatImportErrorsForLog(resolveErrors)}` diff --git a/x-pack/plugins/fleet/server/services/epm/package_service.ts b/x-pack/plugins/fleet/server/services/epm/package_service.ts index 39ca950af93db..e6f71cb7cb96c 100644 --- a/x-pack/plugins/fleet/server/services/epm/package_service.ts +++ b/x-pack/plugins/fleet/server/services/epm/package_service.ts @@ -29,7 +29,7 @@ import type { } from '../../types'; import type { FleetAuthzRouteConfig } from '../security/types'; import { checkSuperuser, getAuthzFromRequest, doesNotHaveRequiredFleetAuthz } from '../security'; -import { FleetUnauthorizedError } from '../../errors'; +import { FleetUnauthorizedError, FleetError } from '../../errors'; import { INSTALL_PACKAGES_AUTHZ, READ_PACKAGE_INFO_AUTHZ } from '../../routes/epm'; import { installTransforms, isTransform } from './elasticsearch/transform/install'; @@ -208,7 +208,7 @@ class PackageClientImpl implements PackageClient { const transformPaths = assetPaths.filter(isTransform); if (transformPaths.length !== assetPaths.length) { - throw new Error('reinstallEsAssets is currently only implemented for transform assets'); + throw new FleetError('reinstallEsAssets is currently only implemented for transform assets'); } if (transformPaths.length) { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts b/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts index 7078761a4a583..92f9674656103 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/bundled_packages.ts @@ -9,7 +9,7 @@ import fs from 'fs/promises'; import path from 'path'; import type { BundledPackage, Installation } from '../../../types'; -import { FleetError } from '../../../errors'; +import { BundledPackageLocationNotFoundError } from '../../../errors'; import { appContextService } from '../../app_context'; import { splitPkgKey, pkgToPkgKey } from '../registry'; @@ -19,7 +19,9 @@ export async function getBundledPackages(): Promise { const bundledPackageLocation = config?.developer?.bundledPackageLocation; if (!bundledPackageLocation) { - throw new FleetError('xpack.fleet.developer.bundledPackageLocation is not configured'); + throw new BundledPackageLocationNotFoundError( + 'xpack.fleet.developer.bundledPackageLocation is not configured' + ); } // If the bundled package directory is missing, we log a warning during setup, @@ -51,7 +53,7 @@ export async function getBundledPackages(): Promise { return result; } catch (err) { const logger = appContextService.getLogger(); - logger.debug(`Unable to read bundled packages from ${bundledPackageLocation}`); + logger.warn(`Unable to read bundled packages from ${bundledPackageLocation}`); return []; } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.ts index 68a884fd5f198..a3ed5f62d7f1e 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.ts @@ -44,7 +44,6 @@ import type { } from '../../../../common/types'; import type { Installation, PackageInfo, PackagePolicySOAttributes } from '../../../types'; import { - FleetError, PackageFailedVerificationError, PackageNotFoundError, RegistryResponseError, @@ -575,6 +574,7 @@ export async function getPackageFromSource(options: { logger.debug(`retrieved installed package ${pkgName}-${pkgVersion}`); } catch (error) { if (error instanceof PackageFailedVerificationError) { + logger.error(`package ${pkgName}-${pkgVersion} failed verification`); throw error; } // treating this is a 404 as no status code returned @@ -600,7 +600,7 @@ export async function getPackageFromSource(options: { } } if (!res) { - throw new FleetError(`package info for ${pkgName}-${pkgVersion} does not exist`); + throw new PackageNotFoundError(`Package info for ${pkgName}-${pkgVersion} does not exist`); } return { paths: res.paths, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 3a7fc78096159..40db0c76dd66a 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -57,11 +57,13 @@ import { DATASET_VAR_NAME, } from '../../../../common/constants'; import { - type FleetError, + FleetError, PackageOutdatedError, PackagePolicyValidationError, ConcurrentInstallOperationError, FleetUnauthorizedError, + PackageInvalidArchiveError, + PackageNotFoundError, } from '../../../errors'; import { PACKAGES_SAVED_OBJECT_TYPE, MAX_TIME_COMPLETE_INSTALL } from '../../../constants'; import { dataStreamService, licenseService } from '../..'; @@ -202,7 +204,7 @@ export async function ensureInstalledPackage(options: { } const installation = await getInstallation({ savedObjectsClient, pkgName }); - if (!installation) throw new Error(`could not get installation ${pkgName}`); + if (!installation) throw new FleetError(`Could not get installation for ${pkgName}`); return installation; } @@ -597,7 +599,9 @@ async function installPackageCommon(options: { return { assets, status: 'installed', installType, installSource }; }) .catch(async (err: Error) => { - logger.warn(`Failure to install package [${pkgName}]: [${err.toString()}]`); + logger.warn(`Failure to install package [${pkgName}]: [${err.toString()}]`, { + error: { stack_trace: err.stack }, + }); await handleInstallPackageFailure({ savedObjectsClient, error: err, @@ -712,7 +716,7 @@ export type InstallPackageParams = { export async function installPackage(args: InstallPackageParams): Promise { if (!('installSource' in args)) { - throw new Error('installSource is required'); + throw new FleetError('installSource is required'); } const logger = appContextService.getLogger(); @@ -803,7 +807,7 @@ export async function installPackage(args: InstallPackageParams): Promise { getLogger: jest.fn().mockReturnValue({ info: jest.fn(), error: jest.fn(), + warn: jest.fn(), }), }, packagePolicyService: { @@ -78,7 +79,7 @@ describe('removeInstallation', () => { force: false, }) ).rejects.toThrowError( - `unable to remove package with existing package policy(s) in use by agent(s)` + `Unable to remove package with existing package policy(s) in use by agent(s)` ); }); diff --git a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts index c65a4d165cf7f..ba9bace6a0dee 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts @@ -7,8 +7,6 @@ import type { ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; -import Boom from '@hapi/boom'; - import type { SavedObject } from '@kbn/core/server'; import { SavedObjectsClient } from '@kbn/core/server'; @@ -42,6 +40,7 @@ import { deleteIlms } from '../elasticsearch/datastream_ilm/remove'; import { removeArchiveEntries } from '../archive/storage'; import { auditLoggingService } from '../../audit_logging'; +import { FleetError, PackageRemovalError } from '../../../errors'; import { populatePackagePolicyAssignedAgentsCount } from '../../package_policies/populate_package_policy_assigned_agents_count'; @@ -56,7 +55,7 @@ export async function removeInstallation(options: { }): Promise { const { savedObjectsClient, pkgName, pkgVersion, esClient } = options; const installation = await getInstallation({ savedObjectsClient, pkgName }); - if (!installation) throw Boom.badRequest(`${pkgName} is not installed`); + if (!installation) throw new PackageRemovalError(`${pkgName} is not installed`); const { total, items } = await packagePolicyService.list(savedObjectsClient, { kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${pkgName}`, @@ -72,17 +71,12 @@ export async function removeInstallation(options: { if (options.force || items.every((item) => (item.agents ?? 0) === 0)) { // delete package policies const ids = items.map((item) => item.id); - appContextService - .getLogger() - .info( - `deleting package policies of ${pkgName} package because not used by agents or force flag was enabled: ${ids}` - ); await packagePolicyService.delete(savedObjectsClient, esClient, ids, { force: options.force, }); } else { - throw Boom.badRequest( - `unable to remove package with existing package policy(s) in use by agent(s)` + throw new PackageRemovalError( + `Unable to remove package with existing package policy(s) in use by agent(s)` ); } } @@ -242,7 +236,7 @@ async function deleteIndexTemplate(esClient: ElasticsearchClient, name: string): try { await esClient.indices.deleteIndexTemplate({ name }, { ignore: [404] }); } catch { - throw new Error(`error deleting index template ${name}`); + throw new FleetError(`Error deleting index template ${name}`); } } } @@ -253,7 +247,7 @@ async function deleteComponentTemplate(esClient: ElasticsearchClient, name: stri try { await esClient.cluster.deleteComponentTemplate({ name }, { ignore: [404] }); } catch (error) { - throw new Error(`error deleting component template ${name}`); + throw new FleetError(`Error deleting component template ${name}`); } } } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/update.ts b/x-pack/plugins/fleet/server/services/epm/packages/update.ts index 3072dfed86636..72c43b6dc688a 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/update.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/update.ts @@ -12,7 +12,7 @@ import type { ExperimentalIndexingFeature } from '../../../../common/types'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../constants'; import type { Installation, UpdatePackageRequestSchema } from '../../../types'; -import { FleetError } from '../../../errors'; +import { PackageNotFoundError } from '../../../errors'; import { auditLoggingService } from '../../audit_logging'; @@ -29,7 +29,7 @@ export async function updatePackage( const installedPackage = await getInstallationObject({ savedObjectsClient, pkgName }); if (!installedPackage) { - throw new FleetError(`package ${pkgName} is not installed`); + throw new PackageNotFoundError(`Error while updating package: ${pkgName} is not installed`); } auditLoggingService.writeCustomSoAuditLog({ diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.ts index 487faf55730bd..24c81dd023244 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.ts @@ -43,6 +43,7 @@ import { PackageNotFoundError, RegistryResponseError, PackageFailedVerificationError, + PackageUnsupportedMediaTypeError, } from '../../../errors'; import { getBundledPackageByName } from '../packages/bundled_packages'; @@ -364,8 +365,11 @@ export async function getPackage( function ensureContentType(archivePath: string) { const contentType = mime.lookup(archivePath); + if (!contentType) { - throw new Error(`Unknown compression format for '${archivePath}'. Please use .zip or .gz`); + throw new PackageUnsupportedMediaTypeError( + `Unknown compression format for '${archivePath}'. Please use .zip or .gz` + ); } return contentType; } diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.ts b/x-pack/plugins/fleet/server/services/preconfiguration.ts index 350909d3de0a7..2a76a96607789 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.ts @@ -255,10 +255,7 @@ export async function ensurePreconfiguredPackagesAndPolicies( ); }); - apm.startTransaction( - 'fleet.preconfiguration.addPackagePolicies.improved.prReview.50', - 'fleet' - ); + const s = apm.startSpan('Add preconfigured package policies', 'preconfiguration'); await addPreconfiguredPolicyPackages( soClient, esClient, @@ -267,7 +264,7 @@ export async function ensurePreconfiguredPackagesAndPolicies( defaultOutput, true ); - apm.endTransaction('fleet.preconfiguration.addPackagePolicies.improved.prReview.50'); + s?.end(); // Add the is_managed flag after configuring package policies to avoid errors if (shouldAddIsManagedFlag) { diff --git a/x-pack/plugins/fleet/server/services/setup.ts b/x-pack/plugins/fleet/server/services/setup.ts index 270cfefb56a82..178499011bc61 100644 --- a/x-pack/plugins/fleet/server/services/setup.ts +++ b/x-pack/plugins/fleet/server/services/setup.ts @@ -6,6 +6,7 @@ */ import fs from 'fs/promises'; +import apm from 'elastic-apm-node'; import { compact } from 'lodash'; import pMap from 'p-map'; @@ -61,7 +62,17 @@ export async function setupFleet( soClient: SavedObjectsClientContract, esClient: ElasticsearchClient ): Promise { - return awaitIfPending(async () => createSetupSideEffects(soClient, esClient)); + const t = apm.startTransaction('fleet-setup', 'fleet'); + + try { + return await awaitIfPending(async () => createSetupSideEffects(soClient, esClient)); + } catch (error) { + apm.captureError(error); + t.setOutcome('failure'); + throw error; + } finally { + t.end(); + } } async function createSetupSideEffects( @@ -113,7 +124,9 @@ async function createSetupSideEffects( const defaultOutput = await outputService.ensureDefaultOutput(soClient, esClient); logger.debug('Setting up Fleet Elasticsearch assets'); + let stepSpan = apm.startSpan('Install Fleet global assets', 'preconfiguration'); await ensureFleetGlobalEsAssets(soClient, esClient); + stepSpan?.end(); // Ensure that required packages are always installed even if they're left out of the config const preconfiguredPackageNames = new Set(packages.map((pkg) => pkg.name)); @@ -136,6 +149,7 @@ async function createSetupSideEffects( logger.debug('Setting up initial Fleet packages'); + stepSpan = apm.startSpan('Install preconfigured packages and policies', 'preconfiguration'); const { nonFatalErrors: preconfiguredPackagesNonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -146,17 +160,23 @@ async function createSetupSideEffects( defaultDownloadSource, DEFAULT_SPACE_ID ); + stepSpan?.end(); + stepSpan = apm.startSpan('Upgrade managed package policies', 'preconfiguration'); const packagePolicyUpgradeErrors = ( await upgradeManagedPackagePolicies(soClient, esClient) ).filter((result) => (result.errors ?? []).length > 0); + stepSpan?.end(); const nonFatalErrors = [...preconfiguredPackagesNonFatalErrors, ...packagePolicyUpgradeErrors]; logger.debug('Upgrade Fleet package install versions'); + stepSpan = apm.startSpan('Upgrade package install format version', 'preconfiguration'); await upgradePackageInstallVersion({ soClient, esClient, logger }); + stepSpan?.end(); logger.debug('Generating key pair for message signing'); + stepSpan = apm.startSpan('Configure message signing', 'preconfiguration'); if (!appContextService.getMessageSigningService()?.isEncryptionAvailable) { logger.warn( 'xpack.encryptedSavedObjects.encryptionKey is not configured, private key passphrase is being stored in plain text' @@ -176,16 +196,26 @@ async function createSetupSideEffects( logger.debug('Checking for and encrypting plain text uninstall tokens'); await appContextService.getUninstallTokenService()?.encryptTokens(); } + stepSpan?.end(); + stepSpan = apm.startSpan('Upgrade agent policy schema', 'preconfiguration'); logger.debug('Upgrade Agent policy schema version'); await upgradeAgentPolicySchemaVersion(soClient); + stepSpan?.end(); + stepSpan = apm.startSpan('Set up enrollment keys for preconfigured policies', 'preconfiguration'); logger.debug('Setting up Fleet enrollment keys'); await ensureDefaultEnrollmentAPIKeysExists(soClient, esClient); + stepSpan?.end(); if (nonFatalErrors.length > 0) { logger.info('Encountered non fatal errors during Fleet setup'); - formatNonFatalErrors(nonFatalErrors).forEach((error) => logger.info(JSON.stringify(error))); + formatNonFatalErrors(nonFatalErrors) + .map((e) => JSON.stringify(e)) + .forEach((error) => { + logger.info(error); + apm.captureError(error); + }); } logger.info('Fleet setup completed'); @@ -222,6 +252,7 @@ export async function ensureFleetGlobalEsAssets( esClient, installation, }).catch((err) => { + apm.captureError(err); logger.error( `Package needs to be manually reinstalled ${installation.name} after installing Fleet global assets: ${err.message}` ); diff --git a/x-pack/plugins/fleet/server/services/setup_utils.ts b/x-pack/plugins/fleet/server/services/setup_utils.ts index 4ac77e8e7d60f..a9801e3470b76 100644 --- a/x-pack/plugins/fleet/server/services/setup_utils.ts +++ b/x-pack/plugins/fleet/server/services/setup_utils.ts @@ -12,7 +12,7 @@ let isPending = false; let onResolve = (value?: unknown) => {}; let onReject = (reason: any) => {}; -export async function awaitIfPending(asyncFunction: Function): Promise { +export async function awaitIfPending(asyncFunction: () => Promise): Promise { // pending successful or failed attempt if (isPending) { // don't run concurrent installs diff --git a/x-pack/plugins/index_management/common/constants/index.ts b/x-pack/plugins/index_management/common/constants/index.ts index a41f3d71bc6bc..efe9630a5f238 100644 --- a/x-pack/plugins/index_management/common/constants/index.ts +++ b/x-pack/plugins/index_management/common/constants/index.ts @@ -10,6 +10,10 @@ export { API_BASE_PATH, INTERNAL_API_BASE_PATH } from './api_base_path'; export { INVALID_INDEX_PATTERN_CHARS, INVALID_TEMPLATE_NAME_CHARS } from './invalid_characters'; export * from './index_statuses'; +// Since each index can have a max length or 255 characters and the max length of +// the request is 4096 bytes we can fit a max of 16 indices in a single request. +export const MAX_INDICES_PER_REQUEST = 16; + export { UIM_APP_NAME, UIM_APP_LOAD, diff --git a/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js b/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js index 09c4988fc27b1..f27c184afea68 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js @@ -27,8 +27,9 @@ export const clearCacheIndices = dispatch(reloadIndices(indexNames)); notificationService.showSuccessToast( i18n.translate('xpack.idxMgmt.clearCacheIndicesAction.successMessage', { - defaultMessage: 'Successfully cleared cache: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, + defaultMessage: + 'Successfully cleared cache for {count, plural, one {# index} other {# indices} }', + values: { count: indexNames.length }, }) ); }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/close_indices.js b/x-pack/plugins/index_management/public/application/store/actions/close_indices.js index a9bedef283ec4..368298a67137e 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/close_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/close_indices.js @@ -25,8 +25,8 @@ export const closeIndices = dispatch(reloadIndices(indexNames)); notificationService.showSuccessToast( i18n.translate('xpack.idxMgmt.closeIndicesAction.successfullyClosedIndicesMessage', { - defaultMessage: 'Successfully closed: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, + defaultMessage: 'Successfully closed {count, plural, one {# index} other {# indices} }', + values: { count: indexNames.length }, }) ); }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js b/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js index 2a2f8f0b41092..1b082594f085a 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js @@ -23,8 +23,8 @@ export const deleteIndices = } notificationService.showSuccessToast( i18n.translate('xpack.idxMgmt.deleteIndicesAction.successfullyDeletedIndicesMessage', { - defaultMessage: 'Successfully deleted: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, + defaultMessage: 'Successfully deleted {count, plural, one {# index} other {# indices} }', + values: { count: indexNames.length }, }) ); dispatch(deleteIndicesSuccess({ indexNames })); diff --git a/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js b/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js index 83d4d5d46a3ae..d033f5fbe343e 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js @@ -26,8 +26,8 @@ export const flushIndices = dispatch(reloadIndices(indexNames)); notificationService.showSuccessToast( i18n.translate('xpack.idxMgmt.flushIndicesAction.successfullyFlushedIndicesMessage', { - defaultMessage: 'Successfully flushed: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, + defaultMessage: 'Successfully flushed {count, plural, one {# index} other {# indices} }', + values: { count: indexNames.length }, }) ); }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js b/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js index bb3af529f404a..d589ff6dd780f 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js @@ -28,8 +28,9 @@ export const forcemergeIndices = i18n.translate( 'xpack.idxMgmt.forceMergeIndicesAction.successfullyForceMergedIndicesMessage', { - defaultMessage: 'Successfully force merged: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, + defaultMessage: + 'Successfully force merged {count, plural, one {# index} other {# indices} }', + values: { count: indexNames.length }, } ) ); diff --git a/x-pack/plugins/index_management/public/application/store/actions/open_indices.js b/x-pack/plugins/index_management/public/application/store/actions/open_indices.js index 8d4d0f728d160..53bb9186c2f94 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/open_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/open_indices.js @@ -26,8 +26,8 @@ export const openIndices = dispatch(reloadIndices(indexNames)); notificationService.showSuccessToast( i18n.translate('xpack.idxMgmt.openIndicesAction.successfullyOpenedIndicesMessage', { - defaultMessage: 'Successfully opened: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, + defaultMessage: 'Successfully opened {count, plural, one {# index} other {# indices} }', + values: { count: indexNames.length }, }) ); }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js b/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js index 56fe892393ea4..574aa18c0282c 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js @@ -26,8 +26,8 @@ export const refreshIndices = dispatch(reloadIndices(indexNames)); notificationService.showSuccessToast( i18n.translate('xpack.idxMgmt.refreshIndicesAction.successfullyRefreshedIndicesMessage', { - defaultMessage: 'Successfully refreshed: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, + defaultMessage: 'Successfully refreshed {count, plural, one {# index} other {# indices} }', + values: { count: indexNames.length }, }) ); }; diff --git a/x-pack/plugins/index_management/server/routes/api/indices/helpers.test.ts b/x-pack/plugins/index_management/server/routes/api/indices/helpers.test.ts new file mode 100644 index 0000000000000..fd44742d26e4c --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/indices/helpers.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { IScopedClusterClient } from '@kbn/core/server'; + +import { executeAsyncByChunks } from './helpers'; + +const generateIndices = (count: number) => { + const indices = []; + + for (let i = 0; i < count; i++) { + indices.push(`index-${i}`); + } + + return indices; +}; + +const mockClient = { + asCurrentUser: { + indices: { + delete: jest.fn(), + }, + }, +} as unknown as IScopedClusterClient; + +describe('executeAsyncByChunks', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should make just one request for one index', async () => { + const params = { + index: generateIndices(1), + }; + + await executeAsyncByChunks(params, mockClient, 'delete'); + + expect(mockClient.asCurrentUser.indices.delete).toHaveBeenCalledTimes(1); + }); + + it('should make 2 requests for 32 indices', async () => { + const params = { + index: generateIndices(32), + }; + + await executeAsyncByChunks(params, mockClient, 'delete'); + + expect(mockClient.asCurrentUser.indices.delete).toHaveBeenCalledTimes(2); + }); +}); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/helpers.ts b/x-pack/plugins/index_management/server/routes/api/indices/helpers.ts new file mode 100644 index 0000000000000..bb04cbd2c15c8 --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/indices/helpers.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { chunk } from 'lodash'; + +import type { IScopedClusterClient } from '@kbn/core/server'; +import { MAX_INDICES_PER_REQUEST } from '../../../../common/constants'; + +// To avoid having to to match method signatures with the client +// type, we use a generic CallableFn type. +type CallableFn = (args: Record) => Promise; + +export async function executeAsyncByChunks( + // Since we are using a key to access the index method, we need + // to use a generic type. + params: { + index: T[]; + format?: string; + expand_wildcards?: string; + max_num_segments?: number; + }, + dataClient: IScopedClusterClient, + methodName: keyof IScopedClusterClient['asCurrentUser']['indices'] +) { + const { index: indices, ...commonParams } = params; + + // When the number of indices is small, we can execute in a single request + // + // Otherwise we need to split the indices into chunks and execute them in multiple requests because + // if we try to execute an action with too many indices that account for a long string in the request + // ES will throw an error saying that the HTTP line is too large. + if (indices.length <= MAX_INDICES_PER_REQUEST) { + await (dataClient.asCurrentUser.indices[methodName] as CallableFn)({ + ...commonParams, + index: indices, + }); + } else { + const chunks = chunk(indices, MAX_INDICES_PER_REQUEST); + + await Promise.all( + chunks.map((chunkOfIndices) => + (dataClient.asCurrentUser.indices[methodName] as CallableFn)({ + ...commonParams, + index: chunkOfIndices, + }) + ) + ); + } +} diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_clear_cache_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_clear_cache_route.ts index a46a23b8fe479..bfedf6f4cb0cf 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_clear_cache_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_clear_cache_route.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '..'; +import { executeAsyncByChunks } from './helpers'; const bodySchema = schema.object({ indices: schema.arrayOf(schema.string()), @@ -28,7 +29,8 @@ export function registerClearCacheRoute({ router, lib: { handleEsError } }: Rout }; try { - await client.asCurrentUser.indices.clearCache(params); + await executeAsyncByChunks(params, client, 'clearCache'); + return response.ok(); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_close_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_close_route.ts index 69d33b7fc7999..b83c781f6457d 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_close_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_close_route.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '..'; +import { executeAsyncByChunks } from './helpers'; const bodySchema = schema.object({ indices: schema.arrayOf(schema.string()), @@ -28,7 +29,7 @@ export function registerCloseRoute({ router, lib: { handleEsError } }: RouteDepe }; try { - await client.asCurrentUser.indices.close(params); + await executeAsyncByChunks(params, client, 'close'); return response.ok(); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_delete_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_delete_route.ts index b72a2059beb1d..b3931c1d56172 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_delete_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_delete_route.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '..'; +import { executeAsyncByChunks } from './helpers'; const bodySchema = schema.object({ indices: schema.arrayOf(schema.string()), @@ -22,13 +23,14 @@ export function registerDeleteRoute({ router, lib: { handleEsError } }: RouteDep const { indices = [] } = request.body as typeof bodySchema.type; const params = { - expand_wildcards: 'none' as const, format: 'json', + expand_wildcards: 'none' as const, index: indices, }; try { - await client.asCurrentUser.indices.delete(params); + await executeAsyncByChunks(params, client, 'delete'); + return response.ok(); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_flush_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_flush_route.ts index cc07b92e70907..6ba8000306fec 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_flush_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_flush_route.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '..'; +import { executeAsyncByChunks } from './helpers'; const bodySchema = schema.object({ indices: schema.arrayOf(schema.string()), @@ -28,7 +29,8 @@ export function registerFlushRoute({ router, lib: { handleEsError } }: RouteDepe }; try { - await client.asCurrentUser.indices.flush(params); + await executeAsyncByChunks(params, client, 'flush'); + return response.ok(); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_forcemerge_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_forcemerge_route.ts index af07a7371cf65..ffbe50598f197 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_forcemerge_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_forcemerge_route.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '..'; +import { executeAsyncByChunks } from './helpers'; const bodySchema = schema.object({ indices: schema.arrayOf(schema.string()), @@ -36,7 +37,8 @@ export function registerForcemergeRoute({ router, lib: { handleEsError } }: Rout } try { - await client.asCurrentUser.indices.forcemerge(params); + await executeAsyncByChunks(params, client, 'forcemerge'); + return response.ok(); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_open_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_open_route.ts index dde9e72af39d7..9d0ae0a44b4ec 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_open_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_open_route.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '..'; +import { executeAsyncByChunks } from './helpers'; const bodySchema = schema.object({ indices: schema.arrayOf(schema.string()), @@ -28,7 +29,8 @@ export function registerOpenRoute({ router, lib: { handleEsError } }: RouteDepen }; try { - await client.asCurrentUser.indices.open(params); + await executeAsyncByChunks(params, client, 'open'); + return response.ok(); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_refresh_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_refresh_route.ts index 2483cd534b80e..c414a73cd73c1 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_refresh_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_refresh_route.ts @@ -9,6 +9,7 @@ import { schema } from '@kbn/config-schema'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '..'; +import { executeAsyncByChunks } from './helpers'; const bodySchema = schema.object({ indices: schema.arrayOf(schema.string()), @@ -28,7 +29,8 @@ export function registerRefreshRoute({ router, lib: { handleEsError } }: RouteDe }; try { - await client.asCurrentUser.indices.refresh(params); + await executeAsyncByChunks(params, client, 'refresh'); + return response.ok(); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/index_management/server/routes/api/indices/register_reload_route.ts b/x-pack/plugins/index_management/server/routes/api/indices/register_reload_route.ts index 91a04187fc238..d64c6b1013d66 100644 --- a/x-pack/plugins/index_management/server/routes/api/indices/register_reload_route.ts +++ b/x-pack/plugins/index_management/server/routes/api/indices/register_reload_route.ts @@ -5,8 +5,10 @@ * 2.0. */ +import { chunk } from 'lodash'; import { schema } from '@kbn/config-schema'; +import { MAX_INDICES_PER_REQUEST } from '../../../../common/constants'; import { RouteDependencies } from '../../../types'; import { fetchIndices } from '../../../lib/fetch_indices'; import { addBasePath } from '..'; @@ -30,7 +32,27 @@ export function registerReloadRoute({ const { indexNames = [] } = (request.body as typeof bodySchema.type) ?? {}; try { - const indices = await fetchIndices({ client, indexDataEnricher, config, indexNames }); + let indices; + + // When the number of indices is small, we can execute in a single request + // + // Otherwise we need to split the indices into chunks and execute them in multiple requests because + // if we try to execute an action with too many indices that account for a long string in the request + // ES will throw an error saying that the HTTP line is too large. + if (indexNames.length <= MAX_INDICES_PER_REQUEST) { + indices = await fetchIndices({ client, indexDataEnricher, config, indexNames }); + } else { + const chunks = chunk(indexNames, MAX_INDICES_PER_REQUEST); + + indices = ( + await Promise.all( + chunks.map((indexNamesChunk) => + fetchIndices({ client, indexDataEnricher, config, indexNames: indexNamesChunk }) + ) + ) + ).flat(); + } + return response.ok({ body: indices }); } catch (error) { return handleEsError({ error, response }); diff --git a/x-pack/plugins/infra/common/http_api/latest.ts b/x-pack/plugins/infra/common/http_api/latest.ts index 98787a2c581a2..9b9ba2a0c54f4 100644 --- a/x-pack/plugins/infra/common/http_api/latest.ts +++ b/x-pack/plugins/infra/common/http_api/latest.ts @@ -10,3 +10,4 @@ export * from './log_alerts/v1'; export * from './log_analysis/results/v1'; export * from './log_analysis/validation/v1'; export * from './metrics_explorer_views/v1'; +export * from './log_analysis/id_formats/v1/id_formats'; diff --git a/x-pack/plugins/infra/common/http_api/log_analysis/id_formats/v1/id_formats.ts b/x-pack/plugins/infra/common/http_api/log_analysis/id_formats/v1/id_formats.ts new file mode 100644 index 0000000000000..c148df6c4c506 --- /dev/null +++ b/x-pack/plugins/infra/common/http_api/log_analysis/id_formats/v1/id_formats.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as rt from 'io-ts'; +import { logEntryRateJobTypeRT, logEntryCategoriesJobTypeRT } from '../../../../log_analysis'; + +export const idFormatRT = rt.union([rt.literal('legacy'), rt.literal('hashed')]); +export type IdFormat = rt.TypeOf; + +const jobTypeRT = rt.union([logEntryRateJobTypeRT, logEntryCategoriesJobTypeRT]); +export type JobType = rt.TypeOf; + +export const idFormatByJobTypeRT = rt.record(jobTypeRT, idFormatRT); +export type IdFormatByJobType = rt.TypeOf; + +export const LOG_ANALYSIS_GET_ID_FORMATS = '/api/infra/log_analysis/id_formats'; + +export const getLogAnalysisIdFormatsRequestPayloadRT = rt.type({ + data: rt.type({ + logViewId: rt.string, + spaceId: rt.string, + }), +}); + +export type GetLogAnalysisIdFormatsRequestPayload = rt.TypeOf< + typeof getLogAnalysisIdFormatsRequestPayloadRT +>; + +export const getLogAnalysisIdFormatsSuccessResponsePayloadRT = rt.type({ + data: rt.record(rt.union([logEntryRateJobTypeRT, logEntryCategoriesJobTypeRT]), idFormatRT), +}); + +export type GetLogAnalysisIdFormatsSuccessResponsePayload = rt.TypeOf< + typeof getLogAnalysisIdFormatsSuccessResponsePayloadRT +>; diff --git a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies.ts b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies.ts index 3553962063990..38244c6a869b7 100644 --- a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies.ts +++ b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies.ts @@ -8,6 +8,7 @@ import * as rt from 'io-ts'; import { persistedLogViewReferenceRT } from '@kbn/logs-shared-plugin/common'; +import { idFormatByJobTypeRT } from '../../id_formats/v1/id_formats'; import { timeRangeRT, routeTimingMetadataRT } from '../../../shared'; import { logEntryAnomalyRT, @@ -54,6 +55,7 @@ export const getLogEntryAnomaliesRequestPayloadRT = rt.type({ rt.type({ // log view logView: persistedLogViewReferenceRT, + idFormats: idFormatByJobTypeRT, // the time range to fetch the log entry anomalies from timeRange: timeRangeRT, }), diff --git a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies_datasets.ts b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies_datasets.ts index c07007be05115..5b6031ce27587 100644 --- a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies_datasets.ts +++ b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_anomalies_datasets.ts @@ -14,6 +14,7 @@ import { timeRangeRT, routeTimingMetadataRT, } from '../../../shared'; +import { idFormatByJobTypeRT } from '../../id_formats/v1/id_formats'; export const LOG_ANALYSIS_GET_LOG_ENTRY_ANOMALIES_DATASETS_PATH = '/api/infra/log_analysis/results/log_entry_anomalies_datasets'; @@ -26,6 +27,7 @@ export const getLogEntryAnomaliesDatasetsRequestPayloadRT = rt.type({ data: rt.type({ // log view logView: persistedLogViewReferenceRT, + idFormats: idFormatByJobTypeRT, // the time range to fetch the anomalies datasets from timeRange: timeRangeRT, }), diff --git a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_categories.ts b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_categories.ts index e84825b8c6835..525292fb46ee3 100644 --- a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_categories.ts +++ b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_categories.ts @@ -8,6 +8,7 @@ import * as rt from 'io-ts'; import { persistedLogViewReferenceRT } from '@kbn/logs-shared-plugin/common'; +import { idFormatRT } from '../../id_formats/v1/id_formats'; import { badRequestErrorRT, forbiddenErrorRT, @@ -41,6 +42,7 @@ export const getLogEntryCategoriesRequestPayloadRT = rt.type({ categoryCount: rt.number, // log view logView: persistedLogViewReferenceRT, + idFormat: idFormatRT, // the time range to fetch the categories from timeRange: timeRangeRT, // a list of histograms to create diff --git a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_datasets.ts b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_datasets.ts index e051e313d9b8e..5b258d05e6cc9 100644 --- a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_datasets.ts +++ b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_datasets.ts @@ -8,6 +8,7 @@ import * as rt from 'io-ts'; import { persistedLogViewReferenceRT } from '@kbn/logs-shared-plugin/common'; +import { idFormatRT } from '../../id_formats/v1/id_formats'; import { badRequestErrorRT, forbiddenErrorRT, @@ -25,6 +26,7 @@ export const getLogEntryCategoryDatasetsRequestPayloadRT = rt.type({ data: rt.type({ // log view logView: persistedLogViewReferenceRT, + idFormat: idFormatRT, // the time range to fetch the category datasets from timeRange: timeRangeRT, }), diff --git a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_examples.ts b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_examples.ts index fc6ece5d7b7f7..c0b7b3c00b551 100644 --- a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_examples.ts +++ b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_category_examples.ts @@ -7,6 +7,7 @@ import { logEntryContextRT, persistedLogViewReferenceRT } from '@kbn/logs-shared-plugin/common'; import * as rt from 'io-ts'; +import { idFormatRT } from '../../id_formats/v1/id_formats'; import { badRequestErrorRT, forbiddenErrorRT, @@ -29,6 +30,7 @@ export const getLogEntryCategoryExamplesRequestPayloadRT = rt.type({ exampleCount: rt.number, // log view logView: persistedLogViewReferenceRT, + idFormat: idFormatRT, // the time range to fetch the category examples from timeRange: timeRangeRT, }), diff --git a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_examples.ts b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_examples.ts index ebc78693f4983..4a0779a9128f8 100644 --- a/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_examples.ts +++ b/x-pack/plugins/infra/common/http_api/log_analysis/results/v1/log_entry_examples.ts @@ -7,6 +7,7 @@ import * as rt from 'io-ts'; import { persistedLogViewReferenceRT } from '@kbn/logs-shared-plugin/common'; +import { idFormatRT } from '../../id_formats/v1/id_formats'; import { logEntryExampleRT } from '../../../../log_analysis'; import { badRequestErrorRT, @@ -31,6 +32,7 @@ export const getLogEntryExamplesRequestPayloadRT = rt.type({ exampleCount: rt.number, // logView logView: persistedLogViewReferenceRT, + idFormat: idFormatRT, // the time range to fetch the log rate examples from timeRange: timeRangeRT, }), diff --git a/x-pack/plugins/infra/common/http_api/profiling_api.ts b/x-pack/plugins/infra/common/http_api/profiling_api.ts new file mode 100644 index 0000000000000..3cf57ec0ef358 --- /dev/null +++ b/x-pack/plugins/infra/common/http_api/profiling_api.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 rt from 'io-ts'; + +export const InfraProfilingRequestParamsRT = rt.type({ + hostname: rt.string, + timeRange: rt.type({ + from: rt.number, + to: rt.number, + }), +}); + +export type InfraProfilingRequestParams = rt.TypeOf; diff --git a/x-pack/plugins/infra/common/log_analysis/job_parameters.ts b/x-pack/plugins/infra/common/log_analysis/job_parameters.ts index 1a695af80a4d5..22fcdea971e23 100644 --- a/x-pack/plugins/infra/common/log_analysis/job_parameters.ts +++ b/x-pack/plugins/infra/common/log_analysis/job_parameters.ts @@ -6,6 +6,8 @@ */ import * as rt from 'io-ts'; +import { v5 } from 'uuid'; +import { IdFormat, JobType } from '../http_api/latest'; export const bucketSpan = 900000; @@ -13,14 +15,32 @@ export const categoriesMessageField = 'message'; export const partitionField = 'event.dataset'; -export const getJobIdPrefix = (spaceId: string, sourceId: string) => - `kibana-logs-ui-${spaceId}-${sourceId}-`; +const ID_NAMESPACE = 'f91b78c0-fdd3-425d-a4ba-4c028fe57e0f'; -export const getJobId = (spaceId: string, logViewId: string, jobType: string) => - `${getJobIdPrefix(spaceId, logViewId)}${jobType}`; +export const getJobIdPrefix = (spaceId: string, sourceId: string, idFormat: IdFormat) => { + if (idFormat === 'legacy') { + return `kibana-logs-ui-${spaceId}-${sourceId}-`; + } else { + // A UUID is 36 characters but based on the ML job names for logs, our limit is 32 characters + // Thus we remove the 4 dashes + const uuid = v5(`${spaceId}-${sourceId}`, ID_NAMESPACE).replaceAll('-', ''); + return `logs-${uuid}-`; + } +}; -export const getDatafeedId = (spaceId: string, logViewId: string, jobType: string) => - `datafeed-${getJobId(spaceId, logViewId, jobType)}`; +export const getJobId = ( + spaceId: string, + logViewId: string, + idFormat: IdFormat, + jobType: JobType +) => `${getJobIdPrefix(spaceId, logViewId, idFormat)}${jobType}`; + +export const getDatafeedId = ( + spaceId: string, + logViewId: string, + idFormat: IdFormat, + jobType: JobType +) => `datafeed-${getJobId(spaceId, logViewId, idFormat, jobType)}`; export const datasetFilterRT = rt.union([ rt.strict({ diff --git a/x-pack/plugins/infra/common/log_analysis/log_entry_categories_analysis.ts b/x-pack/plugins/infra/common/log_analysis/log_entry_categories_analysis.ts index 1ea952d7a8a15..d22c75dc3cf56 100644 --- a/x-pack/plugins/infra/common/log_analysis/log_entry_categories_analysis.ts +++ b/x-pack/plugins/infra/common/log_analysis/log_entry_categories_analysis.ts @@ -8,9 +8,7 @@ import * as rt from 'io-ts'; import { sortRT } from './log_analysis_results'; -export const logEntryCategoriesJobTypeRT = rt.keyof({ - 'log-entry-categories-count': null, -}); +export const logEntryCategoriesJobTypeRT = rt.literal('log-entry-categories-count'); export type LogEntryCategoriesJobType = rt.TypeOf; @@ -18,6 +16,8 @@ export const logEntryCategoriesJobTypes: LogEntryCategoriesJobType[] = [ 'log-entry-categories-count', ]; +export const logEntryCategoriesJobType: LogEntryCategoriesJobType = 'log-entry-categories-count'; + export const logEntryCategoryDatasetRT = rt.type({ name: rt.string, maximumAnomalyScore: rt.number, diff --git a/x-pack/plugins/infra/common/log_analysis/log_entry_rate_analysis.ts b/x-pack/plugins/infra/common/log_analysis/log_entry_rate_analysis.ts index b13cf58764e3b..e634f5fc4ce86 100644 --- a/x-pack/plugins/infra/common/log_analysis/log_entry_rate_analysis.ts +++ b/x-pack/plugins/infra/common/log_analysis/log_entry_rate_analysis.ts @@ -7,10 +7,9 @@ import * as rt from 'io-ts'; -export const logEntryRateJobTypeRT = rt.keyof({ - 'log-entry-rate': null, -}); +export const logEntryRateJobTypeRT = rt.literal('log-entry-rate'); export type LogEntryRateJobType = rt.TypeOf; -export const logEntryRateJobTypes: LogEntryRateJobType[] = ['log-entry-rate']; +export const logEntryRateJobType: LogEntryRateJobType = 'log-entry-rate'; +export const logEntryRateJobTypes: LogEntryRateJobType[] = [logEntryRateJobType]; diff --git a/x-pack/plugins/infra/common/plugin_config_types.ts b/x-pack/plugins/infra/common/plugin_config_types.ts index 8f39680959bb5..b69afe176cab8 100644 --- a/x-pack/plugins/infra/common/plugin_config_types.ts +++ b/x-pack/plugins/infra/common/plugin_config_types.ts @@ -34,6 +34,7 @@ export interface InfraConfig { metricThresholdAlertRuleEnabled: boolean; logThresholdAlertRuleEnabled: boolean; alertsAndRulesDropdownEnabled: boolean; + profilingEnabled: boolean; }; } diff --git a/x-pack/plugins/infra/kibana.jsonc b/x-pack/plugins/infra/kibana.jsonc index b97a273b91f71..a5ffd146b618f 100644 --- a/x-pack/plugins/infra/kibana.jsonc +++ b/x-pack/plugins/infra/kibana.jsonc @@ -35,7 +35,7 @@ "usageCollection", "visTypeTimeseries" ], - "optionalPlugins": ["spaces", "ml", "home", "embeddable", "osquery", "cloud"], + "optionalPlugins": ["spaces", "ml", "home", "embeddable", "osquery", "cloud", "profilingDataAccess"], "requiredBundles": [ "unifiedSearch", "observability", diff --git a/x-pack/plugins/infra/public/common/asset_details_config/asset_details_tabs.tsx b/x-pack/plugins/infra/public/common/asset_details_config/asset_details_tabs.tsx index 09e5cf2684075..312ed7eb04a98 100644 --- a/x-pack/plugins/infra/public/common/asset_details_config/asset_details_tabs.tsx +++ b/x-pack/plugins/infra/public/common/asset_details_config/asset_details_tabs.tsx @@ -27,6 +27,12 @@ export const commonFlyoutTabs: Tab[] = [ defaultMessage: 'Processes', }), }, + { + id: ContentTabIds.PROFILING, + name: i18n.translate('xpack.infra.metrics.nodeDetails.tabs.profiling', { + defaultMessage: 'Universal Profiling', + }), + }, { id: ContentTabIds.LOGS, name: i18n.translate('xpack.infra.nodeDetails.tabs.logs.title', { diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts index 9805fd3176683..d72b2bee8a8e5 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/asset_details/host/host_kpi_charts.ts @@ -10,7 +10,7 @@ import { hostLensFormulas } from '../../../formulas'; import { METRICS_TOOLTIP } from '../../translations'; import type { KPIChartProps } from '../../types'; -export const hostKPICharts: KPIChartProps[] = [ +export const hostKPICharts = (backgroundColor: string): KPIChartProps[] => [ { id: 'cpuUsage', title: i18n.translate('xpack.infra.assetDetailsEmbeddable.overview.kpi.cpuUsage.title', { @@ -29,7 +29,7 @@ export const hostKPICharts: KPIChartProps[] = [ : undefined, }, options: { - backgroundColor: '#F1D86F', + backgroundColor, showTrendLine: true, }, type: 'visualization', @@ -57,7 +57,7 @@ export const hostKPICharts: KPIChartProps[] = [ : undefined, }, options: { - backgroundColor: '#79AAD9', + backgroundColor, showTrendLine: true, }, type: 'visualization', @@ -82,7 +82,7 @@ export const hostKPICharts: KPIChartProps[] = [ : undefined, }, options: { - backgroundColor: '#A987D1', + backgroundColor, showTrendLine: true, }, type: 'visualization', @@ -107,7 +107,7 @@ export const hostKPICharts: KPIChartProps[] = [ : undefined, }, options: { - backgroundColor: '#F5A35C', + backgroundColor, showTrendLine: true, }, type: 'visualization', diff --git a/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx b/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx index e779808347ec4..e55a70978a748 100644 --- a/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/__stories__/decorator.tsx @@ -190,6 +190,7 @@ export const DecorateWithKibanaContext: DecoratorFn = (story) => { metricThresholdAlertRuleEnabled: true, logThresholdAlertRuleEnabled: true, alertsAndRulesDropdownEnabled: true, + profilingEnabled: false, }, }; diff --git a/x-pack/plugins/infra/public/components/asset_details/content/content.tsx b/x-pack/plugins/infra/public/components/asset_details/content/content.tsx index 9ffd94fcd9e75..49ad1cb87398b 100644 --- a/x-pack/plugins/infra/public/components/asset_details/content/content.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/content/content.tsx @@ -9,7 +9,7 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; import { DatePicker } from '../date_picker/date_picker'; import { useTabSwitcherContext } from '../hooks/use_tab_switcher'; -import { Anomalies, Metadata, Processes, Osquery, Logs, Overview } from '../tabs'; +import { Anomalies, Metadata, Processes, Osquery, Logs, Overview, Profiling } from '../tabs'; import { ContentTabIds } from '../types'; export const Content = () => { @@ -22,6 +22,7 @@ export const Content = () => { ContentTabIds.LOGS, ContentTabIds.METADATA, ContentTabIds.PROCESSES, + ContentTabIds.PROFILING, ContentTabIds.ANOMALIES, ]} /> @@ -45,6 +46,9 @@ export const Content = () => { + + + ); 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 4b5ec03b3300b..42abaf1c5bc91 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 @@ -49,6 +49,7 @@ const TabIdRT = rt.union([ rt.literal(ContentTabIds.OVERVIEW), rt.literal(ContentTabIds.METADATA), rt.literal(ContentTabIds.PROCESSES), + rt.literal(ContentTabIds.PROFILING), rt.literal(ContentTabIds.LOGS), rt.literal(ContentTabIds.ANOMALIES), rt.literal(ContentTabIds.OSQUERY), diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_page_header.tsx b/x-pack/plugins/infra/public/components/asset_details/hooks/use_page_header.tsx index a7e0b311d3343..3fae1eca66a40 100644 --- a/x-pack/plugins/infra/public/components/asset_details/hooks/use_page_header.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_page_header.tsx @@ -113,8 +113,9 @@ const useFeatureFlagTabs = () => { const featureFlagControlledTabs: Partial> = useMemo( () => ({ [ContentTabIds.OSQUERY]: featureFlags.osqueryEnabled, + [ContentTabIds.PROFILING]: featureFlags.profilingEnabled, }), - [featureFlags.osqueryEnabled] + [featureFlags.osqueryEnabled, featureFlags.profilingEnabled] ); const isTabEnabled = useCallback( diff --git a/x-pack/plugins/infra/public/components/asset_details/hooks/use_profilling_flamegraph_data.ts b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profilling_flamegraph_data.ts new file mode 100644 index 0000000000000..6ff433c11512e --- /dev/null +++ b/x-pack/plugins/infra/public/components/asset_details/hooks/use_profilling_flamegraph_data.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect } from 'react'; +import type { BaseFlameGraph } from '@kbn/profiling-utils'; +import type { Subject } from 'rxjs'; +import { + type InfraProfilingRequestParams, + InfraProfilingRequestParamsRT, +} from '../../../../common/http_api/profiling_api'; +import { useHTTPRequest } from '../../../hooks/use_http_request'; + +interface Props extends InfraProfilingRequestParams { + request$?: Subject<() => Promise>; + active: boolean; +} + +export function useProfilingFlamegraphData({ request$, active, ...params }: Props) { + const { loading, error, response, makeRequest } = useHTTPRequest( + '/api/infra/profiling/flamegraph', + 'POST', + JSON.stringify(InfraProfilingRequestParamsRT.encode(params)), + undefined, + undefined, + undefined, + true + ); + + useEffect(() => { + if (!active) { + return; + } + + if (request$) { + request$.next(makeRequest); + } else { + makeRequest(); + } + }, [active, makeRequest, request$]); + + return { + loading, + error, + response, + }; +} diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/index.ts b/x-pack/plugins/infra/public/components/asset_details/tabs/index.ts index 4a3cde85a3ca2..779531d15910b 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/index.ts +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/index.ts @@ -8,6 +8,7 @@ export { Anomalies } from './anomalies/anomalies'; export { Metadata } from './metadata/metadata'; export { Processes } from './processes/processes'; +export { Profiling } from './profiling/profiling'; export { Osquery } from './osquery/osquery'; export { Logs } from './logs/logs'; export { Overview } from './overview/overview'; diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx index 034d6feaacfcd..2a1395d7cf787 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpis/kpi_grid.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { TimeRange } from '@kbn/es-query'; +import { useTheme } from '@kbn/observability-shared-plugin/public'; import { assetDetailsDashboards, KPI_CHART_HEIGHT } from '../../../../../common/visualizations'; import { Kpi } from './kpi'; @@ -19,19 +20,23 @@ interface Props { } export const KPIGrid = ({ assetName, dataView, dateRange }: Props) => { + const euiTheme = useTheme(); + return ( - {assetDetailsDashboards.host.hostKPICharts.map((chartProps, index) => ( - - - - ))} + {assetDetailsDashboards.host + .hostKPICharts(euiTheme.eui.euiColorLightestShade) + .map((chartProps, index) => ( + + + + ))} ); }; 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 new file mode 100644 index 0000000000000..ee6a86df9e89f --- /dev/null +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/profiling/profiling.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EmbeddableFlamegraph } from '@kbn/observability-shared-plugin/public'; +import { BaseFlameGraph } from '@kbn/profiling-utils'; +import { useAssetDetailsRenderPropsContext } from '../../hooks/use_asset_details_render_props'; +import { useDatePickerContext } from '../../hooks/use_date_picker'; +import { useProfilingFlamegraphData } from '../../hooks/use_profilling_flamegraph_data'; +import { useRequestObservable } from '../../hooks/use_request_observable'; +import { useTabSwitcherContext } from '../../hooks/use_tab_switcher'; +import { ContentTabIds } from '../../types'; + +export function Profiling() { + const { request$ } = useRequestObservable(); + const { asset } = useAssetDetailsRenderPropsContext(); + const { activeTabId } = useTabSwitcherContext(); + const { getDateRangeInTimestamp } = useDatePickerContext(); + const { loading, response } = useProfilingFlamegraphData({ + active: activeTabId === ContentTabIds.PROFILING, + request$, + hostname: asset.name, + timeRange: getDateRangeInTimestamp(), + }); + + return ; +} diff --git a/x-pack/plugins/infra/public/components/asset_details/types.ts b/x-pack/plugins/infra/public/components/asset_details/types.ts index 56f62a5ebc086..dd3ae9af9d62e 100644 --- a/x-pack/plugins/infra/public/components/asset_details/types.ts +++ b/x-pack/plugins/infra/public/components/asset_details/types.ts @@ -21,6 +21,7 @@ export enum ContentTabIds { OVERVIEW = 'overview', METADATA = 'metadata', PROCESSES = 'processes', + PROFILING = 'profiling', ANOMALIES = 'anomalies', OSQUERY = 'osquery', LOGS = 'logs', diff --git a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx index 0ccd208cf24bd..0eec13f778e46 100644 --- a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx @@ -7,6 +7,7 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { useCallback } from 'react'; +import { logEntryCategoriesJobType, logEntryRateJobType } from '../../../../../common/log_analysis'; import { useLogAnalysisCapabilitiesContext } from '../../../../containers/logs/log_analysis'; import { logEntryCategoriesModule, @@ -40,7 +41,7 @@ export const LogAnalysisModuleList: React.FC<{ +

    diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_cleanup.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_cleanup.ts index dd4fc9144976e..b27938f795eea 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_cleanup.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_cleanup.ts @@ -8,20 +8,22 @@ import * as rt from 'io-ts'; import type { HttpHandler } from '@kbn/core/public'; +import { IdFormat, JobType } from '../../../../../common/http_api/latest'; import { getDatafeedId, getJobId } from '../../../../../common/log_analysis'; import { decodeOrThrow } from '../../../../../common/runtime_types'; -interface DeleteJobsRequestArgs { +interface DeleteJobsRequestArgs { spaceId: string; logViewId: string; - jobTypes: JobType[]; + idFormat: IdFormat; + jobTypes: T[]; } -export const callDeleteJobs = async ( - requestArgs: DeleteJobsRequestArgs, +export const callDeleteJobs = async ( + requestArgs: DeleteJobsRequestArgs, fetch: HttpHandler ) => { - const { spaceId, logViewId, jobTypes } = requestArgs; + const { spaceId, logViewId, idFormat, jobTypes } = requestArgs; // NOTE: Deleting the jobs via this API will delete the datafeeds at the same time const deleteJobsResponse = await fetch('/internal/ml/jobs/delete_jobs', { @@ -29,7 +31,7 @@ export const callDeleteJobs = async ( version: '1', body: JSON.stringify( deleteJobsRequestPayloadRT.encode({ - jobIds: jobTypes.map((jobType) => getJobId(spaceId, logViewId, jobType)), + jobIds: jobTypes.map((jobType) => getJobId(spaceId, logViewId, idFormat, jobType)), }) ), }); @@ -45,17 +47,18 @@ export const callGetJobDeletionTasks = async (fetch: HttpHandler) => { return decodeOrThrow(getJobDeletionTasksResponsePayloadRT)(jobDeletionTasksResponse); }; -interface StopDatafeedsRequestArgs { +interface StopDatafeedsRequestArgs { spaceId: string; logViewId: string; - jobTypes: JobType[]; + idFormat: IdFormat; + jobTypes: T[]; } -export const callStopDatafeeds = async ( - requestArgs: StopDatafeedsRequestArgs, +export const callStopDatafeeds = async ( + requestArgs: StopDatafeedsRequestArgs, fetch: HttpHandler ) => { - const { spaceId, logViewId, jobTypes } = requestArgs; + const { spaceId, logViewId, idFormat, jobTypes } = requestArgs; // Stop datafeed due to https://github.com/elastic/kibana/issues/44652 const stopDatafeedResponse = await fetch('/internal/ml/jobs/stop_datafeeds', { @@ -63,7 +66,9 @@ export const callStopDatafeeds = async ( version: '1', body: JSON.stringify( stopDatafeedsRequestPayloadRT.encode({ - datafeedIds: jobTypes.map((jobType) => getDatafeedId(spaceId, logViewId, jobType)), + datafeedIds: jobTypes.map((jobType) => + getDatafeedId(spaceId, logViewId, idFormat, jobType) + ), }) ), }); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts index 35c678f7b20c0..9e2996215df8d 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_get_jobs_summary_api.ts @@ -8,26 +8,28 @@ import * as rt from 'io-ts'; import type { HttpHandler } from '@kbn/core/public'; +import { IdFormat, JobType } from '../../../../../common/http_api/latest'; import { getJobId, jobCustomSettingsRT } from '../../../../../common/log_analysis'; import { decodeOrThrow } from '../../../../../common/runtime_types'; -interface RequestArgs { +interface RequestArgs { spaceId: string; logViewId: string; - jobTypes: JobType[]; + idFormat: IdFormat; + jobTypes: T[]; } -export const callJobsSummaryAPI = async ( - requestArgs: RequestArgs, +export const callJobsSummaryAPI = async ( + requestArgs: RequestArgs, fetch: HttpHandler ) => { - const { spaceId, logViewId, jobTypes } = requestArgs; + const { spaceId, logViewId, idFormat, jobTypes } = requestArgs; const response = await fetch('/internal/ml/jobs/jobs_summary', { method: 'POST', version: '1', body: JSON.stringify( fetchJobStatusRequestPayloadRT.encode({ - jobIds: jobTypes.map((jobType) => getJobId(spaceId, logViewId, jobType)), + jobIds: jobTypes.map((jobType) => getJobId(spaceId, logViewId, idFormat, jobType)), }) ), }); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_setup_module_api.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_setup_module_api.ts index f19c754ada380..f1e34cdd40518 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_setup_module_api.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/api/ml_setup_module_api.ts @@ -46,7 +46,7 @@ export const callSetupMlModuleAPI = async (requestArgs: RequestArgs, fetch: Http start, end, indexPatternName: indexPattern, - prefix: getJobIdPrefix(spaceId, sourceId), + prefix: getJobIdPrefix(spaceId, sourceId, 'hashed'), startDatafeed: true, jobOverrides, datafeedOverrides, diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_cleanup.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_cleanup.tsx index b9668311df062..b70ca688f53d6 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_cleanup.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_cleanup.tsx @@ -6,17 +6,19 @@ */ import type { HttpHandler } from '@kbn/core/public'; +import { IdFormat, JobType } from '../../../../common/http_api/latest'; import { getJobId } from '../../../../common/log_analysis'; import { callDeleteJobs, callGetJobDeletionTasks, callStopDatafeeds } from './api/ml_cleanup'; -export const cleanUpJobsAndDatafeeds = async ( +export const cleanUpJobsAndDatafeeds = async ( spaceId: string, logViewId: string, - jobTypes: JobType[], + idFormat: IdFormat, + jobTypes: T[], fetch: HttpHandler ) => { try { - await callStopDatafeeds({ spaceId, logViewId, jobTypes }, fetch); + await callStopDatafeeds({ spaceId, logViewId, idFormat, jobTypes }, fetch); } catch (err) { // Proceed only if datafeed has been deleted or didn't exist in the first place if (err?.response?.status !== 404) { @@ -24,27 +26,32 @@ export const cleanUpJobsAndDatafeeds = async ( } } - return await deleteJobs(spaceId, logViewId, jobTypes, fetch); + return await deleteJobs(spaceId, logViewId, idFormat, jobTypes, fetch); }; -const deleteJobs = async ( +const deleteJobs = async ( spaceId: string, logViewId: string, - jobTypes: JobType[], + idFormat: IdFormat, + jobTypes: T[], fetch: HttpHandler ) => { - const deleteJobsResponse = await callDeleteJobs({ spaceId, logViewId, jobTypes }, fetch); - await waitUntilJobsAreDeleted(spaceId, logViewId, jobTypes, fetch); + const deleteJobsResponse = await callDeleteJobs( + { spaceId, logViewId, idFormat, jobTypes }, + fetch + ); + await waitUntilJobsAreDeleted(spaceId, logViewId, idFormat, jobTypes, fetch); return deleteJobsResponse; }; -const waitUntilJobsAreDeleted = async ( +const waitUntilJobsAreDeleted = async ( spaceId: string, logViewId: string, - jobTypes: JobType[], + idFormat: IdFormat, + jobTypes: T[], fetch: HttpHandler ) => { - const moduleJobIds = jobTypes.map((jobType) => getJobId(spaceId, logViewId, jobType)); + const moduleJobIds = jobTypes.map((jobType) => getJobId(spaceId, logViewId, idFormat, jobType)); while (true) { const { jobs } = await callGetJobDeletionTasks(fetch); const needToWait = jobs diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx index 58bade0a81d06..25ddd466e6e8f 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx @@ -7,22 +7,27 @@ import { useCallback, useMemo } from 'react'; import { useUiTracker } from '@kbn/observability-shared-plugin/public'; +import { useLogMlJobIdFormatsShimContext } from '../../../pages/logs/shared/use_log_ml_job_id_formats_shim'; +import { IdFormat, JobType } from '../../../../common/http_api/latest'; import { DatasetFilter } from '../../../../common/log_analysis'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { useModuleStatus } from './log_analysis_module_status'; import { ModuleDescriptor, ModuleSourceConfiguration } from './log_analysis_module_types'; -export const useLogAnalysisModule = ({ +export const useLogAnalysisModule = ({ sourceConfiguration, + idFormat, moduleDescriptor, }: { sourceConfiguration: ModuleSourceConfiguration; - moduleDescriptor: ModuleDescriptor; + idFormat: IdFormat; + moduleDescriptor: ModuleDescriptor; }) => { const { services } = useKibanaContextForPlugin(); const { spaceId, sourceId: logViewId, timestampField, runtimeMappings } = sourceConfiguration; const [moduleStatus, dispatchModuleStatus] = useModuleStatus(moduleDescriptor.jobTypes); + const { migrateIdFormat } = useLogMlJobIdFormatsShimContext(); const trackMetric = useUiTracker({ app: 'infra_logs' }); @@ -31,7 +36,12 @@ export const useLogAnalysisModule = ({ cancelPreviousOn: 'resolution', createPromise: async () => { dispatchModuleStatus({ type: 'fetchingJobStatuses' }); - return await moduleDescriptor.getJobSummary(spaceId, logViewId, services.http.fetch); + return await moduleDescriptor.getJobSummary( + spaceId, + logViewId, + idFormat, + services.http.fetch + ); }, onResolve: (jobResponse) => { dispatchModuleStatus({ @@ -39,13 +49,14 @@ export const useLogAnalysisModule = ({ payload: jobResponse, spaceId, logViewId, + idFormat, }); }, onReject: () => { dispatchModuleStatus({ type: 'failedFetchingJobStatuses' }); }, }, - [spaceId, logViewId] + [spaceId, logViewId, idFormat] ); const [, setUpModule] = useTrackedPromise( @@ -74,6 +85,7 @@ export const useLogAnalysisModule = ({ const jobSummaries = await moduleDescriptor.getJobSummary( spaceId, logViewId, + 'hashed', services.http.fetch ); return { setupResult, jobSummaries }; @@ -105,7 +117,9 @@ export const useLogAnalysisModule = ({ jobSummaries, spaceId, logViewId, + idFormat: 'hashed', }); + migrateIdFormat(moduleDescriptor.jobTypes[0]); }, onReject: (e: any) => { dispatchModuleStatus({ type: 'failedSetup' }); @@ -121,13 +135,18 @@ export const useLogAnalysisModule = ({ { cancelPreviousOn: 'resolution', createPromise: async () => { - return await moduleDescriptor.cleanUpModule(spaceId, logViewId, services.http.fetch); + return await moduleDescriptor.cleanUpModule( + spaceId, + logViewId, + idFormat, + services.http.fetch + ); }, onReject: (e) => { throw new Error(`Failed to clean up previous ML job: ${e}`); }, }, - [spaceId, logViewId] + [spaceId, logViewId, idFormat] ); const isCleaningUp = useMemo( @@ -159,8 +178,8 @@ export const useLogAnalysisModule = ({ }, [dispatchModuleStatus]); const jobIds = useMemo( - () => moduleDescriptor.getJobIds(spaceId, logViewId), - [moduleDescriptor, spaceId, logViewId] + () => moduleDescriptor.getJobIds(spaceId, logViewId, idFormat), + [moduleDescriptor, spaceId, logViewId, idFormat] ); return { diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts index 057580679210a..5cf26d75e9f00 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts @@ -7,14 +7,15 @@ import { useMemo } from 'react'; import equal from 'fast-deep-equal'; +import { JobType } from '../../../../common/http_api/latest'; import { JobSummary } from './api/ml_get_jobs_summary_api'; import { ModuleDescriptor, ModuleSourceConfiguration } from './log_analysis_module_types'; -export const useLogAnalysisModuleConfiguration = ({ +export const useLogAnalysisModuleConfiguration = ({ moduleDescriptor, sourceConfiguration, }: { - moduleDescriptor: ModuleDescriptor; + moduleDescriptor: ModuleDescriptor; sourceConfiguration: ModuleSourceConfiguration; }) => { const getIsJobConfigurationOutdated = useMemo( @@ -28,8 +29,8 @@ export const useLogAnalysisModuleConfiguration = ({ }; export const isJobConfigurationOutdated = - ( - { bucketSpan }: ModuleDescriptor, + ( + { bucketSpan }: ModuleDescriptor, currentSourceConfiguration: ModuleSourceConfiguration ) => (jobSummary: JobSummary): boolean => { diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx index 61de3681b574d..b75f913170326 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx @@ -6,6 +6,7 @@ */ import { useCallback, useMemo, useState } from 'react'; +import { IdFormat, JobType } from '../../../../common/http_api/latest'; import { getJobId } from '../../../../common/log_analysis'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; @@ -13,12 +14,14 @@ import { JobSummary } from './api/ml_get_jobs_summary_api'; import { GetMlModuleResponsePayload, JobDefinition } from './api/ml_get_module'; import { ModuleDescriptor, ModuleSourceConfiguration } from './log_analysis_module_types'; -export const useLogAnalysisModuleDefinition = ({ +export const useLogAnalysisModuleDefinition = ({ sourceConfiguration: { spaceId, sourceId }, + idFormat, moduleDescriptor, }: { sourceConfiguration: ModuleSourceConfiguration; - moduleDescriptor: ModuleDescriptor; + idFormat: IdFormat; + moduleDescriptor: ModuleDescriptor; }) => { const { services } = useKibanaContextForPlugin(); const [moduleDefinition, setModuleDefinition] = useState< @@ -31,12 +34,12 @@ export const useLogAnalysisModuleDefinition = ({ ? moduleDefinition.jobs.reduce>( (accumulatedJobDefinitions, jobDefinition) => ({ ...accumulatedJobDefinitions, - [getJobId(spaceId, sourceId, jobDefinition.id)]: jobDefinition, + [getJobId(spaceId, sourceId, idFormat, jobDefinition.id as T)]: jobDefinition, }), {} ) : {}, - [moduleDefinition, sourceId, spaceId] + [moduleDefinition, sourceId, spaceId, idFormat] ); const [fetchModuleDefinitionRequest, fetchModuleDefinition] = useTrackedPromise( diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx index 6fcfea1038a04..b6ce4085286e6 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx @@ -7,6 +7,7 @@ import { useReducer } from 'react'; +import { IdFormat, JobType } from '../../../../common/http_api/latest'; import { JobStatus, getDatafeedId, @@ -18,8 +19,8 @@ import { FetchJobStatusResponsePayload, JobSummary } from './api/ml_get_jobs_sum import { SetupMlModuleResponsePayload } from './api/ml_setup_module_api'; import { MandatoryProperty } from '../../../../common/utility_types'; -interface StatusReducerState { - jobStatus: Record; +interface StatusReducerState { + jobStatus: Record; jobSummaries: JobSummary[]; lastSetupErrorMessages: string[]; setupStatus: SetupStatus; @@ -31,6 +32,7 @@ type StatusReducerAction = type: 'finishedSetup'; logViewId: string; spaceId: string; + idFormat: IdFormat; jobSetupResults: SetupMlModuleResponsePayload['jobs']; jobSummaries: FetchJobStatusResponsePayload; datafeedSetupResults: SetupMlModuleResponsePayload['datafeeds']; @@ -41,22 +43,23 @@ type StatusReducerAction = type: 'fetchedJobStatuses'; spaceId: string; logViewId: string; + idFormat: IdFormat; payload: FetchJobStatusResponsePayload; } | { type: 'failedFetchingJobStatuses' } | { type: 'viewedResults' }; -const createInitialState = ({ +const createInitialState = ({ jobTypes, }: { - jobTypes: JobType[]; -}): StatusReducerState => ({ + jobTypes: T[]; +}): StatusReducerState => ({ jobStatus: jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, [jobType]: 'unknown', }), - {} as Record + {} as Record ), jobSummaries: [], lastSetupErrorMessages: [], @@ -64,11 +67,8 @@ const createInitialState = ({ }); const createStatusReducer = - (jobTypes: JobType[]) => - ( - state: StatusReducerState, - action: StatusReducerAction - ): StatusReducerState => { + (jobTypes: T[]) => + (state: StatusReducerState, action: StatusReducerAction): StatusReducerState => { switch (action.type) { case 'startedSetup': { return { @@ -78,25 +78,34 @@ const createStatusReducer = ...accumulatedJobStatus, [jobType]: 'initializing', }), - {} as Record + {} as Record ), setupStatus: { type: 'pending' }, }; } case 'finishedSetup': { - const { datafeedSetupResults, jobSetupResults, jobSummaries, spaceId, logViewId } = action; + const { + datafeedSetupResults, + jobSetupResults, + jobSummaries, + spaceId, + logViewId, + idFormat, + } = action; const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, [jobType]: - hasSuccessfullyCreatedJob(getJobId(spaceId, logViewId, jobType))(jobSetupResults) && - hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, logViewId, jobType))( + hasSuccessfullyCreatedJob(getJobId(spaceId, logViewId, idFormat, jobType))( + jobSetupResults + ) && + hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, logViewId, idFormat, jobType))( datafeedSetupResults ) ? 'started' : 'failed', }), - {} as Record + {} as Record ); const nextSetupStatus: SetupStatus = Object.values(nextJobStatus).every( (jobState) => jobState === 'started' || jobState === 'starting' @@ -129,7 +138,7 @@ const createStatusReducer = ...accumulatedJobStatus, [jobType]: 'failed', }), - {} as Record + {} as Record ), setupStatus: { type: 'failed', reasons: action.reason ? [action.reason] : ['unknown'] }, }; @@ -142,15 +151,15 @@ const createStatusReducer = }; } case 'fetchedJobStatuses': { - const { payload: jobSummaries, spaceId, logViewId } = action; + const { payload: jobSummaries, spaceId, logViewId, idFormat } = action; const { setupStatus } = state; const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, - [jobType]: getJobStatus(getJobId(spaceId, logViewId, jobType))(jobSummaries), + [jobType]: getJobStatus(getJobId(spaceId, logViewId, idFormat, jobType))(jobSummaries), }), - {} as Record + {} as Record ); const nextSetupStatus = getSetupStatus(nextJobStatus)(setupStatus); @@ -170,7 +179,7 @@ const createStatusReducer = ...accumulatedJobStatus, [jobType]: 'unknown', }), - {} as Record + {} as Record ), }; } @@ -243,7 +252,7 @@ const getJobStatus = })[0] || 'missing'; const getSetupStatus = - (everyJobStatus: Record) => + (everyJobStatus: Record) => (previousSetupStatus: SetupStatus): SetupStatus => Object.entries(everyJobStatus).reduce((setupStatus, [, jobStatus]) => { if (jobStatus === 'missing') { @@ -265,6 +274,6 @@ const hasError = ( value: Value ): value is MandatoryProperty => value.error != null; -export const useModuleStatus = (jobTypes: JobType[]) => { +export const useModuleStatus = (jobTypes: T[]) => { return useReducer(createStatusReducer(jobTypes), { jobTypes }, createInitialState); }; diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_types.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_types.ts index d6e95b7feebe5..2e0a6b742ce11 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_types.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_types.ts @@ -7,6 +7,7 @@ import type { HttpHandler } from '@kbn/core/public'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { IdFormat, JobType } from '../../../../common/http_api/latest'; import { ValidateLogEntryDatasetsResponsePayload, ValidationIndicesResponsePayload, @@ -19,16 +20,17 @@ import { SetupMlModuleResponsePayload } from './api/ml_setup_module_api'; export type { JobModelSizeStats, JobSummary } from './api/ml_get_jobs_summary_api'; -export interface ModuleDescriptor { +export interface ModuleDescriptor { moduleId: string; moduleName: string; moduleDescription: string; - jobTypes: JobType[]; + jobTypes: T[]; bucketSpan: number; - getJobIds: (spaceId: string, logViewId: string) => Record; + getJobIds: (spaceId: string, logViewId: string, idFormat: IdFormat) => Record; getJobSummary: ( spaceId: string, logViewId: string, + idFormat: IdFormat, fetch: HttpHandler ) => Promise; getModuleDefinition: (fetch: HttpHandler) => Promise; @@ -42,6 +44,7 @@ export interface ModuleDescriptor { cleanUpModule: ( spaceId: string, logViewId: string, + idFormat: IdFormat, fetch: HttpHandler ) => Promise; validateSetupIndices: ( diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts index fad6fd56f6251..14251d5f4dbf9 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts @@ -8,6 +8,7 @@ import { isEqual } from 'lodash'; import { useCallback, useEffect, useMemo, useState } from 'react'; import usePrevious from 'react-use/lib/usePrevious'; +import { JobType } from '../../../../common/http_api/latest'; import { combineDatasetFilters, DatasetFilter, @@ -30,21 +31,21 @@ type SetupHandler = ( datasetFilter: DatasetFilter ) => void; -interface AnalysisSetupStateArguments { +interface AnalysisSetupStateArguments { cleanUpAndSetUpModule: SetupHandler; - moduleDescriptor: ModuleDescriptor; + moduleDescriptor: ModuleDescriptor; setUpModule: SetupHandler; sourceConfiguration: ModuleSourceConfiguration; } const fourWeeksInMs = 86400000 * 7 * 4; -export const useAnalysisSetupState = ({ +export const useAnalysisSetupState = ({ cleanUpAndSetUpModule, moduleDescriptor: { validateSetupDatasets, validateSetupIndices }, setUpModule, sourceConfiguration, -}: AnalysisSetupStateArguments) => { +}: AnalysisSetupStateArguments) => { const { services } = useKibanaContextForPlugin(); const [startTime, setStartTime] = useState(Date.now() - fourWeeksInMs); const [endTime, setEndTime] = useState(undefined); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/module_descriptor.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/module_descriptor.ts index 07a183973178d..fbcc4d166d4b4 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/module_descriptor.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/module_descriptor.ts @@ -8,11 +8,13 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { i18n } from '@kbn/i18n'; import type { HttpHandler } from '@kbn/core/public'; +import { IdFormat } from '../../../../../../common/http_api/latest'; import { bucketSpan, categoriesMessageField, DatasetFilter, getJobId, + logEntryCategoriesJobType, LogEntryCategoriesJobType, logEntryCategoriesJobTypes, partitionField, @@ -36,21 +38,26 @@ const moduleDescription = i18n.translate( } ); -const getJobIds = (spaceId: string, logViewId: string) => +const getJobIds = (spaceId: string, logViewId: string, idFormat: IdFormat) => logEntryCategoriesJobTypes.reduce( (accumulatedJobIds, jobType) => ({ ...accumulatedJobIds, - [jobType]: getJobId(spaceId, logViewId, jobType), + [jobType]: getJobId(spaceId, logViewId, idFormat, jobType), }), {} as Record ); -const getJobSummary = async (spaceId: string, logViewId: string, fetch: HttpHandler) => { +const getJobSummary = async ( + spaceId: string, + logViewId: string, + idFormat: IdFormat, + fetch: HttpHandler +) => { const response = await callJobsSummaryAPI( - { spaceId, logViewId, jobTypes: logEntryCategoriesJobTypes }, + { spaceId, logViewId, idFormat, jobTypes: logEntryCategoriesJobTypes }, fetch ); - const jobIds = Object.values(getJobIds(spaceId, logViewId)); + const jobIds = Object.values(getJobIds(spaceId, logViewId, idFormat)); return response.filter((jobSummary) => jobIds.includes(jobSummary.id)); }; @@ -69,7 +76,7 @@ const setUpModule = async ( const indexNamePattern = indices.join(','); const jobOverrides = [ { - job_id: 'log-entry-categories-count' as const, + job_id: logEntryCategoriesJobType, analysis_config: { bucket_span: `${bucketSpan}ms`, }, @@ -88,7 +95,7 @@ const setUpModule = async ( ]; const datafeedOverrides = [ { - job_id: 'log-entry-categories-count' as const, + job_id: logEntryCategoriesJobType, runtime_mappings: runtimeMappings, }, ]; @@ -130,8 +137,19 @@ const setUpModule = async ( ); }; -const cleanUpModule = async (spaceId: string, logViewId: string, fetch: HttpHandler) => { - return await cleanUpJobsAndDatafeeds(spaceId, logViewId, logEntryCategoriesJobTypes, fetch); +const cleanUpModule = async ( + spaceId: string, + logViewId: string, + idFormat: IdFormat, + fetch: HttpHandler +) => { + return await cleanUpJobsAndDatafeeds( + spaceId, + logViewId, + idFormat, + logEntryCategoriesJobTypes, + fetch + ); }; const validateSetupIndices = async ( diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx index 3f4d802940974..a8c371fa9439e 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx @@ -8,6 +8,7 @@ import createContainer from 'constate'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { useMemo } from 'react'; +import { IdFormat } from '../../../../../../common/http_api/latest'; import { useLogAnalysisModule } from '../../log_analysis_module'; import { useLogAnalysisModuleConfiguration } from '../../log_analysis_module_configuration'; import { useLogAnalysisModuleDefinition } from '../../log_analysis_module_definition'; @@ -19,12 +20,14 @@ export const useLogEntryCategoriesModule = ({ indexPattern, logViewId, spaceId, + idFormat, timestampField, runtimeMappings, }: { indexPattern: string; logViewId: string; spaceId: string; + idFormat: IdFormat; timestampField: string; runtimeMappings: estypes.MappingRuntimeFields; }) => { @@ -41,6 +44,7 @@ export const useLogEntryCategoriesModule = ({ const logAnalysisModule = useLogAnalysisModule({ moduleDescriptor: logEntryCategoriesModule, + idFormat, sourceConfiguration, }); @@ -51,6 +55,7 @@ export const useLogEntryCategoriesModule = ({ const { fetchModuleDefinition, getIsJobDefinitionOutdated } = useLogAnalysisModuleDefinition({ sourceConfiguration, + idFormat, moduleDescriptor: logEntryCategoriesModule, }); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/module_descriptor.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/module_descriptor.ts index a2e0219da9915..a0dc8e68bf9a7 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/module_descriptor.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/module_descriptor.ts @@ -8,10 +8,12 @@ import { i18n } from '@kbn/i18n'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { HttpHandler } from '@kbn/core/public'; +import { IdFormat } from '../../../../../../common/http_api/latest'; import { bucketSpan, DatasetFilter, getJobId, + logEntryRateJobType, LogEntryRateJobType, logEntryRateJobTypes, partitionField, @@ -35,21 +37,26 @@ const moduleDescription = i18n.translate( } ); -const getJobIds = (spaceId: string, logViewId: string) => +const getJobIds = (spaceId: string, logViewId: string, idFormat: IdFormat) => logEntryRateJobTypes.reduce( (accumulatedJobIds, jobType) => ({ ...accumulatedJobIds, - [jobType]: getJobId(spaceId, logViewId, jobType), + [jobType]: getJobId(spaceId, logViewId, idFormat, jobType), }), {} as Record ); -const getJobSummary = async (spaceId: string, logViewId: string, fetch: HttpHandler) => { +const getJobSummary = async ( + spaceId: string, + logViewId: string, + idFormat: IdFormat, + fetch: HttpHandler +) => { const response = await callJobsSummaryAPI( - { spaceId, logViewId, jobTypes: logEntryRateJobTypes }, + { spaceId, logViewId, idFormat, jobTypes: logEntryRateJobTypes }, fetch ); - const jobIds = Object.values(getJobIds(spaceId, logViewId)); + const jobIds = Object.values(getJobIds(spaceId, logViewId, idFormat)); return response.filter((jobSummary) => jobIds.includes(jobSummary.id)); }; @@ -68,7 +75,8 @@ const setUpModule = async ( const indexNamePattern = indices.join(','); const jobOverrides = [ { - job_id: 'log-entry-rate' as const, + description: `Logs UI (${spaceId}/${sourceId}): Detects anomalies in the log entry ingestion rate`, + job_id: logEntryRateJobType, analysis_config: { bucket_span: `${bucketSpan}ms`, }, @@ -86,7 +94,7 @@ const setUpModule = async ( ]; const datafeedOverrides = [ { - job_id: 'log-entry-rate' as const, + job_id: logEntryRateJobType, runtime_mappings: runtimeMappings, }, ]; @@ -122,8 +130,13 @@ const setUpModule = async ( ); }; -const cleanUpModule = async (spaceId: string, logViewId: string, fetch: HttpHandler) => { - return await cleanUpJobsAndDatafeeds(spaceId, logViewId, logEntryRateJobTypes, fetch); +const cleanUpModule = async ( + spaceId: string, + logViewId: string, + idFormat: IdFormat, + fetch: HttpHandler +) => { + return await cleanUpJobsAndDatafeeds(spaceId, logViewId, idFormat, logEntryRateJobTypes, fetch); }; const validateSetupIndices = async ( diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx index 65bddee00ce30..a00d9f0017c31 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx @@ -8,6 +8,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import createContainer from 'constate'; import { useMemo } from 'react'; +import { IdFormat } from '../../../../../../common/http_api/latest'; import { ModuleSourceConfiguration } from '../../log_analysis_module_types'; import { useLogAnalysisModule } from '../../log_analysis_module'; import { useLogAnalysisModuleConfiguration } from '../../log_analysis_module_configuration'; @@ -18,12 +19,14 @@ export const useLogEntryRateModule = ({ indexPattern, logViewId, spaceId, + idFormat, timestampField, runtimeMappings, }: { indexPattern: string; logViewId: string; spaceId: string; + idFormat: IdFormat; timestampField: string; runtimeMappings: estypes.MappingRuntimeFields; }) => { @@ -40,6 +43,7 @@ export const useLogEntryRateModule = ({ const logAnalysisModule = useLogAnalysisModule({ moduleDescriptor: logEntryRateModule, + idFormat, sourceConfiguration, }); @@ -50,6 +54,7 @@ export const useLogEntryRateModule = ({ const { fetchModuleDefinition, getIsJobDefinitionOutdated } = useLogAnalysisModuleDefinition({ sourceConfiguration, + idFormat, moduleDescriptor: logEntryRateModule, }); diff --git a/x-pack/plugins/infra/public/containers/ml/api/ml_get_module.ts b/x-pack/plugins/infra/public/containers/ml/api/ml_get_module.ts index afb1ee211a75a..1cd85d448e7be 100644 --- a/x-pack/plugins/infra/public/containers/ml/api/ml_get_module.ts +++ b/x-pack/plugins/infra/public/containers/ml/api/ml_get_module.ts @@ -8,7 +8,7 @@ import * as rt from 'io-ts'; import type { HttpHandler } from '@kbn/core/public'; -import { jobCustomSettingsRT } from '../../../../common/log_analysis'; +import { jobCustomSettingsRT } from '../../../../common/infra_ml'; import { decodeOrThrow } from '../../../../common/runtime_types'; export const callGetMlModuleAPI = async (moduleId: string, fetch: HttpHandler) => { diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_definition.tsx b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_definition.tsx index 88b7cfd941092..1dca20d586a50 100644 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_definition.tsx +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_definition.tsx @@ -6,7 +6,7 @@ */ import { useCallback, useMemo, useState } from 'react'; -import { getJobId } from '../../../common/log_analysis'; +import { getJobId } from '../../../common/infra_ml'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import { useTrackedPromise } from '../../utils/use_tracked_promise'; import { JobSummary } from './api/ml_get_jobs_summary_api'; diff --git a/x-pack/plugins/infra/public/containers/plugin_config_context.test.tsx b/x-pack/plugins/infra/public/containers/plugin_config_context.test.tsx index 43d4e89135646..1b9980bf5f173 100644 --- a/x-pack/plugins/infra/public/containers/plugin_config_context.test.tsx +++ b/x-pack/plugins/infra/public/containers/plugin_config_context.test.tsx @@ -28,6 +28,7 @@ describe('usePluginConfig()', () => { metricThresholdAlertRuleEnabled: true, logThresholdAlertRuleEnabled: true, alertsAndRulesDropdownEnabled: true, + profilingEnabled: false, }, }; const { result } = renderHook(() => usePluginConfig(), { diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx index 34634b194cb85..f5b1e89c69e0b 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx @@ -11,6 +11,7 @@ import { useLogsBreadcrumbs } from '../../../hooks/use_logs_breadcrumbs'; import { LogEntryCategoriesPageContent } from './page_content'; import { LogEntryCategoriesPageProviders } from './page_providers'; import { logCategoriesTitle } from '../../../translations'; +import { LogMlJobIdFormatsShimProvider } from '../shared/use_log_ml_job_id_formats_shim'; export const LogEntryCategoriesPage = () => { useLogsBreadcrumbs([ @@ -21,9 +22,11 @@ export const LogEntryCategoriesPage = () => { return ( - - - + + + + + ); }; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx index d6a1e9f2ddc5e..c58ffc5f36e84 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import React, { useCallback, useEffect } from 'react'; import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; -import { isJobStatusWithResults } from '../../../../common/log_analysis'; +import { isJobStatusWithResults, logEntryCategoriesJobType } from '../../../../common/log_analysis'; import { LoadingPage } from '../../../components/loading_page'; import { LogAnalysisSetupStatusUnknownPrompt, @@ -26,6 +26,7 @@ import { useLogEntryCategoriesModuleContext } from '../../../containers/logs/log import { LogsPageTemplate } from '../shared/page_template'; import { LogEntryCategoriesResultsContent } from './page_results_content'; import { LogEntryCategoriesSetupContent } from './page_setup_content'; +import { useLogMlJobIdFormatsShimContext } from '../shared/use_log_ml_job_id_formats_shim'; const logCategoriesTitle = i18n.translate('xpack.infra.logs.logCategoriesTitle', { defaultMessage: 'Categories', @@ -52,6 +53,8 @@ export const LogEntryCategoriesPageContent = () => { } }, [fetchJobStatus, hasLogAnalysisReadCapabilities]); + const { idFormats } = useLogMlJobIdFormatsShimContext(); + if (!hasLogAnalysisCapabilites) { return ( { ); - } else if (isJobStatusWithResults(jobStatus['log-entry-categories-count'])) { + } else if (isJobStatusWithResults(jobStatus[logEntryCategoriesJobType])) { return ( <> diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_providers.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_providers.tsx index 5cb6a12166c53..89bcd98d0958f 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_providers.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_providers.tsx @@ -7,12 +7,14 @@ import React from 'react'; import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; +import { logEntryCategoriesJobType } from '../../../../common/log_analysis'; import { InlineLogViewSplashPage } from '../../../components/logging/inline_log_view_splash_page'; import { LogAnalysisSetupFlyoutStateProvider } from '../../../components/logging/log_analysis_setup/setup_flyout'; import { SourceLoadingPage } from '../../../components/source_loading_page'; import { LogEntryCategoriesModuleProvider } from '../../../containers/logs/log_analysis/modules/log_entry_categories'; import { useActiveKibanaSpace } from '../../../hooks/use_kibana_space'; import { ConnectedLogViewErrorPage } from '../shared/page_log_view_error'; +import { useLogMlJobIdFormatsShimContext } from '../shared/use_log_ml_job_id_formats_shim'; export const LogEntryCategoriesPageProviders: React.FunctionComponent = ({ children }) => { const { @@ -25,6 +27,8 @@ export const LogEntryCategoriesPageProviders: React.FunctionComponent = ({ child revertToDefaultLogView, } = useLogViewContext(); const { space } = useActiveKibanaSpace(); + const { idFormats, isLoadingLogAnalysisIdFormats, hasFailedLoadingLogAnalysisIdFormats } = + useLogMlJobIdFormatsShimContext(); // This is a rather crude way of guarding the dependent providers against // arguments that are only made available asynchronously. Ideally, we'd use @@ -33,9 +37,9 @@ export const LogEntryCategoriesPageProviders: React.FunctionComponent = ({ child return null; } else if (!isPersistedLogView) { return ; - } else if (hasFailedLoading) { + } else if (hasFailedLoading || hasFailedLoadingLogAnalysisIdFormats) { return ; - } else if (isLoading || isUninitialized) { + } else if (isLoading || isUninitialized || isLoadingLogAnalysisIdFormats || !idFormats) { return ; } else if (resolvedLogView != null) { if (logViewReference.type === 'log-view-inline') { @@ -46,6 +50,7 @@ export const LogEntryCategoriesPageProviders: React.FunctionComponent = ({ child indexPattern={resolvedLogView.indices} logViewId={logViewReference.logViewId} spaceId={space.id} + idFormat={idFormats[logEntryCategoriesJobType]} timestampField={resolvedLogView.timestampField} runtimeMappings={resolvedLogView.runtimeMappings} > diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx index e1e317136deed..e1db34f31a5e0 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx @@ -16,6 +16,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { MLJobsAwaitingNodeWarning, ML_PAGES, useMlHref } from '@kbn/ml-plugin/public'; import { useTrackPageview } from '@kbn/observability-shared-plugin/public'; import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; +import { logEntryCategoriesJobType } from '../../../../common/log_analysis'; import { TimeRange } from '../../../../common/time/time_range'; import { CategoryJobNoticesSection } from '../../../components/logging/log_analysis_job_status'; import { AnalyzeInMlButton } from '../../../components/logging/log_analysis_results'; @@ -33,17 +34,19 @@ import { StringTimeRange, useLogEntryCategoriesResultsUrlState, } from './use_log_entry_categories_results_url_state'; +import { IdFormat } from '../../../../common/http_api/latest'; const JOB_STATUS_POLLING_INTERVAL = 30000; interface LogEntryCategoriesResultsContentProps { onOpenSetup: () => void; pageTitle: string; + idFormat: IdFormat; } export const LogEntryCategoriesResultsContent: React.FunctionComponent< LogEntryCategoriesResultsContentProps -> = ({ onOpenSetup, pageTitle }) => { +> = ({ onOpenSetup, pageTitle, idFormat }) => { useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_results' }); useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_results', delay: 15000 }); @@ -110,6 +113,7 @@ export const LogEntryCategoriesResultsContent: React.FunctionComponent< filteredDatasets: categoryQueryDatasets, onGetTopLogEntryCategoriesError: showLoadDataErrorNotification, logViewReference: { type: 'log-view-reference', logViewId }, + idFormat, startTime: categoryQueryTimeRange.timeRange.startTime, }); @@ -195,7 +199,7 @@ export const LogEntryCategoriesResultsContent: React.FunctionComponent< const analyzeInMlLink = useMlHref(ml, http.basePath.get(), { page: ML_PAGES.ANOMALY_EXPLORER, pageState: { - jobIds: [jobIds['log-entry-categories-count']], + jobIds: [jobIds[logEntryCategoriesJobType]], timeRange: { from: moment(categoryQueryTimeRange.timeRange.startTime).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), to: moment(categoryQueryTimeRange.timeRange.endTime).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), @@ -264,7 +268,7 @@ export const LogEntryCategoriesResultsContent: React.FunctionComponent< = ({ categoryId, timeRange, logViewReference }) => { + const { idFormats } = useLogMlJobIdFormatsShimContext(); + const { getLogEntryCategoryExamples, hasFailedLoadingLogEntryCategoryExamples, @@ -29,6 +33,7 @@ export const CategoryDetailsRow: React.FunctionComponent<{ endTime: timeRange.endTime, exampleCount, logViewReference, + idFormat: idFormats?.[logEntryCategoriesJobType], startTime: timeRange.startTime, }); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_datasets.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_datasets.ts index 14e7ebfbebd35..4a194eb1fb076 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_datasets.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_datasets.ts @@ -7,6 +7,7 @@ import type { HttpHandler } from '@kbn/core/public'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../../../common/http_api/latest'; import { getLogEntryCategoryDatasetsRequestPayloadRT, @@ -17,6 +18,7 @@ import { decodeOrThrow } from '../../../../../common/runtime_types'; interface RequestArgs { logViewReference: PersistedLogViewReference; + idFormat: IdFormat; startTime: number; endTime: number; } @@ -25,7 +27,7 @@ export const callGetLogEntryCategoryDatasetsAPI = async ( requestArgs: RequestArgs, fetch: HttpHandler ) => { - const { logViewReference, startTime, endTime } = requestArgs; + const { logViewReference, idFormat, startTime, endTime } = requestArgs; const response = await fetch(LOG_ANALYSIS_GET_LOG_ENTRY_CATEGORY_DATASETS_PATH, { method: 'POST', @@ -33,6 +35,7 @@ export const callGetLogEntryCategoryDatasetsAPI = async ( getLogEntryCategoryDatasetsRequestPayloadRT.encode({ data: { logView: logViewReference, + idFormat, timeRange: { startTime, endTime, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_examples.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_examples.ts index 3e4947ca1e84f..dece712414ce6 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_examples.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_log_entry_category_examples.ts @@ -7,6 +7,7 @@ import type { HttpHandler } from '@kbn/core/public'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../../../common/http_api/latest'; import { getLogEntryCategoryExamplesRequestPayloadRT, @@ -17,6 +18,7 @@ import { decodeOrThrow } from '../../../../../common/runtime_types'; interface RequestArgs { logViewReference: PersistedLogViewReference; + idFormat: IdFormat; startTime: number; endTime: number; categoryId: number; @@ -27,7 +29,7 @@ export const callGetLogEntryCategoryExamplesAPI = async ( requestArgs: RequestArgs, fetch: HttpHandler ) => { - const { logViewReference, startTime, endTime, categoryId, exampleCount } = requestArgs; + const { logViewReference, idFormat, startTime, endTime, categoryId, exampleCount } = requestArgs; const response = await fetch(LOG_ANALYSIS_GET_LOG_ENTRY_CATEGORY_EXAMPLES_PATH, { method: 'POST', @@ -37,6 +39,7 @@ export const callGetLogEntryCategoryExamplesAPI = async ( categoryId, exampleCount, logView: logViewReference, + idFormat, timeRange: { startTime, endTime, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_top_log_entry_categories.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_top_log_entry_categories.ts index c4a1b6d095a29..2b2808bf46464 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_top_log_entry_categories.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/service_calls/get_top_log_entry_categories.ts @@ -7,6 +7,7 @@ import type { HttpHandler } from '@kbn/core/public'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../../../common/http_api/latest'; import { getLogEntryCategoriesRequestPayloadRT, @@ -18,6 +19,7 @@ import { decodeOrThrow } from '../../../../../common/runtime_types'; interface RequestArgs { logViewReference: PersistedLogViewReference; + idFormat: IdFormat; startTime: number; endTime: number; categoryCount: number; @@ -29,7 +31,8 @@ export const callGetTopLogEntryCategoriesAPI = async ( requestArgs: RequestArgs, fetch: HttpHandler ) => { - const { logViewReference, startTime, endTime, categoryCount, datasets, sort } = requestArgs; + const { logViewReference, idFormat, startTime, endTime, categoryCount, datasets, sort } = + requestArgs; const intervalDuration = endTime - startTime; const response = await fetch(LOG_ANALYSIS_GET_LOG_ENTRY_CATEGORIES_PATH, { @@ -38,6 +41,7 @@ export const callGetTopLogEntryCategoriesAPI = async ( getLogEntryCategoriesRequestPayloadRT.encode({ data: { logView: logViewReference, + idFormat, timeRange: { startTime, endTime, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts index 20f7adb106857..030c0298d011e 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts @@ -8,6 +8,7 @@ import { useMemo, useState } from 'react'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../../common/http_api/latest'; import { GetLogEntryCategoriesSuccessResponsePayload, GetLogEntryCategoryDatasetsSuccessResponsePayload, @@ -32,6 +33,7 @@ export const useLogEntryCategoriesResults = ({ onGetLogEntryCategoryDatasetsError, onGetTopLogEntryCategoriesError, logViewReference, + idFormat, startTime, }: { categoriesCount: number; @@ -40,6 +42,7 @@ export const useLogEntryCategoriesResults = ({ onGetLogEntryCategoryDatasetsError?: (error: Error) => void; onGetTopLogEntryCategoriesError?: (error: Error) => void; logViewReference: PersistedLogViewReference; + idFormat: IdFormat; startTime: number; }) => { const [sortOptions, setSortOptions] = useState({ @@ -58,6 +61,7 @@ export const useLogEntryCategoriesResults = ({ return await callGetTopLogEntryCategoriesAPI( { logViewReference, + idFormat, startTime, endTime, categoryCount: categoriesCount, @@ -80,7 +84,15 @@ export const useLogEntryCategoriesResults = ({ } }, }, - [categoriesCount, endTime, filteredDatasets, logViewReference.logViewId, startTime, sortOptions] + [ + categoriesCount, + endTime, + filteredDatasets, + logViewReference.logViewId, + startTime, + sortOptions, + idFormat, + ] ); const [getLogEntryCategoryDatasetsRequest, getLogEntryCategoryDatasets] = useTrackedPromise( @@ -88,7 +100,7 @@ export const useLogEntryCategoriesResults = ({ cancelPreviousOn: 'creation', createPromise: async () => { return await callGetLogEntryCategoryDatasetsAPI( - { logViewReference, startTime, endTime }, + { logViewReference, idFormat, startTime, endTime }, services.http.fetch ); }, @@ -105,7 +117,7 @@ export const useLogEntryCategoriesResults = ({ } }, }, - [categoriesCount, endTime, logViewReference.logViewId, startTime] + [categoriesCount, endTime, logViewReference.logViewId, idFormat, startTime] ); const isLoadingTopLogEntryCategories = useMemo( diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx index c5516fdbc02f9..e50664b957d74 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx @@ -8,6 +8,7 @@ import { useMemo, useState } from 'react'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../../common/http_api/latest'; import { LogEntryCategoryExample } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; @@ -18,12 +19,14 @@ export const useLogEntryCategoryExamples = ({ endTime, exampleCount, logViewReference, + idFormat, startTime, }: { categoryId: number; endTime: number; exampleCount: number; logViewReference: PersistedLogViewReference; + idFormat?: IdFormat; startTime: number; }) => { const { services } = useKibanaContextForPlugin(); @@ -36,9 +39,14 @@ export const useLogEntryCategoryExamples = ({ { cancelPreviousOn: 'creation', createPromise: async () => { + if (!idFormat) { + throw new Error('idFormat is undefined'); + } + return await callGetLogEntryCategoryExamplesAPI( { logViewReference, + idFormat, startTime, endTime, categoryId, @@ -51,7 +59,7 @@ export const useLogEntryCategoryExamples = ({ setLogEntryCategoryExamples(examples); }, }, - [categoryId, endTime, exampleCount, logViewReference, startTime] + [categoryId, endTime, exampleCount, logViewReference, startTime, idFormat] ); const isLoadingLogEntryCategoryExamples = useMemo( diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx index 94950b24b1a94..50a4852c458c4 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx @@ -11,6 +11,7 @@ import { LogEntryRatePageContent } from './page_content'; import { LogEntryRatePageProviders } from './page_providers'; import { useLogsBreadcrumbs } from '../../../hooks/use_logs_breadcrumbs'; import { anomaliesTitle } from '../../../translations'; +import { LogMlJobIdFormatsShimProvider } from '../shared/use_log_ml_job_id_formats_shim'; export const LogEntryRatePage = () => { useLogsBreadcrumbs([ @@ -20,9 +21,11 @@ export const LogEntryRatePage = () => { ]); return ( - - - + + + + + ); }; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx index 533381dcbf7c3..e4dc0694c3f75 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx @@ -10,7 +10,11 @@ import React, { memo, useCallback, useEffect } from 'react'; import useInterval from 'react-use/lib/useInterval'; import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; -import { isJobStatusWithResults } from '../../../../common/log_analysis'; +import { + isJobStatusWithResults, + logEntryCategoriesJobType, + logEntryRateJobType, +} from '../../../../common/log_analysis'; import { LoadingPage } from '../../../components/loading_page'; import { LogAnalysisSetupStatusUnknownPrompt, @@ -28,6 +32,7 @@ import { useLogEntryRateModuleContext } from '../../../containers/logs/log_analy import { LogsPageTemplate } from '../shared/page_template'; import { LogEntryRateResultsContent } from './page_results_content'; import { LogEntryRateSetupContent } from './page_setup_content'; +import { useLogMlJobIdFormatsShimContext } from '../shared/use_log_ml_job_id_formats_shim'; const JOB_STATUS_POLLING_INTERVAL = 30000; @@ -89,6 +94,8 @@ export const LogEntryRatePageContent = memo(() => { } }, JOB_STATUS_POLLING_INTERVAL); + const { idFormats } = useLogMlJobIdFormatsShimContext(); + if (!hasLogAnalysisCapabilites) { return ( { ); } else if ( - isJobStatusWithResults(logEntryCategoriesJobStatus['log-entry-categories-count']) || - isJobStatusWithResults(logEntryRateJobStatus['log-entry-rate']) + isJobStatusWithResults(logEntryCategoriesJobStatus[logEntryCategoriesJobType]) || + isJobStatusWithResults(logEntryRateJobStatus[logEntryRateJobType]) ) { return ( <> - + ); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_providers.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_providers.tsx index 46ce90cff63cc..273874f83ae3e 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_providers.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_providers.tsx @@ -7,6 +7,7 @@ import React from 'react'; import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; +import { logEntryCategoriesJobType, logEntryRateJobType } from '../../../../common/log_analysis'; import { InlineLogViewSplashPage } from '../../../components/logging/inline_log_view_splash_page'; import { LogAnalysisSetupFlyoutStateProvider } from '../../../components/logging/log_analysis_setup/setup_flyout'; import { SourceLoadingPage } from '../../../components/source_loading_page'; @@ -15,6 +16,7 @@ import { LogEntryRateModuleProvider } from '../../../containers/logs/log_analysi import { LogEntryFlyoutProvider } from '../../../containers/logs/log_flyout'; import { useActiveKibanaSpace } from '../../../hooks/use_kibana_space'; import { ConnectedLogViewErrorPage } from '../shared/page_log_view_error'; +import { useLogMlJobIdFormatsShimContext } from '../shared/use_log_ml_job_id_formats_shim'; export const LogEntryRatePageProviders: React.FunctionComponent = ({ children }) => { const { @@ -29,6 +31,9 @@ export const LogEntryRatePageProviders: React.FunctionComponent = ({ children }) const { space } = useActiveKibanaSpace(); + const { idFormats, isLoadingLogAnalysisIdFormats, hasFailedLoadingLogAnalysisIdFormats } = + useLogMlJobIdFormatsShimContext(); + // This is a rather crude way of guarding the dependent providers against // arguments that are only made available asynchronously. Ideally, we'd use // React concurrent mode and Suspense in order to handle that more gracefully. @@ -36,9 +41,9 @@ export const LogEntryRatePageProviders: React.FunctionComponent = ({ children }) return null; } else if (!isPersistedLogView) { return ; - } else if (isLoading || isUninitialized) { + } else if (isLoading || isUninitialized || isLoadingLogAnalysisIdFormats || !idFormats) { return ; - } else if (hasFailedLoading) { + } else if (hasFailedLoading || hasFailedLoadingLogAnalysisIdFormats) { return ; } else if (resolvedLogView != null) { if (logViewReference.type === 'log-view-inline') { @@ -50,6 +55,7 @@ export const LogEntryRatePageProviders: React.FunctionComponent = ({ children }) indexPattern={resolvedLogView.indices} logViewId={logViewReference.logViewId} spaceId={space.id} + idFormat={idFormats[logEntryRateJobType]} timestampField={resolvedLogView.timestampField} runtimeMappings={resolvedLogView.runtimeMappings} > @@ -57,6 +63,7 @@ export const LogEntryRatePageProviders: React.FunctionComponent = ({ children }) indexPattern={resolvedLogView.indices} logViewId={logViewReference.logViewId} spaceId={space.id} + idFormat={idFormats[logEntryCategoriesJobType]} timestampField={resolvedLogView.timestampField} runtimeMappings={resolvedLogView.runtimeMappings} > diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx index a4d861e38ade1..21eb5aacb2cec 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx @@ -15,7 +15,12 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { MLJobsAwaitingNodeWarning } from '@kbn/ml-plugin/public'; import { useTrackPageview } from '@kbn/observability-shared-plugin/public'; import { useLogViewContext, LogEntryFlyout } from '@kbn/logs-shared-plugin/public'; -import { isJobStatusWithResults } from '../../../../common/log_analysis'; +import { IdFormatByJobType } from '../../../../common/http_api/latest'; +import { + isJobStatusWithResults, + logEntryCategoriesJobType, + logEntryRateJobType, +} from '../../../../common/log_analysis'; import { TimeKey } from '../../../../common/time'; import { CategoryJobNoticesSection, @@ -45,7 +50,8 @@ export const PAGINATION_DEFAULTS = { export const LogEntryRateResultsContent: React.FunctionComponent<{ pageTitle: string; -}> = ({ pageTitle }) => { + idFormats: IdFormatByJobType | null; +}> = ({ pageTitle, idFormats }) => { useTrackPageview({ app: 'infra_logs', path: 'log_entry_rate_results' }); useTrackPageview({ app: 'infra_logs', path: 'log_entry_rate_results', delay: 15000 }); @@ -82,11 +88,11 @@ export const LogEntryRateResultsContent: React.FunctionComponent<{ const jobIds = useMemo(() => { return [ - ...(isJobStatusWithResults(logEntryRateJobStatus['log-entry-rate']) - ? [logEntryRateJobIds['log-entry-rate']] + ...(isJobStatusWithResults(logEntryRateJobStatus[logEntryRateJobType]) + ? [logEntryRateJobIds[logEntryRateJobType]] : []), - ...(isJobStatusWithResults(logEntryCategoriesJobStatus['log-entry-categories-count']) - ? [logEntryCategoriesJobIds['log-entry-categories-count']] + ...(isJobStatusWithResults(logEntryCategoriesJobStatus[logEntryCategoriesJobType]) + ? [logEntryCategoriesJobIds[logEntryCategoriesJobType]] : []), ]; }, [ @@ -146,6 +152,7 @@ export const LogEntryRateResultsContent: React.FunctionComponent<{ isLoadingDatasets, } = useLogEntryAnomaliesResults({ logViewReference, + idFormats, startTime: timeRange.value.startTime, endTime: timeRange.value.endTime, defaultSortOptions: SORT_DEFAULTS, @@ -199,6 +206,7 @@ export const LogEntryRateResultsContent: React.FunctionComponent<{ return ( = ({ anomaly, timeRange }) => { const { logViewReference } = useLogViewContext(); + const { idFormats } = useLogMlJobIdFormatsShimContext(); if (logViewReference.type === 'log-view-inline') { throw new Error('Logs ML features only support persisted Log Views'); @@ -44,6 +50,7 @@ export const AnomaliesTableExpandedRow: React.FunctionComponent<{ endTime: anomaly.startTime + anomaly.duration, exampleCount: EXAMPLE_COUNT, logViewReference, + idFormat: idFormats?.[logEntryRateJobType], startTime: anomaly.startTime, categoryId: isCategoryAnomaly(anomaly) ? anomaly.categoryId : undefined, }); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies.ts index b6a515ae6f134..5f6ad4deda08a 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies.ts @@ -7,6 +7,7 @@ import type { HttpHandler } from '@kbn/core/public'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormatByJobType } from '../../../../../common/http_api/latest'; import { getLogEntryAnomaliesRequestPayloadRT, getLogEntryAnomaliesSuccessReponsePayloadRT, @@ -17,6 +18,7 @@ import { AnomaliesSort, Pagination } from '../../../../../common/log_analysis'; interface RequestArgs { logViewReference: PersistedLogViewReference; + idFormats: IdFormatByJobType; startTime: number; endTime: number; sort: AnomaliesSort; @@ -25,13 +27,15 @@ interface RequestArgs { } export const callGetLogEntryAnomaliesAPI = async (requestArgs: RequestArgs, fetch: HttpHandler) => { - const { logViewReference, startTime, endTime, sort, pagination, datasets } = requestArgs; + const { logViewReference, idFormats, startTime, endTime, sort, pagination, datasets } = + requestArgs; const response = await fetch(LOG_ANALYSIS_GET_LOG_ENTRY_ANOMALIES_PATH, { method: 'POST', body: JSON.stringify( getLogEntryAnomaliesRequestPayloadRT.encode({ data: { logView: logViewReference, + idFormats, timeRange: { startTime, endTime, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies_datasets.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies_datasets.ts index a93712c5d5a86..38ed7144140a6 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies_datasets.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_anomalies_datasets.ts @@ -7,6 +7,7 @@ import type { HttpHandler } from '@kbn/core/public'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormatByJobType } from '../../../../../common/http_api/latest'; import { decodeOrThrow } from '../../../../../common/runtime_types'; import { getLogEntryAnomaliesDatasetsRequestPayloadRT, @@ -16,6 +17,7 @@ import { interface RequestArgs { logViewReference: PersistedLogViewReference; + idFormats: IdFormatByJobType; startTime: number; endTime: number; } @@ -24,13 +26,14 @@ export const callGetLogEntryAnomaliesDatasetsAPI = async ( requestArgs: RequestArgs, fetch: HttpHandler ) => { - const { logViewReference, startTime, endTime } = requestArgs; + const { logViewReference, idFormats, startTime, endTime } = requestArgs; const response = await fetch(LOG_ANALYSIS_GET_LOG_ENTRY_ANOMALIES_DATASETS_PATH, { method: 'POST', body: JSON.stringify( getLogEntryAnomaliesDatasetsRequestPayloadRT.encode({ data: { logView: logViewReference, + idFormats, timeRange: { startTime, endTime, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_examples.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_examples.ts index 6cf35b95868e1..a4abfbd15ba5c 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_examples.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/service_calls/get_log_entry_examples.ts @@ -7,6 +7,7 @@ import type { HttpHandler } from '@kbn/core/public'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../../../common/http_api/latest'; import { getLogEntryExamplesRequestPayloadRT, @@ -17,6 +18,7 @@ import { decodeOrThrow } from '../../../../../common/runtime_types'; interface RequestArgs { logViewReference: PersistedLogViewReference; + idFormat: IdFormat; startTime: number; endTime: number; dataset: string; @@ -25,7 +27,8 @@ interface RequestArgs { } export const callGetLogEntryExamplesAPI = async (requestArgs: RequestArgs, fetch: HttpHandler) => { - const { logViewReference, startTime, endTime, dataset, exampleCount, categoryId } = requestArgs; + const { logViewReference, idFormat, startTime, endTime, dataset, exampleCount, categoryId } = + requestArgs; const response = await fetch(LOG_ANALYSIS_GET_LOG_ENTRY_RATE_EXAMPLES_PATH, { method: 'POST', body: JSON.stringify( @@ -34,6 +37,7 @@ export const callGetLogEntryExamplesAPI = async (requestArgs: RequestArgs, fetch dataset, exampleCount, logView: logViewReference, + idFormat, timeRange: { startTime, endTime, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts index 745b5a7cd5aec..598f57751dae6 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts @@ -8,6 +8,7 @@ import { useMemo, useState, useCallback, useEffect, useReducer } from 'react'; import useMount from 'react-use/lib/useMount'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormatByJobType } from '../../../../common/http_api/latest'; import { useTrackedPromise, CanceledPromiseError } from '../../../utils/use_tracked_promise'; import { callGetLogEntryAnomaliesAPI } from './service_calls/get_log_entry_anomalies'; import { callGetLogEntryAnomaliesDatasetsAPI } from './service_calls/get_log_entry_anomalies_datasets'; @@ -139,6 +140,7 @@ export const useLogEntryAnomaliesResults = ({ endTime, startTime, logViewReference, + idFormats, defaultSortOptions, defaultPaginationOptions, onGetLogEntryAnomaliesDatasetsError, @@ -147,6 +149,7 @@ export const useLogEntryAnomaliesResults = ({ endTime: number; startTime: number; logViewReference: PersistedLogViewReference; + idFormats: IdFormatByJobType | null; defaultSortOptions: AnomaliesSort; defaultPaginationOptions: Pick; onGetLogEntryAnomaliesDatasetsError?: (error: Error) => void; @@ -175,6 +178,10 @@ export const useLogEntryAnomaliesResults = ({ { cancelPreviousOn: 'creation', createPromise: async () => { + if (!idFormats) { + throw new Error('idFormats is undefined'); + } + const { timeRange: { start: queryStartTime, end: queryEndTime }, sortOptions, @@ -185,6 +192,7 @@ export const useLogEntryAnomaliesResults = ({ return await callGetLogEntryAnomaliesAPI( { logViewReference, + idFormats, startTime: queryStartTime, endTime: queryEndTime, sort: sortOptions, @@ -218,6 +226,7 @@ export const useLogEntryAnomaliesResults = ({ }, [ logViewReference, + idFormats, dispatch, reducerState.timeRange, reducerState.sortOptions, @@ -294,8 +303,12 @@ export const useLogEntryAnomaliesResults = ({ { cancelPreviousOn: 'creation', createPromise: async () => { + if (!idFormats) { + throw new Error('idFormats is undefined'); + } + return await callGetLogEntryAnomaliesDatasetsAPI( - { logViewReference, startTime, endTime }, + { logViewReference, idFormats, startTime, endTime }, services.http.fetch ); }, @@ -312,7 +325,7 @@ export const useLogEntryAnomaliesResults = ({ } }, }, - [endTime, logViewReference, startTime] + [endTime, logViewReference, idFormats, startTime] ); const isLoadingDatasets = useMemo( diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts index 4301f08ab41da..58e7b15842a17 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts @@ -8,6 +8,7 @@ import { useMemo, useState } from 'react'; import { PersistedLogViewReference } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../../common/http_api/latest'; import { LogEntryExample } from '../../../../common/log_analysis'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; @@ -18,6 +19,7 @@ export const useLogEntryExamples = ({ endTime, exampleCount, logViewReference, + idFormat, startTime, categoryId, }: { @@ -25,6 +27,7 @@ export const useLogEntryExamples = ({ endTime: number; exampleCount: number; logViewReference: PersistedLogViewReference; + idFormat?: IdFormat; startTime: number; categoryId?: string; }) => { @@ -35,9 +38,14 @@ export const useLogEntryExamples = ({ { cancelPreviousOn: 'creation', createPromise: async () => { + if (!idFormat) { + throw new Error('idFormat is undefined'); + } + return await callGetLogEntryExamplesAPI( { logViewReference, + idFormat, startTime, endTime, dataset, @@ -51,7 +59,7 @@ export const useLogEntryExamples = ({ setLogEntryExamples(examples); }, }, - [dataset, endTime, exampleCount, logViewReference, startTime] + [dataset, endTime, exampleCount, logViewReference, startTime, idFormat] ); const isLoadingLogEntryExamples = useMemo( diff --git a/x-pack/plugins/infra/public/pages/logs/shared/call_get_log_analysis_id_formats.ts b/x-pack/plugins/infra/public/pages/logs/shared/call_get_log_analysis_id_formats.ts new file mode 100644 index 0000000000000..7099e9fe9a762 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/shared/call_get_log_analysis_id_formats.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpHandler } from '@kbn/core/public'; +import { decodeOrThrow } from '../../../../common/runtime_types'; +import { + getLogAnalysisIdFormatsRequestPayloadRT, + getLogAnalysisIdFormatsSuccessResponsePayloadRT, + LOG_ANALYSIS_GET_ID_FORMATS, +} from '../../../../common/http_api/latest'; + +interface RequestArgs { + spaceId: string; + logViewId: string; +} + +export const callGetLogAnalysisIdFormats = async (requestArgs: RequestArgs, fetch: HttpHandler) => { + const { logViewId, spaceId } = requestArgs; + const response = await fetch(LOG_ANALYSIS_GET_ID_FORMATS, { + method: 'POST', + body: JSON.stringify( + getLogAnalysisIdFormatsRequestPayloadRT.encode({ + data: { + logViewId, + spaceId, + }, + }) + ), + version: '1', + }); + + return decodeOrThrow(getLogAnalysisIdFormatsSuccessResponsePayloadRT)(response); +}; diff --git a/x-pack/plugins/infra/public/pages/logs/shared/use_log_ml_job_id_formats_shim.tsx b/x-pack/plugins/infra/public/pages/logs/shared/use_log_ml_job_id_formats_shim.tsx new file mode 100644 index 0000000000000..ffa63908b8b57 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/shared/use_log_ml_job_id_formats_shim.tsx @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import createContainer from 'constate'; +import { useState, useEffect, useCallback } from 'react'; +import { useLogViewContext } from '@kbn/logs-shared-plugin/public'; +import { IdFormatByJobType, JobType } from '../../../../common/http_api/latest'; +import { useActiveKibanaSpace } from '../../../hooks/use_kibana_space'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; + +import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; +import { callGetLogAnalysisIdFormats } from './call_get_log_analysis_id_formats'; + +const useLogMlJobIdFormatsShim = () => { + const [idFormats, setIdFormats] = useState(null); + + const { logViewReference } = useLogViewContext(); + const { space } = useActiveKibanaSpace(); + const { services } = useKibanaContextForPlugin(); + + const [getLogAnalysisIdFormatsRequest, getLogAnalysisIdFormats] = useTrackedPromise( + { + cancelPreviousOn: 'creation', + createPromise: async () => { + if (!space) { + return { data: null }; + } + + if (logViewReference.type === 'log-view-inline') { + throw new Error('Logs ML features only support persisted Log Views'); + } + + return await callGetLogAnalysisIdFormats( + { + logViewId: logViewReference.logViewId, + spaceId: space.id, + }, + services.http.fetch + ); + }, + onResolve: ({ data }) => { + setIdFormats(data); + }, + }, + [logViewReference, space] + ); + + useEffect(() => { + getLogAnalysisIdFormats(); + }, [getLogAnalysisIdFormats]); + + const isLoadingLogAnalysisIdFormats = getLogAnalysisIdFormatsRequest.state === 'pending'; + const hasFailedLoadingLogAnalysisIdFormats = getLogAnalysisIdFormatsRequest.state === 'rejected'; + + const migrateIdFormat = useCallback((jobType: JobType) => { + setIdFormats((previousValue) => { + if (!previousValue) { + return null; + } + + return { + ...previousValue, + [jobType]: 'hashed', + }; + }); + }, []); + + return { + idFormats, + migrateIdFormat, + isLoadingLogAnalysisIdFormats, + hasFailedLoadingLogAnalysisIdFormats, + }; +}; + +export const [LogMlJobIdFormatsShimProvider, useLogMlJobIdFormatsShimContext] = + createContainer(useLogMlJobIdFormatsShim); diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/host_count_kpi.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/host_count_kpi.tsx index 22f07d8299063..45e9f5f0b2c83 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/host_count_kpi.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/host_count_kpi.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; import React from 'react'; +import { useTheme } from '@kbn/observability-shared-plugin/public'; import { hostLensFormulas, METRICS_TOOLTIP } from '../../../../../common/visualizations'; import { useHostCountContext } from '../../hooks/use_host_count'; import { useUnifiedSearchContext } from '../../hooks/use_unified_search'; @@ -13,17 +14,18 @@ import { useUnifiedSearchContext } from '../../hooks/use_unified_search'; import { type Props, MetricChartWrapper } from '../chart/metric_chart_wrapper'; import { TooltipContent } from '../../../../../components/lens'; -const HOSTS_CHART: Omit = { - id: 'hostsViewKPI-hostsCount', - color: '#6DCCB1', - title: i18n.translate('xpack.infra.hostsViewPage.kpi.hostCount.title', { - defaultMessage: 'Hosts', - }), -}; - export const HostCountKpi = ({ height }: { height: number }) => { const { data: hostCountData, isRequestRunning: hostCountLoading } = useHostCountContext(); const { searchCriteria } = useUnifiedSearchContext(); + const euiTheme = useTheme(); + + const hostsCountChart: Omit = { + id: 'hostsViewKPI-hostsCount', + color: euiTheme.eui.euiColorLightestShade, + title: i18n.translate('xpack.infra.hostsViewPage.kpi.hostCount.title', { + defaultMessage: 'Hosts', + }), + }; const getSubtitle = () => { return searchCriteria.limit < (hostCountData?.count.value ?? 0) @@ -38,7 +40,7 @@ export const HostCountKpi = ({ height }: { height: number }) => { return ( { + const euiTheme = useTheme(); + return ( @@ -23,11 +26,13 @@ export const KPIGrid = () => { - {assetDetailsDashboards.host.hostKPICharts.map((chartProp, index) => ( - - - - ))} + {assetDetailsDashboards.host + .hostKPICharts(euiTheme.eui.euiColorLightestShade) + .map((chartProp, index) => ( + + + + ))} ); diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/table/entry_title.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/table/entry_title.tsx index b2fdcc1a1a734..0f6e65ef4c1d2 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/table/entry_title.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/table/entry_title.tsx @@ -5,19 +5,13 @@ * 2.0. */ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, EuiToolTip, IconType } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiToolTip } from '@elastic/eui'; import { useLinkProps } from '@kbn/observability-shared-plugin/public'; +import { CloudProviderIcon } from '@kbn/custom-icons'; import { useNodeDetailsRedirect } from '../../../../link_to'; -import type { CloudProvider, HostNodeRow } from '../../hooks/use_hosts_table'; +import type { HostNodeRow } from '../../hooks/use_hosts_table'; import { useUnifiedSearchContext } from '../../hooks/use_unified_search'; -const cloudIcons: Record = { - gcp: 'logoGCP', - aws: 'logoAWS', - azure: 'logoAzure', - unknownProvider: 'cloudSunny', -}; - interface EntryTitleProps { onClick: () => void; title: HostNodeRow['title']; @@ -40,7 +34,6 @@ export const EntryTitle = ({ onClick, title }: EntryTitleProps) => { }), }); - const iconType = (cloudProvider && cloudIcons[cloudProvider]) || cloudIcons.unknownProvider; const providerName = cloudProvider ?? 'Unknown'; return ( @@ -52,7 +45,7 @@ export const EntryTitle = ({ onClick, title }: EntryTitleProps) => { > - + diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx index 290062a2f1d48..c1c4093d96e46 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx @@ -15,6 +15,7 @@ import { import createContainer from 'constate'; import { isEqual } from 'lodash'; import { isNumber } from 'lodash/fp'; +import { CloudProvider } from '@kbn/custom-icons'; import { hostLensFormulas } from '../../../../common/visualizations'; import { useKibanaContextForPlugin } from '../../../../hooks/use_kibana'; import { createInventoryMetricFormatter } from '../../inventory_view/lib/create_inventory_metric_formatter'; @@ -35,7 +36,6 @@ import { buildCombinedHostsFilter } from '../../../../utils/filters/build'; /** * Columns and items types */ -export type CloudProvider = 'gcp' | 'aws' | 'azure' | 'unknownProvider'; type HostMetrics = Record; interface HostMetadata { diff --git a/x-pack/plugins/infra/server/infra_server.ts b/x-pack/plugins/infra/server/infra_server.ts index 6ab8781bdfc4e..b041f495057af 100644 --- a/x-pack/plugins/infra/server/infra_server.ts +++ b/x-pack/plugins/infra/server/infra_server.ts @@ -21,6 +21,7 @@ import { initGetLogEntryExamplesRoute, initValidateLogAnalysisDatasetsRoute, initValidateLogAnalysisIndicesRoute, + initGetLogAnalysisIdFormatsRoute, } from './routes/log_analysis'; import { initMetadataRoute } from './routes/metadata'; import { initMetricsAPIRoute } from './routes/metrics_api'; @@ -31,6 +32,7 @@ import { initProcessListRoute } from './routes/process_list'; import { initSnapshotRoute } from './routes/snapshot'; import { initInfraMetricsRoute } from './routes/infra'; import { initMetricsExplorerViewRoutes } from './routes/metrics_explorer_views'; +import { initProfilingRoutes } from './routes/profiling'; export const initInfraServer = (libs: InfraBackendLibs) => { initIpToHostName(libs); @@ -45,6 +47,7 @@ export const initInfraServer = (libs: InfraBackendLibs) => { initSnapshotRoute(libs); initNodeDetailsRoute(libs); initMetricsSourceConfigurationRoutes(libs); + initGetLogAnalysisIdFormatsRoute(libs); initValidateLogAnalysisDatasetsRoute(libs); initValidateLogAnalysisIndicesRoute(libs); initGetLogEntryExamplesRoute(libs); @@ -57,4 +60,5 @@ export const initInfraServer = (libs: InfraBackendLibs) => { initProcessListRoute(libs); initOverviewRoute(libs); initInfraMetricsRoute(libs); + initProfilingRoutes(libs); }; diff --git a/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts b/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts index 986a6a8749511..a6bba3babfa83 100644 --- a/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts +++ b/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts @@ -27,6 +27,10 @@ import { ObservabilityPluginSetup } from '@kbn/observability-plugin/server'; import { LogsSharedPluginSetup, LogsSharedPluginStart } from '@kbn/logs-shared-plugin/server'; import { VersionedRouteConfig } from '@kbn/core-http-server'; import { MetricsDataPluginSetup } from '@kbn/metrics-data-access-plugin/server'; +import { + ProfilingDataAccessPluginSetup, + ProfilingDataAccessPluginStart, +} from '@kbn/profiling-data-access-plugin/server'; export interface InfraServerPluginSetupDeps { alerting: AlertingPluginContract; @@ -42,12 +46,14 @@ export interface InfraServerPluginSetupDeps { ml?: MlPluginSetup; logsShared: LogsSharedPluginSetup; metricsDataAccess: MetricsDataPluginSetup; + profilingDataAccess?: ProfilingDataAccessPluginSetup; } export interface InfraServerPluginStartDeps { data: DataPluginStart; dataViews: DataViewsPluginStart; logsShared: LogsSharedPluginStart; + profilingDataAccess?: ProfilingDataAccessPluginStart; } export interface CallWithRequestParams extends estypes.RequestBase { diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts index 81974728acc54..2c88148bc2fa4 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts @@ -2272,6 +2272,7 @@ const createMockStaticConfiguration = (sources: any): InfraConfig => ({ metricThresholdAlertRuleEnabled: true, logThresholdAlertRuleEnabled: true, alertsAndRulesDropdownEnabled: true, + profilingEnabled: false, }, enabled: true, sources, diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts index 591376450be38..41152d17572a8 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts @@ -7,13 +7,16 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { PersistedLogViewReference, ResolvedLogView } from '@kbn/logs-shared-plugin/common'; +import { IdFormat, IdFormatByJobType } from '../../../common/http_api/latest'; import { AnomaliesSort, getJobId, isCategoryAnomaly, jobCustomSettingsRT, LogEntryAnomalyDatasets, + logEntryCategoriesJobType, logEntryCategoriesJobTypes, + logEntryRateJobType, logEntryRateJobTypes, Pagination, } from '../../../common/log_analysis'; @@ -55,10 +58,21 @@ interface MappedAnomalyHit { async function getCompatibleAnomaliesJobIds( spaceId: string, logViewId: string, + idFormats: IdFormatByJobType, mlAnomalyDetectors: MlAnomalyDetectors ) { - const logRateJobId = getJobId(spaceId, logViewId, logEntryRateJobTypes[0]); - const logCategoriesJobId = getJobId(spaceId, logViewId, logEntryCategoriesJobTypes[0]); + const logRateJobId = getJobId( + spaceId, + logViewId, + idFormats[logEntryRateJobType], + logEntryRateJobType + ); + const logCategoriesJobId = getJobId( + spaceId, + logViewId, + idFormats[logEntryCategoriesJobType], + logEntryCategoriesJobType + ); const jobIds: string[] = []; let jobSpans: TracingSpan[] = []; @@ -100,6 +114,7 @@ export async function getLogEntryAnomalies( infra: Promise>; }, logView: PersistedLogViewReference, + idFormats: IdFormatByJobType, startTime: number, endTime: number, sort: AnomaliesSort, @@ -115,6 +130,7 @@ export async function getLogEntryAnomalies( } = await getCompatibleAnomaliesJobIds( infraContext.spaceId, logView.logViewId, + idFormats, infraContext.mlAnomalyDetectors ); @@ -156,7 +172,8 @@ export async function getLogEntryAnomalies( const logEntryCategoriesCountJobId = getJobId( infraContext.spaceId, logView.logViewId, - logEntryCategoriesJobTypes[0] + idFormats[logEntryCategoriesJobType], + logEntryCategoriesJobType ); const { logEntryCategoriesById } = await fetchLogEntryCategories( @@ -332,6 +349,7 @@ export async function getLogEntryExamples( infra: Promise>; }, logView: PersistedLogViewReference, + idFormat: IdFormat, startTime: number, endTime: number, dataset: string, @@ -346,6 +364,7 @@ export async function getLogEntryExamples( const jobId = getJobId( infraContext.spaceId, logView.logViewId, + idFormat, categoryId != null ? logEntryCategoriesJobTypes[0] : logEntryRateJobTypes[0] ); @@ -371,6 +390,7 @@ export async function getLogEntryExamples( } = await fetchLogEntryExamples( context, logView, + idFormat, indices, runtimeMappings, timestampField, @@ -398,6 +418,7 @@ export async function fetchLogEntryExamples( infra: Promise>; }, logView: PersistedLogViewReference, + idFormat: IdFormat, indices: string, runtimeMappings: estypes.MappingRuntimeFields, timestampField: string, @@ -421,6 +442,7 @@ export async function fetchLogEntryExamples( const logEntryCategoriesCountJobId = getJobId( infraContext.spaceId, logView.logViewId, + idFormat, logEntryCategoriesJobTypes[0] ); @@ -484,6 +506,7 @@ export async function getLogEntryAnomaliesDatasets( }; }, logView: PersistedLogViewReference, + idFormats: IdFormatByJobType, startTime: number, endTime: number ) { @@ -493,6 +516,7 @@ export async function getLogEntryAnomaliesDatasets( } = await getCompatibleAnomaliesJobIds( context.infra.spaceId, logView.logViewId, + idFormats, context.infra.mlAnomalyDetectors ); diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts index 88678f4c79c53..b9e908bf49eee 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts @@ -12,6 +12,7 @@ import { PersistedLogViewReference, ResolvedLogView, } from '@kbn/logs-shared-plugin/common'; +import { IdFormat } from '../../../common/http_api/latest'; import { CategoriesSort, compareDatasetsByMaximumAnomalyScore, @@ -51,6 +52,7 @@ export async function getTopLogEntryCategories( }; }, logView: PersistedLogViewReference, + idFormat: IdFormat, startTime: number, endTime: number, categoryCount: number, @@ -63,6 +65,7 @@ export async function getTopLogEntryCategories( const logEntryCategoriesCountJobId = getJobId( context.infra.spaceId, logView.logViewId, + idFormat, logEntryCategoriesJobTypes[0] ); @@ -123,12 +126,14 @@ export async function getLogEntryCategoryDatasets( }; }, logView: PersistedLogViewReference, + idFormat: IdFormat, startTime: number, endTime: number ) { const logEntryCategoriesCountJobId = getJobId( context.infra.spaceId, logView.logViewId, + idFormat, logEntryCategoriesJobTypes[0] ); @@ -147,6 +152,7 @@ export async function getLogEntryCategoryExamples( }; }, logView: PersistedLogViewReference, + idFormat: IdFormat, startTime: number, endTime: number, categoryId: number, @@ -158,6 +164,7 @@ export async function getLogEntryCategoryExamples( const logEntryCategoriesCountJobId = getJobId( context.infra.spaceId, logView.logViewId, + idFormat, logEntryCategoriesJobTypes[0] ); diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts index 1e043fed0986a..5231fb5dc14ec 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_rate_analysis.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { IdFormat } from '../../../common/http_api/latest'; import { decodeOrThrow } from '../../../common/runtime_types'; import { logRateModelPlotResponseRT, @@ -12,7 +13,7 @@ import { LogRateModelPlotBucket, CompositeTimestampPartitionKey, } from './queries'; -import { getJobId } from '../../../common/log_analysis'; +import { getJobId, logEntryRateJobType } from '../../../common/log_analysis'; import type { MlSystem } from '../../types'; const COMPOSITE_AGGREGATION_BATCH_SIZE = 1000; @@ -25,12 +26,13 @@ export async function getLogEntryRateBuckets( }; }, logViewId: string, + idFormat: IdFormat, startTime: number, endTime: number, bucketDuration: number, datasets?: string[] ) { - const logRateJobId = getJobId(context.infra.spaceId, logViewId, 'log-entry-rate'); + const logRateJobId = getJobId(context.infra.spaceId, logViewId, idFormat, logEntryRateJobType); let mlModelPlotBuckets: LogRateModelPlotBucket[] = []; let afterLatestBatchKey: CompositeTimestampPartitionKey | undefined; diff --git a/x-pack/plugins/infra/server/lib/log_analysis/resolve_id_formats.ts b/x-pack/plugins/infra/server/lib/log_analysis/resolve_id_formats.ts new file mode 100644 index 0000000000000..48f3b3e2fdc55 --- /dev/null +++ b/x-pack/plugins/infra/server/lib/log_analysis/resolve_id_formats.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MlAnomalyDetectors } from '@kbn/ml-plugin/server'; +import { IdFormat, IdFormatByJobType, JobType } from '../../../common/http_api/latest'; +import { + getJobId, + logEntryCategoriesJobType, + logEntryRateJobType, +} from '../../../common/log_analysis'; + +export async function resolveIdFormats( + spaceId: string, + logViewId: string, + mlAnomalyDetectors: MlAnomalyDetectors +): Promise { + const entryRateFormat = await resolveIdFormat( + spaceId, + logViewId, + logEntryRateJobType, + mlAnomalyDetectors + ); + const entryCategoriesCountFormat = await resolveIdFormat( + spaceId, + logViewId, + logEntryCategoriesJobType, + mlAnomalyDetectors + ); + + return { + [logEntryRateJobType]: entryRateFormat, + [logEntryCategoriesJobType]: entryCategoriesCountFormat, + }; +} + +async function resolveIdFormat( + spaceId: string, + logViewId: string, + jobType: JobType, + mlAnomalyDetectors: MlAnomalyDetectors +): Promise { + try { + const hashedJobId = getJobId(spaceId, logViewId, 'hashed', jobType); + const hashedJobs = await mlAnomalyDetectors.jobs(hashedJobId); + if (hashedJobs.count > 0) { + return 'hashed'; + } + } catch (e) { + // Ignore 404 in case the job isn't found + if (e.statusCode !== 404) { + throw e; + } + } + + try { + const legacyJobId = getJobId(spaceId, logViewId, 'legacy', jobType); + const legacyJobs = await mlAnomalyDetectors.jobs(legacyJobId); + if (legacyJobs.count > 0) { + return 'legacy'; + } + } catch (e) { + // Ignore 404 in case the job isn't found + if (e.statusCode !== 404) { + throw e; + } + } + + return 'hashed'; +} diff --git a/x-pack/plugins/infra/server/lib/sources/sources.test.ts b/x-pack/plugins/infra/server/lib/sources/sources.test.ts index 27f232eed3c99..ef58e5a985778 100644 --- a/x-pack/plugins/infra/server/lib/sources/sources.test.ts +++ b/x-pack/plugins/infra/server/lib/sources/sources.test.ts @@ -101,6 +101,7 @@ const createMockStaticConfiguration = (): InfraConfig => ({ metricThresholdAlertRuleEnabled: true, logThresholdAlertRuleEnabled: true, alertsAndRulesDropdownEnabled: true, + profilingEnabled: false, }, enabled: true, }); diff --git a/x-pack/plugins/infra/server/plugin.ts b/x-pack/plugins/infra/server/plugin.ts index afcbe69c01f5c..63bb40f66c32d 100644 --- a/x-pack/plugins/infra/server/plugin.ts +++ b/x-pack/plugins/infra/server/plugin.ts @@ -112,6 +112,15 @@ export const config: PluginConfigDescriptor = { traditional: schema.boolean({ defaultValue: true }), serverless: schema.boolean({ defaultValue: true }), }), + /** + * This flag depends on profilingDataAccess optional plugin, + * make sure to enable it with `xpack.profiling.enabled: true` + * before enabling this flag. + */ + profilingEnabled: offeringBasedSchema({ + traditional: schema.boolean({ defaultValue: false }), + serverless: schema.boolean({ defaultValue: false }), + }), }), }), exposeToBrowser: publicConfigKeys, diff --git a/x-pack/plugins/infra/server/routes/log_analysis/id_formats.ts b/x-pack/plugins/infra/server/routes/log_analysis/id_formats.ts new file mode 100644 index 0000000000000..800d43df448d5 --- /dev/null +++ b/x-pack/plugins/infra/server/routes/log_analysis/id_formats.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import Boom from '@hapi/boom'; +import { createValidationFunction } from '@kbn/logs-shared-plugin/common/runtime_types'; +import { + LOG_ANALYSIS_GET_ID_FORMATS, + getLogAnalysisIdFormatsRequestPayloadRT, + getLogAnalysisIdFormatsSuccessResponsePayloadRT, +} from '../../../common/http_api/latest'; +import { InfraBackendLibs } from '../../lib/infra_types'; +import { isMlPrivilegesError } from '../../lib/log_analysis'; +import { resolveIdFormats } from '../../lib/log_analysis/resolve_id_formats'; +import { assertHasInfraMlPlugins } from '../../utils/request_context'; + +export const initGetLogAnalysisIdFormatsRoute = ({ framework }: InfraBackendLibs) => { + framework + .registerVersionedRoute({ + access: 'internal', + method: 'post', + path: LOG_ANALYSIS_GET_ID_FORMATS, + }) + .addVersion( + { + version: '1', + validate: { + request: { + body: createValidationFunction(getLogAnalysisIdFormatsRequestPayloadRT), + }, + }, + }, + framework.router.handleLegacyErrors(async (requestContext, request, response) => { + const { + data: { logViewId, spaceId }, + } = request.body; + + try { + const infraMlContext = await assertHasInfraMlPlugins(requestContext); + const mlAnomalyDetectors = (await infraMlContext.infra).mlAnomalyDetectors; + + const idFormatByJobType = await resolveIdFormats(logViewId, spaceId, mlAnomalyDetectors); + + return response.ok({ + body: getLogAnalysisIdFormatsSuccessResponsePayloadRT.encode({ + data: idFormatByJobType, + }), + }); + } catch (error) { + if (Boom.isBoom(error)) { + throw error; + } + + if (isMlPrivilegesError(error)) { + return response.customError({ + statusCode: 403, + body: { + message: error.message, + }, + }); + } + + return response.customError({ + statusCode: error.statusCode ?? 500, + body: { + message: error.message ?? 'An unexpected error occurred', + }, + }); + } + }) + ); +}; diff --git a/x-pack/plugins/infra/server/routes/log_analysis/index.ts b/x-pack/plugins/infra/server/routes/log_analysis/index.ts index a642cd830b6fb..a3266adfd6ddd 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/index.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/index.ts @@ -7,3 +7,4 @@ export * from './results'; export * from './validation'; +export { initGetLogAnalysisIdFormatsRoute } from './id_formats'; diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts index 30a9aadda432a..1af2b1e7f9806 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies.ts @@ -40,6 +40,7 @@ export const initGetLogEntryAnomaliesRoute = ({ framework }: InfraBackendLibs) = const { data: { logView, + idFormats, timeRange: { startTime, endTime }, sort: sortParam, pagination: paginationParam, @@ -60,6 +61,7 @@ export const initGetLogEntryAnomaliesRoute = ({ framework }: InfraBackendLibs) = } = await getLogEntryAnomalies( infraMlContext, logView, + idFormats, startTime, endTime, sort, diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts index ce10ba09a059f..0b6444c1a9d7b 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_anomalies_datasets.ts @@ -39,6 +39,7 @@ export const initGetLogEntryAnomaliesDatasetsRoute = ({ framework }: InfraBacken const { data: { logView, + idFormats, timeRange: { startTime, endTime }, }, } = request.body; @@ -49,6 +50,7 @@ export const initGetLogEntryAnomaliesDatasetsRoute = ({ framework }: InfraBacken const { datasets, timing } = await getLogEntryAnomaliesDatasets( { infra: await infraMlContext.infra }, logView, + idFormats, startTime, endTime ); diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts index f51f81a846bbb..92221d5ce359d 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_categories.ts @@ -41,6 +41,7 @@ export const initGetLogEntryCategoriesRoute = ({ framework }: InfraBackendLibs) categoryCount, histograms, logView, + idFormat, timeRange: { startTime, endTime }, datasets, sort, @@ -53,6 +54,7 @@ export const initGetLogEntryCategoriesRoute = ({ framework }: InfraBackendLibs) const { data: topLogEntryCategories, timing } = await getTopLogEntryCategories( { infra: await infraMlContext.infra }, logView, + idFormat, startTime, endTime, categoryCount, diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts index 9ed89f1adb05b..1c62b67091a56 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_datasets.ts @@ -39,6 +39,7 @@ export const initGetLogEntryCategoryDatasetsRoute = ({ framework }: InfraBackend const { data: { logView, + idFormat, timeRange: { startTime, endTime }, }, } = request.body; @@ -49,6 +50,7 @@ export const initGetLogEntryCategoryDatasetsRoute = ({ framework }: InfraBackend const { data: logEntryCategoryDatasets, timing } = await getLogEntryCategoryDatasets( { infra: await infraMlContext.infra }, logView, + idFormat, startTime, endTime ); diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts index 828912143d412..c80aed6eab0fb 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_category_examples.ts @@ -44,6 +44,7 @@ export const initGetLogEntryCategoryExamplesRoute = ({ categoryId, exampleCount, logView, + idFormat, timeRange: { startTime, endTime }, }, } = request.body; @@ -59,6 +60,7 @@ export const initGetLogEntryCategoryExamplesRoute = ({ const { data: logEntryCategoryExamples, timing } = await getLogEntryCategoryExamples( { infra: await infraMlContext.infra, core: await infraMlContext.core }, logView, + idFormat, startTime, endTime, categoryId, diff --git a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts index df79783a56edc..8be303ca01f8d 100644 --- a/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts +++ b/x-pack/plugins/infra/server/routes/log_analysis/results/log_entry_examples.ts @@ -44,6 +44,7 @@ export const initGetLogEntryExamplesRoute = ({ dataset, exampleCount, logView, + idFormat, timeRange: { startTime, endTime }, categoryId, }, @@ -60,6 +61,7 @@ export const initGetLogEntryExamplesRoute = ({ const { data: logEntryExamples, timing } = await getLogEntryExamples( infraMlContext, logView, + idFormat, startTime, endTime, dataset, diff --git a/x-pack/plugins/infra/server/routes/profiling/index.ts b/x-pack/plugins/infra/server/routes/profiling/index.ts new file mode 100644 index 0000000000000..4b268c35becfd --- /dev/null +++ b/x-pack/plugins/infra/server/routes/profiling/index.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; +import { decodeOrThrow } from '@kbn/io-ts-utils'; +import { InfraProfilingRequestParamsRT } from '../../../common/http_api/profiling_api'; +import type { InfraBackendLibs } from '../../lib/infra_types'; +import { fetchProfilingFlamegraph } from './lib/fetch_profiling_flamechart'; +import { fetchProfilingStatus } from './lib/fetch_profiling_status'; +import { getProfilingDataAccess } from './lib/get_profiling_data_access'; + +export function initProfilingRoutes({ framework, getStartServices, logger }: InfraBackendLibs) { + if (!Object.hasOwn(framework.plugins, 'profilingDataAccess')) { + logger.info( + "Skipping initialization of Profiling endpoints because 'profilingDataAccess' plugin is not available" + ); + return; + } + + framework.registerRoute( + { + method: 'get', + path: '/api/infra/profiling/status', + validate: false, + }, + async (requestContext, request, response) => { + const [coreRequestContext, infraRequestContext, profilingDataAccess] = await Promise.all([ + requestContext.core, + requestContext.infra, + getProfilingDataAccess(getStartServices), + ]); + + const profilingStatus = await fetchProfilingStatus( + profilingDataAccess, + coreRequestContext, + infraRequestContext + ); + + return response.ok({ + body: profilingStatus, + }); + } + ); + + framework.registerRoute( + { + method: 'post', + path: '/api/infra/profiling/flamegraph', + validate: { + /** + * Allow any body object and validate it inside + * the handler using RT. + */ + body: schema.object({}, { unknowns: 'allow' }), + }, + }, + async (requestContext, request, response) => { + const params = decodeOrThrow(InfraProfilingRequestParamsRT)(request.body); + + const [coreRequestContext, profilingDataAccess] = await Promise.all([ + requestContext.core, + getProfilingDataAccess(getStartServices), + ]); + + const flamegraph = await fetchProfilingFlamegraph( + params, + profilingDataAccess, + coreRequestContext + ); + + return response.ok({ + body: flamegraph, + }); + } + ); +} diff --git a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamechart.ts b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamechart.ts new file mode 100644 index 0000000000000..593c9e7611185 --- /dev/null +++ b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_flamechart.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import 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 { profilingUseLegacyFlamegraphAPI } from '@kbn/observability-plugin/common'; +import type { InfraProfilingRequestParams } from '../../../../common/http_api/profiling_api'; +import { HOST_FIELD } from '../../../../common/constants'; + +export async function fetchProfilingFlamegraph( + { hostname, timeRange }: InfraProfilingRequestParams, + profilingDataAccess: ProfilingDataAccessPluginStart, + coreRequestContext: CoreRequestHandlerContext +): Promise { + const useLegacyFlamegraphAPI = await coreRequestContext.uiSettings.client.get( + profilingUseLegacyFlamegraphAPI + ); + + return await profilingDataAccess.services.fetchFlamechartData({ + esClient: coreRequestContext.elasticsearch.client.asCurrentUser, + rangeFromMs: timeRange.from, + rangeToMs: timeRange.to, + kuery: `${HOST_FIELD} : "${hostname}"`, + useLegacyFlamegraphAPI, + }); +} diff --git a/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_status.ts b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_status.ts new file mode 100644 index 0000000000000..3ef929eeef5a9 --- /dev/null +++ b/x-pack/plugins/infra/server/routes/profiling/lib/fetch_profiling_status.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 { CoreRequestHandlerContext } from '@kbn/core-http-request-handler-context-server'; +import type { ProfilingDataAccessPluginStart } from '@kbn/profiling-data-access-plugin/server'; +import type { ProfilingStatus } from '@kbn/profiling-utils'; +import type { InfraRequestHandlerContext } from '../../../types'; + +export async function fetchProfilingStatus( + profilingDataAccess: ProfilingDataAccessPluginStart, + coreRequestContext: CoreRequestHandlerContext, + infraRequestContext: InfraRequestHandlerContext +): Promise { + return await profilingDataAccess.services.getStatus({ + esClient: coreRequestContext.elasticsearch.client, + soClient: coreRequestContext.savedObjects.client, + spaceId: infraRequestContext.spaceId, + }); +} diff --git a/x-pack/plugins/infra/server/routes/profiling/lib/get_profiling_data_access.ts b/x-pack/plugins/infra/server/routes/profiling/lib/get_profiling_data_access.ts new file mode 100644 index 0000000000000..2e54b38b4c804 --- /dev/null +++ b/x-pack/plugins/infra/server/routes/profiling/lib/get_profiling_data_access.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 { ProfilingDataAccessPluginStart } from '@kbn/profiling-data-access-plugin/server'; +import type { InfraPluginStartServicesAccessor } from '../../../types'; + +export async function getProfilingDataAccess( + getStartServices: InfraPluginStartServicesAccessor +): Promise { + const [, { profilingDataAccess }] = await getStartServices(); + + if (profilingDataAccess === undefined) { + throw new Error( + "Trying to access profilingDataAccess plugin but it's not in the start dependencies" + ); + } + + return profilingDataAccess; +} diff --git a/x-pack/plugins/infra/tsconfig.json b/x-pack/plugins/infra/tsconfig.json index e3b71afa57001..da026aa7d7e93 100644 --- a/x-pack/plugins/infra/tsconfig.json +++ b/x-pack/plugins/infra/tsconfig.json @@ -74,7 +74,11 @@ "@kbn/expressions-plugin", "@kbn/chart-icons", "@kbn/advanced-settings-plugin", - "@kbn/cloud-plugin" + "@kbn/cloud-plugin", + "@kbn/custom-icons", + "@kbn/profiling-utils", + "@kbn/profiling-data-access-plugin", + "@kbn/core-http-request-handler-context-server" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts b/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts index d54cc4de89fa7..267671a062655 100644 --- a/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts +++ b/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts @@ -45,6 +45,7 @@ export interface ColumnState { summaryRow?: 'none' | 'sum' | 'avg' | 'count' | 'min' | 'max'; summaryLabel?: string; collapseFn?: CollapseFunction; + isMetric?: boolean; } export type DatatableColumnResult = ColumnState & { type: 'lens_datatable_column' }; diff --git a/x-pack/plugins/lens/kibana.jsonc b/x-pack/plugins/lens/kibana.jsonc index 04bb96af59388..1813264f7ca57 100644 --- a/x-pack/plugins/lens/kibana.jsonc +++ b/x-pack/plugins/lens/kibana.jsonc @@ -56,6 +56,7 @@ "embeddable", "fieldFormats", "charts", + "textBasedLanguages", ], "extraPublicDirs": [ "common/constants" diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index 9f5a9eb6d5a46..83cc485e09c76 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -538,9 +538,10 @@ describe('Lens App', () => { } async function testSave(inst: ReactWrapper, saveProps: SaveProps) { - await getButton(inst).run(inst.getDOMNode()); - inst.update(); - const handler = inst.find('SavedObjectSaveModalOrigin').prop('onSave') as ( + getButton(inst).run(inst.getDOMNode()); + // wait a tick since SaveModalContainer initializes asynchronously + await new Promise(process.nextTick); + const handler = inst.update().find('SavedObjectSaveModalOrigin').prop('onSave') as ( p: unknown ) => void; handler(saveProps); diff --git a/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx b/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx index e01f68d9e4b30..83ae6cd66702c 100644 --- a/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx +++ b/x-pack/plugins/lens/public/app_plugin/save_modal_container.tsx @@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n'; import { isFilterPinned } from '@kbn/es-query'; import { VisualizeFieldContext } from '@kbn/ui-actions-plugin/public'; import type { SavedObjectReference } from '@kbn/core/public'; +import { EuiLoadingSpinner } from '@elastic/eui'; import { SaveModal } from './save_modal'; import type { LensAppProps, LensAppServices } from './types'; import type { SaveProps } from './app'; @@ -58,6 +59,7 @@ export function SaveModalContainer({ let title = ''; let description; let savedObjectId; + const [initializing, setInitializing] = useState(true); const [lastKnownDoc, setLastKnownDoc] = useState(initLastKnownDoc); if (lastKnownDoc) { title = lastKnownDoc.title; @@ -92,9 +94,15 @@ export function SaveModalContainer({ getPersisted({ initialInput, lensServices, - }).then((persisted) => { - if (persisted?.doc && isMounted) setLastKnownDoc(persisted.doc); - }); + }) + .then((persisted) => { + if (persisted?.doc && isMounted) setLastKnownDoc(persisted.doc); + }) + .finally(() => { + setInitializing(false); + }); + } else { + setInitializing(false); } return () => { @@ -135,6 +143,10 @@ export function SaveModalContainer({ } }; + if (initializing) { + return ; + } + const savingToLibraryPermitted = Boolean(isSaveable && application.capabilities.visualize.save); return ( diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/flyout_wrapper.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/flyout_wrapper.tsx new file mode 100644 index 0000000000000..5f0abbf3a952f --- /dev/null +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/flyout_wrapper.tsx @@ -0,0 +1,157 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiTitle, + EuiToolTip, + EuiButton, + EuiLink, + EuiBetaBadge, +} from '@elastic/eui'; +import { euiThemeVars } from '@kbn/ui-theme'; +import { css } from '@emotion/react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import type { FlyoutWrapperProps } from './types'; + +export const FlyoutWrapper = ({ + children, + isInlineFlyoutVisible, + isScrollable, + displayFlyoutHeader, + language, + attributesChanged, + onCancel, + navigateToLensEditor, + onApply, +}: FlyoutWrapperProps) => { + return ( + <> + {isInlineFlyoutVisible && displayFlyoutHeader && ( + + + + +

    + {i18n.translate('xpack.lens.config.editVisualizationLabel', { + defaultMessage: 'Edit {lang} visualization', + values: { lang: language }, + })} + + + +

    +
    +
    + {navigateToLensEditor && ( + + + {i18n.translate('xpack.lens.config.editLinkLabel', { + defaultMessage: 'Edit in Lens', + })} + + + )} +
    +
    + )} + + * { + pointer-events: auto; + } + } + .euiFlyoutBody__overflowContent { + padding: 0; + block-size: 100%; + } + `} + > + {children} + + {isInlineFlyoutVisible && ( + + + + + + + + + + + + + + + )} + + ); +}; diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.test.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.test.tsx index 34adf0c9c2549..26428091032e9 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.test.tsx @@ -39,11 +39,11 @@ describe('Lens flyout', () => { newDatasourceState: 'newDatasourceState', }) ); - expect(updaterFn).toHaveBeenCalledWith('newDatasourceState', null); + expect(updaterFn).toHaveBeenCalledWith('newDatasourceState', null, 'testVis'); store.dispatch( updateVisualizationState({ visualizationId: 'testVis', newState: 'newVisState' }) ); - expect(updaterFn).toHaveBeenCalledWith('newDatasourceState', 'newVisState'); + expect(updaterFn).toHaveBeenCalledWith('newDatasourceState', 'newVisState', 'testVis'); }); test('updater is not run if it does not modify visualization or datasource state', () => { diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx index fc6511b66ec15..91b094c141161 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useState } from 'react'; import { EuiFlyout, EuiLoadingSpinner, EuiOverlayMask } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Provider } from 'react-redux'; @@ -25,16 +25,21 @@ import { } from '../../../state_management'; import { generateId } from '../../../id_generator'; import type { DatasourceMap, VisualizationMap } from '../../../types'; -import { - LensEditConfigurationFlyout, - type EditConfigPanelProps, -} from './lens_configuration_flyout'; +import { LensEditConfigurationFlyout } from './lens_configuration_flyout'; +import type { EditConfigPanelProps } from './types'; import { SavedObjectIndexStore, type Document } from '../../../persistence'; +import type { TypedLensByValueInput } from '../../../embeddable/embeddable_component'; import { DOC_TYPE } from '../../../../common/constants'; export type EditLensConfigurationProps = Omit< EditConfigPanelProps, - 'startDependencies' | 'coreStart' | 'visualizationMap' | 'datasourceMap' | 'saveByRef' + | 'startDependencies' + | 'coreStart' + | 'visualizationMap' + | 'datasourceMap' + | 'saveByRef' + | 'setCurrentAttributes' + | 'previousAttributes' >; function LoadingSpinnerWithOverlay() { return ( @@ -44,7 +49,11 @@ function LoadingSpinnerWithOverlay() { ); } -type UpdaterType = (datasourceState: unknown, visualizationState: unknown) => void; +type UpdaterType = ( + datasourceState: unknown, + visualizationState: unknown, + visualizationType?: string +) => void; // exported for testing export const updatingMiddleware = @@ -68,7 +77,12 @@ export const updatingMiddleware = if (initExisting.match(action) || initEmpty.match(action)) { return; } - updater(datasourceStates[activeDatasourceId].state, visualization.state); + + updater( + datasourceStates[activeDatasourceId].state, + visualization.state, + visualization.activeId + ); } }; @@ -88,6 +102,7 @@ export async function getEditLensConfiguration( return ({ attributes, updatePanelState, + updateSuggestion, closeFlyout, wrapInFlyout, datasourceId, @@ -98,10 +113,13 @@ export async function getEditLensConfiguration( updateByRefInput, navigateToLensEditor, displayFlyoutHeader, + canEditTextBasedQuery, }: EditLensConfigurationProps) => { if (!lensServices || !datasourceMap || !visualizationMap) { return ; } + const [currentAttributes, setCurrentAttributes] = + useState(attributes); /** * During inline editing of a by reference panel, the panel is converted to a by value one. * When the user applies the changes we save them to the Lens SO @@ -117,7 +135,7 @@ export async function getEditLensConfiguration( }, [savedObjectId] ); - const datasourceState = attributes.state.datasourceStates[datasourceId]; + const datasourceState = currentAttributes.state.datasourceStates[datasourceId]; const storeDeps = { lensServices, datasourceMap, @@ -135,7 +153,7 @@ export async function getEditLensConfiguration( lensStore.dispatch( loadInitial({ initialInput: { - attributes, + attributes: currentAttributes, id: panelId ?? generateId(), }, inlineEditing: true, @@ -148,6 +166,7 @@ export async function getEditLensConfiguration( { closeFlyout?.(); }} @@ -169,8 +188,9 @@ export async function getEditLensConfiguration( }; const configPanelProps = { - attributes, + attributes: currentAttributes, updatePanelState, + updateSuggestion, closeFlyout, datasourceId, coreStart, @@ -184,6 +204,8 @@ export async function getEditLensConfiguration( updateByRefInput, navigateToLensEditor, displayFlyoutHeader, + canEditTextBasedQuery, + setCurrentAttributes, }; return getWrapper( diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/helpers.test.ts b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/helpers.test.ts new file mode 100644 index 0000000000000..0fe5f148a25d0 --- /dev/null +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/helpers.test.ts @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import type { LensPluginStartDependencies } from '../../../plugin'; +import { createMockStartDependencies } from '../../../editor_frame_service/mocks'; +import { + mockVisualizationMap, + mockDatasourceMap, + mockDataViewWithTimefield, + mockAllSuggestions, +} from '../../../mocks'; +import { suggestionsApi } from '../../../lens_suggestions_api'; +import { fetchDataFromAggregateQuery } from '../../../datasources/text_based/fetch_data_from_aggregate_query'; +import { getSuggestions } from './helpers'; + +const mockSuggestionApi = suggestionsApi as jest.Mock; +const mockFetchData = fetchDataFromAggregateQuery as jest.Mock; + +jest.mock('../../../lens_suggestions_api', () => ({ + suggestionsApi: jest.fn(() => mockAllSuggestions), +})); + +jest.mock('../../../datasources/text_based/fetch_data_from_aggregate_query', () => ({ + fetchDataFromAggregateQuery: jest.fn(() => { + return { + columns: [ + { + name: '@timestamp', + id: '@timestamp', + meta: { + type: 'date', + }, + }, + { + name: 'bytes', + id: 'bytes', + meta: { + type: 'number', + }, + }, + { + name: 'memory', + id: 'memory', + meta: { + type: 'number', + }, + }, + ], + }; + }), +})); + +describe('getSuggestions', () => { + const query = { + esql: 'from index1 | limit 10 | stats average = avg(bytes', + }; + const mockStartDependencies = + createMockStartDependencies() as unknown as LensPluginStartDependencies; + const dataViews = dataViewPluginMocks.createStartContract(); + dataViews.create.mockResolvedValue(mockDataViewWithTimefield); + const dataviewSpecArr = [ + { + id: 'd2588ae7-9ea0-4439-9f5b-f808754a3b97', + title: 'index1', + timeFieldName: '@timestamp', + sourceFilters: [], + fieldFormats: {}, + runtimeFieldMap: {}, + fieldAttrs: {}, + allowNoIndex: false, + name: 'index1', + }, + ]; + const startDependencies = { + ...mockStartDependencies, + dataViews, + }; + + it('returns the suggestions attributes correctly', async () => { + const suggestionsAttributes = await getSuggestions( + query, + startDependencies, + mockDatasourceMap(), + mockVisualizationMap(), + dataviewSpecArr, + jest.fn() + ); + expect(suggestionsAttributes?.visualizationType).toBe(mockAllSuggestions[0].visualizationId); + expect(suggestionsAttributes?.state.visualization).toStrictEqual( + mockAllSuggestions[0].visualizationState + ); + }); + + it('returns undefined if no suggestions are computed', async () => { + mockSuggestionApi.mockResolvedValueOnce([]); + const suggestionsAttributes = await getSuggestions( + query, + startDependencies, + mockDatasourceMap(), + mockVisualizationMap(), + dataviewSpecArr, + jest.fn() + ); + expect(suggestionsAttributes).toBeUndefined(); + }); + + it('returns an error if fetching the data fails', async () => { + mockFetchData.mockImplementation(() => { + throw new Error('sorry!'); + }); + const setErrorsSpy = jest.fn(); + const suggestionsAttributes = await getSuggestions( + query, + startDependencies, + mockDatasourceMap(), + mockVisualizationMap(), + dataviewSpecArr, + setErrorsSpy + ); + expect(suggestionsAttributes).toBeUndefined(); + expect(setErrorsSpy).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/helpers.ts b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/helpers.ts new file mode 100644 index 0000000000000..faecb37ba7fd7 --- /dev/null +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/helpers.ts @@ -0,0 +1,148 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { i18n } from '@kbn/i18n'; +import { getIndexPatternFromSQLQuery, getIndexPatternFromESQLQuery } from '@kbn/es-query'; +import type { AggregateQuery, Query, Filter } from '@kbn/es-query'; +import type { DataView, DataViewSpec } from '@kbn/data-views-plugin/public'; +import type { Suggestion } from '../../../types'; +import type { TypedLensByValueInput } from '../../../embeddable/embeddable_component'; +import type { LensPluginStartDependencies } from '../../../plugin'; +import type { DatasourceMap, VisualizationMap } from '../../../types'; +import { fetchDataFromAggregateQuery } from '../../../datasources/text_based/fetch_data_from_aggregate_query'; +import { suggestionsApi } from '../../../lens_suggestions_api'; + +export const getQueryColumns = async ( + query: AggregateQuery, + dataView: DataView, + deps: LensPluginStartDependencies +) => { + // Fetching only columns for ES|QL for performance reasons with limit 0 + // Important note: ES doesnt return the warnings for 0 limit, + // I am skipping them in favor of performance now + // but we should think another way to get them (from Lens embeddable or store) + const performantQuery = { ...query }; + if ('esql' in performantQuery && performantQuery.esql) { + performantQuery.esql = `${performantQuery.esql} | limit 0`; + } + const table = await fetchDataFromAggregateQuery( + performantQuery, + dataView, + deps.data, + deps.expressions + ); + return table?.columns; +}; + +export const getSuggestions = async ( + query: AggregateQuery, + deps: LensPluginStartDependencies, + datasourceMap: DatasourceMap, + visualizationMap: VisualizationMap, + adHocDataViews: DataViewSpec[], + setErrors: (errors: Error[]) => void +) => { + try { + let indexPattern = ''; + if ('sql' in query) { + indexPattern = getIndexPatternFromSQLQuery(query.sql); + } + if ('esql' in query) { + indexPattern = getIndexPatternFromESQLQuery(query.esql); + } + const dataViewSpec = adHocDataViews.find((adHoc) => { + return adHoc.name === indexPattern; + }); + + const dataView = await deps.dataViews.create( + dataViewSpec ?? { + title: indexPattern, + } + ); + if (dataView.fields.getByName('@timestamp')?.type === 'date' && !dataViewSpec) { + dataView.timeFieldName = '@timestamp'; + } + const columns = await getQueryColumns(query, dataView, deps); + const context = { + dataViewSpec: dataView?.toSpec(), + fieldName: '', + textBasedColumns: columns, + query, + }; + + const allSuggestions = + suggestionsApi({ context, dataView, datasourceMap, visualizationMap }) ?? []; + + // Lens might not return suggestions for some cases, i.e. in case of errors + if (!allSuggestions.length) return undefined; + + const firstSuggestion = allSuggestions[0]; + + const attrs = getLensAttributes({ + filters: [], + query, + suggestion: firstSuggestion, + dataView, + }); + return attrs; + } catch (e) { + setErrors([e]); + } + return undefined; +}; + +export const getLensAttributes = ({ + filters, + query, + suggestion, + dataView, +}: { + filters: Filter[]; + query: Query | AggregateQuery; + suggestion: Suggestion | undefined; + dataView?: DataView; +}) => { + const suggestionDatasourceState = Object.assign({}, suggestion?.datasourceState); + const suggestionVisualizationState = Object.assign({}, suggestion?.visualizationState); + const datasourceStates = + suggestion && suggestion.datasourceState + ? { + [suggestion.datasourceId!]: { + ...suggestionDatasourceState, + }, + } + : { + formBased: {}, + }; + const visualization = suggestionVisualizationState; + const attributes = { + title: suggestion + ? suggestion.title + : i18n.translate('xpack.lens.config.suggestion.title', { + defaultMessage: 'New suggestion', + }), + references: [ + { + id: dataView?.id ?? '', + name: `textBasedLanguages-datasource-layer-suggestion`, + type: 'index-pattern', + }, + ], + state: { + datasourceStates, + filters, + query, + visualization, + ...(dataView && + dataView.id && + !dataView.isPersisted() && { + adHocDataViews: { [dataView.id]: dataView.toSpec(false) }, + }), + }, + visualizationType: suggestion ? suggestion.visualizationId : 'lnsXY', + } as TypedLensByValueInput['attributes']; + return attributes; +}; diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx new file mode 100644 index 0000000000000..7ae7b456ab669 --- /dev/null +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/layer_configuration_section.tsx @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiSpacer, useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; +import { VisualizationToolbar } from '../../../editor_frame_service/editor_frame/workspace_panel'; +import { ConfigPanelWrapper } from '../../../editor_frame_service/editor_frame/config_panel/config_panel'; +import { createIndexPatternService } from '../../../data_views_service/service'; +import { useLensDispatch, updateIndexPatterns } from '../../../state_management'; +import { replaceIndexpattern } from '../../../state_management/lens_slice'; +import type { LayerConfigurationProps } from './types'; +import { useLensSelector } from '../../../state_management'; + +export function LayerConfiguration({ + attributes, + coreStart, + startDependencies, + visualizationMap, + datasourceMap, + datasourceId, + framePublicAPI, + hasPadding, + setIsInlineFlyoutVisible, +}: LayerConfigurationProps) { + const dispatch = useLensDispatch(); + const { euiTheme } = useEuiTheme(); + const { visualization } = useLensSelector((state) => state.lens); + const activeVisualization = + visualizationMap[visualization.activeId ?? attributes.visualizationType]; + const indexPatternService = useMemo( + () => + createIndexPatternService({ + dataViews: startDependencies.dataViews, + uiActions: startDependencies.uiActions, + core: coreStart, + updateIndexPatterns: (newIndexPatternsState, options) => { + dispatch(updateIndexPatterns(newIndexPatternsState)); + }, + replaceIndexPattern: (newIndexPattern, oldId, options) => { + dispatch(replaceIndexpattern({ newIndexPattern, oldId })); + }, + }), + [coreStart, dispatch, startDependencies.dataViews, startDependencies.uiActions] + ); + + const layerPanelsProps = { + framePublicAPI, + datasourceMap, + visualizationMap, + core: coreStart, + dataViews: startDependencies.dataViews, + uiActions: startDependencies.uiActions, + hideLayerHeader: datasourceId === 'textBased', + indexPatternService, + setIsInlineFlyoutVisible, + }; + return ( +
    + + + +
    + ); +} diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx index 4731afe037249..0462e4ad251de 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx @@ -14,10 +14,8 @@ import { mockVisualizationMap, mockDatasourceMap, mockDataPlugin } from '../../. import type { LensPluginStartDependencies } from '../../../plugin'; import { createMockStartDependencies } from '../../../editor_frame_service/mocks'; import type { TypedLensByValueInput } from '../../../embeddable/embeddable_component'; -import { - LensEditConfigurationFlyout, - type EditConfigPanelProps, -} from './lens_configuration_flyout'; +import { LensEditConfigurationFlyout } from './lens_configuration_flyout'; +import type { EditConfigPanelProps } from './types'; const lensAttributes = { title: 'test', @@ -29,14 +27,12 @@ const lensAttributes = { visualization: {}, filters: [], query: { - language: 'lucene', - query: '', + esql: 'from index1 | limit 10', }, }, filters: [], query: { - language: 'lucene', - query: '', + esql: 'from index1 | limit 10', }, references: [], } as unknown as TypedLensByValueInput['attributes']; @@ -109,6 +105,16 @@ describe('LensEditConfigurationFlyout', () => { expect(closeFlyoutSpy).toHaveBeenCalled(); }); + it('should call the updatePanelState callback if cancel button is clicked', async () => { + const updatePanelStateSpy = jest.fn(); + renderConfigFlyout({ + updatePanelState: updatePanelStateSpy, + }); + expect(screen.getByTestId('lns-layerPanel-0')).toBeInTheDocument(); + userEvent.click(screen.getByTestId('cancelFlyoutButton')); + expect(updatePanelStateSpy).toHaveBeenCalled(); + }); + it('should call the updateByRefInput callback if cancel button is clicked and savedObjectId exists', async () => { const updateByRefInputSpy = jest.fn(); @@ -135,4 +141,41 @@ describe('LensEditConfigurationFlyout', () => { expect(updateByRefInputSpy).toHaveBeenCalled(); expect(saveByRefSpy).toHaveBeenCalled(); }); + + it('should not display the editor if canEditTextBasedQuery prop is false', async () => { + renderConfigFlyout({ + canEditTextBasedQuery: false, + }); + expect(screen.queryByTestId('TextBasedLangEditor')).toBeNull(); + }); + + it('should not display the editor if canEditTextBasedQuery prop is true but the query is not text based', async () => { + renderConfigFlyout({ + canEditTextBasedQuery: true, + attributes: { + ...lensAttributes, + state: { + ...lensAttributes.state, + query: { + type: 'kql', + query: '', + } as unknown as Query, + }, + }, + }); + expect(screen.queryByTestId('TextBasedLangEditor')).toBeNull(); + }); + + it('should display the suggestions if canEditTextBasedQuery prop is true', async () => { + renderConfigFlyout( + { + canEditTextBasedQuery: true, + }, + { + esql: 'from index1 | limit 10', + } + ); + expect(screen.getByTestId('InlineEditingESQLEditor')).toBeInTheDocument(); + expect(screen.getByTestId('InlineEditingSuggestions')).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx index a60e3df063aaa..72dbd313d6452 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx @@ -6,85 +6,34 @@ */ import React, { useMemo, useCallback, useRef, useEffect, useState } from 'react'; +import { isEqual } from 'lodash'; +import { css } from '@emotion/react'; +import { i18n } from '@kbn/i18n'; import { - EuiButtonEmpty, - EuiButton, - EuiFlyoutBody, - EuiFlyoutFooter, EuiTitle, - EuiLink, - EuiIcon, - EuiToolTip, - EuiSpacer, + EuiAccordion, + useEuiTheme, EuiFlexGroup, EuiFlexItem, - useEuiTheme, - EuiCallOut, + euiScrollBarStyles, } from '@elastic/eui'; -import { isEqual } from 'lodash'; -import type { Observable } from 'rxjs'; import { euiThemeVars } from '@kbn/ui-theme'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { css } from '@emotion/react'; -import type { CoreStart } from '@kbn/core/public'; import type { Datatable } from '@kbn/expressions-plugin/public'; -import type { LensPluginStartDependencies } from '../../../plugin'; import { - useLensSelector, - selectFramePublicAPI, - useLensDispatch, - updateIndexPatterns, -} from '../../../state_management'; -import { replaceIndexpattern } from '../../../state_management/lens_slice'; -import { VisualizationToolbar } from '../../../editor_frame_service/editor_frame/workspace_panel'; - -import type { DatasourceMap, VisualizationMap } from '../../../types'; + getAggregateQueryMode, + isOfAggregateQueryType, + getLanguageDisplayName, +} from '@kbn/es-query'; +import type { AggregateQuery, Query } from '@kbn/es-query'; +import { TextBasedLangEditor } from '@kbn/text-based-languages/public'; +import { useLensSelector, selectFramePublicAPI } from '../../../state_management'; import type { TypedLensByValueInput } from '../../../embeddable/embeddable_component'; -import type { LensEmbeddableOutput } from '../../../embeddable'; -import type { LensInspector } from '../../../lens_inspector_service'; -import { ConfigPanelWrapper } from '../../../editor_frame_service/editor_frame/config_panel/config_panel'; import { extractReferencesFromState } from '../../../utils'; -import type { Document } from '../../../persistence'; -import { createIndexPatternService } from '../../../data_views_service/service'; - -export interface EditConfigPanelProps { - coreStart: CoreStart; - startDependencies: LensPluginStartDependencies; - visualizationMap: VisualizationMap; - datasourceMap: DatasourceMap; - /** The attributes of the Lens embeddable */ - attributes: TypedLensByValueInput['attributes']; - /** Callback for updating the visualization and datasources state */ - updatePanelState: (datasourceState: unknown, visualizationState: unknown) => void; - /** Lens visualizations can be either created from ESQL (textBased) or from dataviews (formBased) */ - datasourceId: 'formBased' | 'textBased'; - /** Embeddable output observable, useful for dashboard flyout */ - output$?: Observable; - /** Contains the active data, necessary for some panel configuration such as coloring */ - lensAdapters?: LensInspector['adapters']; - /** Optional callback called when updating the by reference embeddable */ - updateByRefInput?: (soId: string) => void; - /** Callback for closing the edit flyout */ - closeFlyout?: () => void; - /** Boolean used for adding a flyout wrapper */ - wrapInFlyout?: boolean; - /** Optional parameter for panel identification - * If not given, Lens generates a new one - */ - panelId?: string; - /** Optional parameter for saved object id - * Should be given if the lens embeddable is a by reference one - * (saved in the library) - */ - savedObjectId?: string; - /** Callback for saving the embeddable as a SO */ - saveByRef?: (attrs: Document) => void; - /** Optional callback for navigation from the header of the flyout */ - navigateToLensEditor?: () => void; - /** If set to true it displays a header on the flyout */ - displayFlyoutHeader?: boolean; -} +import { LayerConfiguration } from './layer_configuration_section'; +import type { EditConfigPanelProps } from './types'; +import { FlyoutWrapper } from './flyout_wrapper'; +import { getSuggestions } from './helpers'; +import { SuggestionPanel } from '../../../editor_frame_service/editor_frame/suggestion_panel'; export function LensEditConfigurationFlyout({ attributes, @@ -94,6 +43,8 @@ export function LensEditConfigurationFlyout({ datasourceMap, datasourceId, updatePanelState, + updateSuggestion, + setCurrentAttributes, closeFlyout, saveByRef, savedObjectId, @@ -102,15 +53,21 @@ export function LensEditConfigurationFlyout({ lensAdapters, navigateToLensEditor, displayFlyoutHeader, + canEditTextBasedQuery, }: EditConfigPanelProps) { + const euiTheme = useEuiTheme(); const previousAttributes = useRef(attributes); + const prevQuery = useRef(attributes.state.query); + const [query, setQuery] = useState(attributes.state.query); + const [errors, setErrors] = useState(); + const [isInlineFlyoutVisible, setIsInlineFlyoutVisible] = useState(true); + const [isLayerAccordionOpen, setIsLayerAccordionOpen] = useState(true); + const [isSuggestionsAccordionOpen, setIsSuggestionsAccordionOpen] = useState(false); const datasourceState = attributes.state.datasourceStates[datasourceId]; const activeVisualization = visualizationMap[attributes.visualizationType]; const activeDatasource = datasourceMap[datasourceId]; - const [isInlineFooterVisible, setIsInlineFlyoutFooterVisible] = useState(true); - const { euiTheme } = useEuiTheme(); const { datasourceStates, visualization, isLoading } = useLensSelector((state) => state.lens); - const dispatch = useLensDispatch(); + const suggestsLimitedColumns = activeDatasource?.suggestsLimitedColumns?.(datasourceState); const activeData: Record = useMemo(() => { return {}; }, []); @@ -149,28 +106,34 @@ export function LensEditConfigurationFlyout({ const onCancel = useCallback(() => { const previousAttrs = previousAttributes.current; - if (attributesChanged) { - const currentDatasourceState = datasourceMap[datasourceId].injectReferencesToLayers - ? datasourceMap[datasourceId]?.injectReferencesToLayers?.( - previousAttrs.state.datasourceStates[datasourceId], - previousAttrs.references - ) - : previousAttrs.state.datasourceStates[datasourceId]; - updatePanelState?.(currentDatasourceState, previousAttrs.state.visualization); + if (previousAttrs.visualizationType === visualization.activeId) { + const currentDatasourceState = datasourceMap[datasourceId].injectReferencesToLayers + ? datasourceMap[datasourceId]?.injectReferencesToLayers?.( + previousAttrs.state.datasourceStates[datasourceId], + previousAttrs.references + ) + : previousAttrs.state.datasourceStates[datasourceId]; + updatePanelState?.(currentDatasourceState, previousAttrs.state.visualization); + } else { + updateSuggestion?.(previousAttrs); + } if (savedObjectId) { updateByRefInput?.(savedObjectId); } } closeFlyout?.(); }, [ + previousAttributes, attributesChanged, - savedObjectId, closeFlyout, datasourceMap, datasourceId, updatePanelState, + updateSuggestion, + savedObjectId, updateByRefInput, + visualization, ]); const onApply = useCallback(() => { @@ -218,20 +181,33 @@ export function LensEditConfigurationFlyout({ datasourceMap, ]); - const indexPatternService = useMemo( - () => - createIndexPatternService({ - dataViews: startDependencies.dataViews, - uiActions: startDependencies.uiActions, - core: coreStart, - updateIndexPatterns: (newIndexPatternsState, options) => { - dispatch(updateIndexPatterns(newIndexPatternsState)); - }, - replaceIndexPattern: (newIndexPattern, oldId, options) => { - dispatch(replaceIndexpattern({ newIndexPattern, oldId })); - }, - }), - [coreStart, dispatch, startDependencies.dataViews, startDependencies.uiActions] + // needed for text based languages mode which works ONLY with adHoc dataviews + const adHocDataViews = Object.values(attributes.state.adHocDataViews ?? {}); + + const runQuery = useCallback( + async (q) => { + const attrs = await getSuggestions( + q, + startDependencies, + datasourceMap, + visualizationMap, + adHocDataViews, + setErrors + ); + if (attrs) { + setCurrentAttributes?.(attrs); + setErrors([]); + updateSuggestion?.(attrs); + } + }, + [ + startDependencies, + datasourceMap, + visualizationMap, + adHocDataViews, + setCurrentAttributes, + updateSuggestion, + ] ); const framePublicAPI = useLensSelector((state) => { @@ -244,155 +220,197 @@ export function LensEditConfigurationFlyout({ }; return selectFramePublicAPI(newState, datasourceMap); }); + + const textBasedMode = isOfAggregateQueryType(query) ? getAggregateQueryMode(query) : undefined; + if (isLoading) return null; + // Example is the Discover editing where we dont want to render the text based editor on the panel + if (!canEditTextBasedQuery) { + return ( + + + + ); + } - const layerPanelsProps = { - framePublicAPI, - datasourceMap, - visualizationMap, - core: coreStart, - dataViews: startDependencies.dataViews, - uiActions: startDependencies.uiActions, - hideLayerHeader: datasourceId === 'textBased', - indexPatternService, - setIsInlineFlyoutFooterVisible, - }; return ( <> - * { - pointer-events: auto; - } - } - .euiFlyoutBody__overflowContent { - padding: 0; - } - `} + - - {displayFlyoutHeader && ( - - - - - - -

    - {i18n.translate('xpack.lens.config.editVisualizationLabel', { - defaultMessage: 'Edit visualization', - })} -

    -
    -
    - - - - - -
    -
    - {navigateToLensEditor && ( - - - {i18n.translate('xpack.lens.config.editLinkLabel', { - defaultMessage: 'Edit in Lens', - })} - - - )} -
    + + {isOfAggregateQueryType(query) && ( + + { + setQuery(q); + prevQuery.current = q; + }} + expandCodeEditor={(status: boolean) => {}} + isCodeEditorExpanded + detectTimestamp={Boolean(adHocDataViews?.[0]?.timeFieldName)} + errors={errors} + warning={ + suggestsLimitedColumns + ? i18n.translate('xpack.lens.config.configFlyoutCallout', { + defaultMessage: + 'Displaying a limited portion of the available fields. Add more from the configuration panel.', + }) + : undefined + } + hideMinimizeButton + editorIsInline + hideRunQueryText + disableSubmitAction={isEqual(query, prevQuery.current)} + onTextLangQuerySubmit={(q) => { + if (q) { + runQuery(q); + } + }} + isDisabled={false} + /> )} - {datasourceId === 'textBased' && ( - +
    + {i18n.translate('xpack.lens.config.layerConfigurationLabel', { + defaultMessage: 'Layer configuration', + })} +
    + + } + buttonProps={{ + paddingSize: 'm', + }} + initialIsOpen={isLayerAccordionOpen} + forceState={isLayerAccordionOpen ? 'open' : 'closed'} + onToggle={(status) => { + if (status && isSuggestionsAccordionOpen) { + setIsSuggestionsAccordionOpen(!status); + } + setIsLayerAccordionOpen(!isLayerAccordionOpen); + }} + > + - )} - - - - +
    + + + { + if (!status && isLayerAccordionOpen) { + setIsLayerAccordionOpen(status); + } + setIsSuggestionsAccordionOpen(!isSuggestionsAccordionOpen); + }} />
    -
    - {isInlineFooterVisible && ( - - - - - - - - - - - - - - - )} + ); } diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/types.ts b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/types.ts new file mode 100644 index 0000000000000..ae207865bbf9a --- /dev/null +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/types.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 { Observable } from 'rxjs'; +import type { CoreStart } from '@kbn/core/public'; +import type { TypedLensByValueInput } from '../../../embeddable/embeddable_component'; +import type { LensPluginStartDependencies } from '../../../plugin'; +import type { DatasourceMap, VisualizationMap, FramePublicAPI } from '../../../types'; +import type { LensEmbeddableOutput } from '../../../embeddable'; +import type { LensInspector } from '../../../lens_inspector_service'; +import type { Document } from '../../../persistence'; + +export interface FlyoutWrapperProps { + children: JSX.Element; + isInlineFlyoutVisible: boolean; + isScrollable: boolean; + displayFlyoutHeader?: boolean; + language?: string; + attributesChanged?: boolean; + onCancel?: () => void; + onApply?: () => void; + navigateToLensEditor?: () => void; +} + +export interface EditConfigPanelProps { + coreStart: CoreStart; + startDependencies: LensPluginStartDependencies; + visualizationMap: VisualizationMap; + datasourceMap: DatasourceMap; + /** The attributes of the Lens embeddable */ + attributes: TypedLensByValueInput['attributes']; + /** Callback for updating the visualization and datasources state.*/ + updatePanelState: ( + datasourceState: unknown, + visualizationState: unknown, + visualizationType?: string + ) => void; + updateSuggestion?: (attrs: TypedLensByValueInput['attributes']) => void; + /** Set the attributes state */ + setCurrentAttributes?: (attrs: TypedLensByValueInput['attributes']) => void; + /** Lens visualizations can be either created from ESQL (textBased) or from dataviews (formBased) */ + datasourceId: 'formBased' | 'textBased'; + /** Embeddable output observable, useful for dashboard flyout */ + output$?: Observable; + /** Contains the active data, necessary for some panel configuration such as coloring */ + lensAdapters?: LensInspector['adapters']; + /** Optional callback called when updating the by reference embeddable */ + updateByRefInput?: (soId: string) => void; + /** Callback for closing the edit flyout */ + closeFlyout?: () => void; + /** Boolean used for adding a flyout wrapper */ + wrapInFlyout?: boolean; + /** Optional parameter for panel identification + * If not given, Lens generates a new one + */ + panelId?: string; + /** Optional parameter for saved object id + * Should be given if the lens embeddable is a by reference one + * (saved in the library) + */ + savedObjectId?: string; + /** Callback for saving the embeddable as a SO */ + saveByRef?: (attrs: Document) => void; + /** Optional callback for navigation from the header of the flyout */ + navigateToLensEditor?: () => void; + /** If set to true it displays a header on the flyout */ + displayFlyoutHeader?: boolean; + /** If set to true the layout changes to accordion and the text based query (i.e. ES|QL) can be edited */ + canEditTextBasedQuery?: boolean; +} + +export interface LayerConfigurationProps { + attributes: TypedLensByValueInput['attributes']; + coreStart: CoreStart; + startDependencies: LensPluginStartDependencies; + visualizationMap: VisualizationMap; + datasourceMap: DatasourceMap; + datasourceId: 'formBased' | 'textBased'; + framePublicAPI: FramePublicAPI; + hasPadding?: boolean; + setIsInlineFlyoutVisible: (flag: boolean) => void; +} diff --git a/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.test.tsx b/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.test.tsx index ef4811f254cb2..ca9d48c17cbb8 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.test.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.test.tsx @@ -13,6 +13,7 @@ import { column3, numericDraggedColumn, fieldList, + fieldListNonNumericOnly, notNumericDraggedField, numericDraggedField, } from './mocks'; @@ -74,6 +75,23 @@ describe('Text-based: getDropProps', () => { } as unknown as DatasourceDimensionDropHandlerProps; expect(getDropProps(props)).toBeUndefined(); }); + it('should not return undefined if source is a non-numeric field, target is a metric dimension but datatable doesnt have numeric fields', () => { + const props = { + ...defaultProps, + state: { + ...defaultProps.state, + layers: { + first: { + columns: [column1, column2, column3], + allColumns: [...fieldListNonNumericOnly, column1, column2, column3], + }, + }, + fieldList: fieldListNonNumericOnly, + }, + source: notNumericDraggedField, + } as unknown as DatasourceDimensionDropHandlerProps; + expect(getDropProps(props)).toEqual({ dropTypes: ['field_replace'], nextLabel: 'category' }); + }); it('should return reorder if source and target are operations from the same group', () => { const props = { ...defaultProps, diff --git a/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.tsx b/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.tsx index 9f79fff3d6080..78e1c98f3a301 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/dnd/get_drop_props.tsx @@ -10,6 +10,7 @@ import { isOperation } from '../../../types'; import type { TextBasedPrivateState } from '../types'; import type { GetDropPropsArgs } from '../../../types'; import { isDraggedField, isOperationFromTheSameGroup } from '../../../utils'; +import { canColumnBeDroppedInMetricDimension } from '../utils'; export const getDropProps = ( props: GetDropPropsArgs @@ -44,14 +45,24 @@ export const getDropProps = ( return { dropTypes: ['reorder'], nextLabel }; } + const sourceFieldCanMoveToMetricDimension = canColumnBeDroppedInMetricDimension( + layer.allColumns, + sourceField?.meta?.type + ); + + const targetFieldCanMoveToMetricDimension = canColumnBeDroppedInMetricDimension( + layer.allColumns, + targetField?.meta?.type + ); + const isMoveable = !target?.isMetricDimension || - (target.isMetricDimension && sourceField?.meta?.type === 'number'); + (target.isMetricDimension && sourceFieldCanMoveToMetricDimension); if (targetColumn) { const isSwappable = (isMoveable && !source?.isMetricDimension) || - (source.isMetricDimension && targetField?.meta?.type === 'number'); + (source.isMetricDimension && targetFieldCanMoveToMetricDimension); if (isMoveable) { if (isSwappable) { return { diff --git a/x-pack/plugins/lens/public/datasources/text_based/dnd/mocks.tsx b/x-pack/plugins/lens/public/datasources/text_based/dnd/mocks.tsx index 5cb3bcd37e2cc..90a37acab1043 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/dnd/mocks.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/dnd/mocks.tsx @@ -83,6 +83,37 @@ export const numericDraggedField = { }, }; +export const fieldListNonNumericOnly = [ + { + columnId: 'category', + fieldName: 'category', + meta: { + type: 'string', + }, + }, + { + columnId: 'currency', + fieldName: 'currency', + meta: { + type: 'string', + }, + }, + { + columnId: 'products.sold_date', + fieldName: 'products.sold_date', + meta: { + type: 'date', + }, + }, + { + columnId: 'products.buyer', + fieldName: 'products.buyer', + meta: { + type: 'string', + }, + }, +]; + export const fieldList = [ { columnId: 'category', diff --git a/x-pack/plugins/lens/public/datasources/text_based/layerpanel.test.tsx b/x-pack/plugins/lens/public/datasources/text_based/layerpanel.test.tsx deleted file mode 100644 index d6e4be8c99387..0000000000000 --- a/x-pack/plugins/lens/public/datasources/text_based/layerpanel.test.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import type { DatatableColumn } from '@kbn/expressions-plugin/public'; -import { TextBasedPrivateState } from './types'; -import type { DataViewsState } from '../../state_management/types'; - -import { TextBasedLayerPanelProps, LayerPanel } from './layerpanel'; -import { shallowWithIntl as shallow } from '@kbn/test-jest-helpers'; -import { ChangeIndexPattern } from '../../shared_components/dataview_picker/dataview_picker'; - -const fields = [ - { - name: 'timestamp', - id: 'timestamp', - meta: { - type: 'date', - }, - }, - { - name: 'bytes', - id: 'bytes', - meta: { - type: 'number', - }, - }, - { - name: 'memory', - id: 'memory', - meta: { - type: 'number', - }, - }, -] as DatatableColumn[]; - -const initialState: TextBasedPrivateState = { - layers: { - first: { - index: '1', - columns: [], - allColumns: [], - query: { sql: 'SELECT * FROM foo' }, - }, - }, - indexPatternRefs: [ - { id: '1', title: 'my-fake-index-pattern' }, - { id: '2', title: 'my-fake-restricted-pattern' }, - { id: '3', title: 'my-compatible-pattern' }, - ], - fieldList: fields, -}; -describe('Layer Data Panel', () => { - let defaultProps: TextBasedLayerPanelProps; - - beforeEach(() => { - defaultProps = { - layerId: 'first', - state: initialState, - onChangeIndexPattern: jest.fn(), - dataViews: { - indexPatternRefs: [ - { id: '1', title: 'my-fake-index-pattern', name: 'My fake index pattern' }, - { id: '2', title: 'my-fake-restricted-pattern', name: 'my-fake-restricted-pattern' }, - { id: '3', title: 'my-compatible-pattern', name: 'my-compatible-pattern' }, - ], - indexPatterns: {}, - } as DataViewsState, - }; - }); - - it('should display the selected dataview but disabled', () => { - const instance = shallow(); - expect(instance.find(ChangeIndexPattern).prop('trigger')).toStrictEqual({ - fontWeight: 'normal', - isDisabled: true, - label: 'my-fake-index-pattern', - size: 's', - title: 'my-fake-index-pattern', - }); - }); -}); diff --git a/x-pack/plugins/lens/public/datasources/text_based/layerpanel.tsx b/x-pack/plugins/lens/public/datasources/text_based/layerpanel.tsx deleted file mode 100644 index 3ce8c333114ff..0000000000000 --- a/x-pack/plugins/lens/public/datasources/text_based/layerpanel.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { DatasourceLayerPanelProps } from '../../types'; -import { TextBasedPrivateState } from './types'; -import { ChangeIndexPattern } from '../../shared_components/dataview_picker/dataview_picker'; - -export interface TextBasedLayerPanelProps extends DatasourceLayerPanelProps { - state: TextBasedPrivateState; -} - -export function LayerPanel({ state, layerId, dataViews }: TextBasedLayerPanelProps) { - const layer = state.layers[layerId]; - const dataView = state.indexPatternRefs.find((ref) => ref.id === layer.index); - - const notFoundTitleLabel = i18n.translate('xpack.lens.layerPanel.missingDataView', { - defaultMessage: 'Data view not found', - }); - return ( - {}} - /> - ); -} diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts index 8aab2f3670959..1528a3ff623c0 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.test.ts @@ -116,7 +116,7 @@ describe('Textbased Data Source', () => { }, ], index: 'foo', - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, }, }, fieldList: [ @@ -226,7 +226,7 @@ describe('Textbased Data Source', () => { }, }, ], - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, index: 'foo', }, }, @@ -261,7 +261,7 @@ describe('Textbased Data Source', () => { ...baseState.layers, newLayer: { index: 'foo', - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, allColumns: [ { columnId: 'col1', @@ -296,7 +296,7 @@ describe('Textbased Data Source', () => { }, }, ], - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, index: 'foo', }, }, @@ -353,7 +353,7 @@ describe('Textbased Data Source', () => { }, }, ], - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, index: 'foo', }, }, @@ -402,12 +402,20 @@ describe('Textbased Data Source', () => { expect(suggestions[0].state).toEqual({ ...state, fieldList: textBasedQueryColumns, + indexPatternRefs: [ + { + id: '1', + timeField: undefined, + title: 'foo', + }, + ], layers: { newid: { allColumns: [ { columnId: 'bytes', fieldName: 'bytes', + inMetricDimension: true, meta: { type: 'number', }, @@ -424,6 +432,7 @@ describe('Textbased Data Source', () => { { columnId: 'bytes', fieldName: 'bytes', + inMetricDimension: true, meta: { type: 'number', }, @@ -466,6 +475,7 @@ describe('Textbased Data Source', () => { ], isMultiRow: false, layerId: 'newid', + notAssignedMetrics: false, }); }); @@ -504,6 +514,175 @@ describe('Textbased Data Source', () => { ); expect(suggestions).toEqual([]); }); + + it('should return the correct suggestions if non numeric columns are given', () => { + const textBasedQueryColumns = [ + { + id: '@timestamp', + name: '@timestamp', + meta: { + type: 'date', + }, + }, + { + id: 'dest', + name: 'dest', + meta: { + type: 'string', + }, + }, + ]; + const state = { + layers: {}, + initialContext: { + textBasedColumns: textBasedQueryColumns, + query: { esql: 'from foo' }, + dataViewSpec: { + title: 'foo', + id: '1', + name: 'Foo', + }, + }, + } as unknown as TextBasedPrivateState; + const suggestions = TextBasedDatasource.getDatasourceSuggestionsForVisualizeField( + state, + '1', + '', + indexPatterns + ); + expect(suggestions[0].state).toEqual({ + ...state, + fieldList: textBasedQueryColumns, + indexPatternRefs: [ + { + id: '1', + timeField: undefined, + title: 'foo', + }, + ], + layers: { + newid: { + allColumns: [ + { + columnId: '@timestamp', + fieldName: '@timestamp', + inMetricDimension: true, + meta: { + type: 'date', + }, + }, + { + columnId: 'dest', + fieldName: 'dest', + inMetricDimension: true, + meta: { + type: 'string', + }, + }, + ], + columns: [ + { + columnId: '@timestamp', + fieldName: '@timestamp', + inMetricDimension: true, + meta: { + type: 'date', + }, + }, + { + columnId: 'dest', + fieldName: 'dest', + inMetricDimension: true, + meta: { + type: 'string', + }, + }, + ], + index: '1', + query: { + esql: 'from foo', + }, + }, + }, + }); + + expect(suggestions[0].table).toEqual({ + changeType: 'initial', + columns: [ + { + columnId: '@timestamp', + operation: { + dataType: 'date', + isBucketed: true, + label: '@timestamp', + }, + }, + { + columnId: 'dest', + operation: { + dataType: 'string', + isBucketed: true, + label: 'dest', + }, + }, + ], + isMultiRow: false, + layerId: 'newid', + notAssignedMetrics: true, + }); + }); + }); + + describe('#suggestsLimitedColumns', () => { + it('should return true if query returns big number of columns', () => { + const fieldList = [ + { + id: 'a', + name: 'Test 1', + meta: { + type: 'number', + }, + }, + { + id: 'b', + name: 'Test 2', + meta: { + type: 'number', + }, + }, + { + id: 'c', + name: 'Test 3', + meta: { + type: 'date', + }, + }, + { + id: 'd', + name: 'Test 4', + meta: { + type: 'string', + }, + }, + { + id: 'e', + name: 'Test 5', + meta: { + type: 'string', + }, + }, + ]; + const state = { + fieldList, + layers: { + a: { + query: { esql: 'from foo' }, + index: 'foo', + }, + }, + } as unknown as TextBasedPrivateState; + expect(TextBasedDatasource?.suggestsLimitedColumns?.(state)).toBeTruthy(); + }); }); describe('#getUserMessages', () => { @@ -544,7 +723,7 @@ describe('Textbased Data Source', () => { }, ], errors: [new Error('error 1'), new Error('error 2')], - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, index: 'foo', }, }, @@ -626,7 +805,7 @@ describe('Textbased Data Source', () => { }, }, ], - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, index: '1', }, }, @@ -673,7 +852,7 @@ describe('Textbased Data Source', () => { }, }, ], - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, index: '1', }, }, @@ -731,7 +910,7 @@ describe('Textbased Data Source', () => { }, }, ], - query: { sql: 'SELECT * FROM foo' }, + query: { esql: 'FROM foo' }, index: '1', }, }, @@ -759,11 +938,14 @@ describe('Textbased Data Source', () => { }, Object { "arguments": Object { + "locale": Array [ + "en", + ], "query": Array [ - "SELECT * FROM foo", + "FROM foo", ], }, - "function": "essql", + "function": "esql", "type": "function", }, Object { diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx index 43d971caf24a9..a24c52b88d217 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx @@ -42,10 +42,10 @@ import type { } from './types'; import { FieldSelect } from './field_select'; import type { Datasource } from '../../types'; -import { LayerPanel } from './layerpanel'; import { getUniqueLabelGenerator, nonNullable } from '../../utils'; import { onDrop, getDropProps } from './dnd'; import { removeColumn } from './remove_column'; +import { canColumnBeUsedBeInMetricDimension, MAX_NUM_OF_COLUMNS } from './utils'; function getLayerReferenceName(layerId: string) { return `textBasedLanguages-datasource-layer-${layerId}`; @@ -88,12 +88,20 @@ export function getTextBasedDatasource({ layerId: id, columns: layer.columns?.map((f) => { + const inMetricDimension = canColumnBeUsedBeInMetricDimension( + layer.allColumns, + f?.meta?.type + ); return { columnId: f.columnId, operation: { dataType: f?.meta?.type as DataType, label: f.fieldName, isBucketed: Boolean(f?.meta?.type !== 'number'), + // makes non-number fields to act as metrics, used for datatable suggestions + ...(inMetricDimension && { + inMetricDimension, + }), }, }; }) ?? [], @@ -113,11 +121,23 @@ export function getTextBasedDatasource({ if (context && 'dataViewSpec' in context && context.dataViewSpec.title && context.query) { const newLayerId = generateId(); const textBasedQueryColumns = context.textBasedColumns ?? []; + // Number fields are assigned automatically as metrics (!isBucketed). There are cases where the query + // will not return number fields. In these cases we want to suggest a datatable + // Datatable works differently in this case. On the metrics dimension can be all type of fields + const hasNumberTypeColumns = textBasedQueryColumns?.some((c) => c?.meta?.type === 'number'); const newColumns = textBasedQueryColumns.map((c) => { + const inMetricDimension = canColumnBeUsedBeInMetricDimension( + textBasedQueryColumns, + c?.meta?.type + ); return { columnId: c.id, fieldName: c.name, meta: c.meta, + // makes non-number fields to act as metrics, used for datatable suggestions + ...(inMetricDimension && { + inMetricDimension, + }), }; }); @@ -126,12 +146,23 @@ export function getTextBasedDatasource({ const updatedState = { ...state, fieldList: textBasedQueryColumns, + ...(context.dataViewSpec.id + ? { + indexPatternRefs: [ + { + id: context.dataViewSpec.id, + title: context.dataViewSpec.title, + timeField: context.dataViewSpec.timeFieldName, + }, + ], + } + : {}), layers: { ...state.layers, [newLayerId]: { index, query, - columns: newColumns ?? [], + columns: newColumns.slice(0, MAX_NUM_OF_COLUMNS) ?? [], allColumns: newColumns ?? [], timeField: context.dataViewSpec.timeFieldName, }, @@ -146,9 +177,10 @@ export function getTextBasedDatasource({ table: { changeType: 'initial' as TableChangeType, isMultiRow: false, + notAssignedMetrics: !hasNumberTypeColumns, layerId: newLayerId, columns: - newColumns?.map((f) => { + newColumns?.slice(0, MAX_NUM_OF_COLUMNS)?.map((f) => { return { columnId: f.columnId, operation: { @@ -304,6 +336,13 @@ export function getTextBasedDatasource({ getLayers(state: TextBasedPrivateState) { return state && state.layers ? Object.keys(state?.layers) : []; }, + // there are cases where a query can return a big amount of columns + // at this case we don't suggest all columns in a table but the first + // MAX_NUM_OF_COLUMNS + suggestsLimitedColumns(state: TextBasedPrivateState) { + const fieldsList = state?.fieldList ?? []; + return fieldsList.length >= MAX_NUM_OF_COLUMNS; + }, isTimeBased: (state, indexPatterns) => { if (!state) return false; const { layers } = state; @@ -382,20 +421,21 @@ export function getTextBasedDatasource({ DimensionEditorComponent: (props: DatasourceDimensionEditorProps) => { const fields = props.state.fieldList; - const selectedField = props.state.layers[props.layerId]?.allColumns?.find( - (column) => column.columnId === props.columnId - ); + const allColumns = props.state.layers[props.layerId]?.allColumns; + const selectedField = allColumns?.find((column) => column.columnId === props.columnId); + const hasNumberTypeColumns = allColumns?.some((c) => c?.meta?.type === 'number'); const updatedFields = fields?.map((f) => { return { ...f, - compatible: props.isMetricDimension - ? props.filterOperations({ - dataType: f.meta.type as DataType, - isBucketed: Boolean(f?.meta?.type !== 'number'), - scale: 'ordinal', - }) - : true, + compatible: + props.isMetricDimension && hasNumberTypeColumns + ? props.filterOperations({ + dataType: f.meta.type as DataType, + isBucketed: Boolean(f?.meta?.type !== 'number'), + scale: 'ordinal', + }) + : true, }; }); return ( @@ -472,7 +512,7 @@ export function getTextBasedDatasource({ }, LayerPanelComponent: (props: DatasourceLayerPanelProps) => { - return ; + return null; }, uniqueLabels(state: TextBasedPrivateState) { @@ -519,6 +559,7 @@ export function getTextBasedDatasource({ dataType: column?.meta?.type as DataType, label: columnLabelMap[columnId] ?? column?.fieldName, isBucketed: Boolean(column?.meta?.type !== 'number'), + inMetricDimension: column.inMetricDimension, hasTimeShift: false, hasReducedTimeRange: false, }; diff --git a/x-pack/plugins/lens/public/datasources/text_based/types.ts b/x-pack/plugins/lens/public/datasources/text_based/types.ts index 8da183f9b9054..4d1f9dfea510f 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/types.ts +++ b/x-pack/plugins/lens/public/datasources/text_based/types.ts @@ -13,6 +13,7 @@ export interface TextBasedLayerColumn { columnId: string; fieldName: string; meta?: DatatableColumn['meta']; + inMetricDimension?: boolean; } export interface TextBasedField { diff --git a/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts b/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts index 593d34f450212..3a01a7ba9efea 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts +++ b/x-pack/plugins/lens/public/datasources/text_based/utils.test.ts @@ -15,6 +15,7 @@ import { loadIndexPatternRefs, getStateFromAggregateQuery, getAllColumns, + canColumnBeUsedBeInMetricDimension, } from './utils'; import type { TextBasedLayerColumn } from './types'; import { type AggregateQuery } from '@kbn/es-query'; @@ -485,4 +486,111 @@ describe('Text based languages utils', () => { }); }); }); + + describe('canColumnBeUsedBeInMetricDimension', () => { + it('should return true if there are non numeric field', async () => { + const fieldList = [ + { + id: 'a', + name: 'Test 1', + meta: { + type: 'string', + }, + }, + { + id: 'b', + name: 'Test 2', + meta: { + type: 'string', + }, + }, + ] as DatatableColumn[]; + const flag = canColumnBeUsedBeInMetricDimension(fieldList, 'string'); + expect(flag).toBeTruthy(); + }); + + it('should return true if there are numeric field and the selected type is number', async () => { + const fieldList = [ + { + id: 'a', + name: 'Test 1', + meta: { + type: 'number', + }, + }, + { + id: 'b', + name: 'Test 2', + meta: { + type: 'string', + }, + }, + ] as DatatableColumn[]; + const flag = canColumnBeUsedBeInMetricDimension(fieldList, 'number'); + expect(flag).toBeTruthy(); + }); + + it('should return false if there are non numeric fields and the selected type is non numeric', async () => { + const fieldList = [ + { + id: 'a', + name: 'Test 1', + meta: { + type: 'number', + }, + }, + { + id: 'b', + name: 'Test 2', + meta: { + type: 'string', + }, + }, + ] as DatatableColumn[]; + const flag = canColumnBeUsedBeInMetricDimension(fieldList, 'date'); + expect(flag).toBeFalsy(); + }); + + it('should return true if there are many columns regardless the types', async () => { + const fieldList = [ + { + id: 'a', + name: 'Test 1', + meta: { + type: 'number', + }, + }, + { + id: 'b', + name: 'Test 2', + meta: { + type: 'number', + }, + }, + { + id: 'c', + name: 'Test 3', + meta: { + type: 'date', + }, + }, + { + id: 'd', + name: 'Test 4', + meta: { + type: 'string', + }, + }, + { + id: 'e', + name: 'Test 5', + meta: { + type: 'string', + }, + }, + ] as DatatableColumn[]; + const flag = canColumnBeUsedBeInMetricDimension(fieldList, 'date'); + expect(flag).toBeTruthy(); + }); + }); }); diff --git a/x-pack/plugins/lens/public/datasources/text_based/utils.ts b/x-pack/plugins/lens/public/datasources/text_based/utils.ts index aea93add73680..ecf4fbcd12ff2 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/utils.ts +++ b/x-pack/plugins/lens/public/datasources/text_based/utils.ts @@ -20,6 +20,8 @@ import { fetchDataFromAggregateQuery } from './fetch_data_from_aggregate_query'; import type { IndexPatternRef, TextBasedPrivateState, TextBasedLayerColumn } from './types'; import type { DataViewsState } from '../../state_management'; +export const MAX_NUM_OF_COLUMNS = 5; + export async function loadIndexPatternRefs( indexPatternsService: DataViewsPublicPluginStart ): Promise { @@ -146,3 +148,25 @@ export function getIndexPatternFromTextBasedQuery(query: AggregateQuery): string return indexPattern; } + +export function canColumnBeDroppedInMetricDimension( + columns: TextBasedLayerColumn[] | DatatableColumn[], + selectedColumnType?: string +): boolean { + // check if at least one numeric field exists + const hasNumberTypeColumns = columns?.some((c) => c?.meta?.type === 'number'); + return !hasNumberTypeColumns || (hasNumberTypeColumns && selectedColumnType === 'number'); +} + +export function canColumnBeUsedBeInMetricDimension( + columns: TextBasedLayerColumn[] | DatatableColumn[], + selectedColumnType?: string +): boolean { + // check if at least one numeric field exists + const hasNumberTypeColumns = columns?.some((c) => c?.meta?.type === 'number'); + return ( + !hasNumberTypeColumns || + columns.length >= MAX_NUM_OF_COLUMNS || + (hasNumberTypeColumns && selectedColumnType === 'number') + ); +} diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx index 41184d2212c45..8c31fb2f9d800 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx @@ -370,7 +370,7 @@ export function LayerPanels( } }, registerLibraryAnnotationGroup: registerLibraryAnnotationGroupFunction, - isInlineEditing: Boolean(props?.setIsInlineFlyoutFooterVisible), + isInlineEditing: Boolean(props?.setIsInlineFlyoutVisible), })} ); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx index 78a06408902b5..024fb04998d37 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx @@ -95,7 +95,7 @@ export function LayerPanel( indexPatternService?: IndexPatternServiceAPI; getUserMessages?: UserMessagesGetter; displayLayerSettings: boolean; - setIsInlineFlyoutFooterVisible?: (status: boolean) => void; + setIsInlineFlyoutVisible?: (status: boolean) => void; } ) { const [activeDimension, setActiveDimension] = useState( @@ -139,7 +139,7 @@ export function LayerPanel( useEffect(() => { // is undefined when the dimension panel is closed const activeDimensionId = activeDimension.activeId; - props?.setIsInlineFlyoutFooterVisible?.(!Boolean(activeDimensionId)); + props?.setIsInlineFlyoutVisible?.(!Boolean(activeDimensionId)); }, [activeDimension.activeId, activeVisualization.id, props]); const panelRef = useRef(null); @@ -394,6 +394,7 @@ export function LayerPanel( )} {props.indexPatternService && + !isTextBasedLanguage && (layerDatasource || activeVisualization.LayerPanelComponent) && ( )} @@ -680,7 +681,7 @@ export function LayerPanel( setPanelSettingsOpen(false); return true; }} - isInlineEditing={Boolean(props?.setIsInlineFlyoutFooterVisible)} + isInlineEditing={Boolean(props?.setIsInlineFlyoutVisible)} >
    @@ -749,7 +750,7 @@ export function LayerPanel( isOpen={isDimensionPanelOpen} isFullscreen={isFullscreen} groupLabel={activeGroup?.dimensionEditorGroupLabel ?? (activeGroup?.groupLabel || '')} - isInlineEditing={Boolean(props?.setIsInlineFlyoutFooterVisible)} + isInlineEditing={Boolean(props?.setIsInlineFlyoutVisible)} handleClose={() => { if (layerDatasource) { if (layerDatasource.updateStateOnCloseDimension) { @@ -828,7 +829,7 @@ export function LayerPanel( addLayer: props.addLayer, removeLayer: props.onRemoveLayer, panelRef, - isInlineEditing: Boolean(props?.setIsInlineFlyoutFooterVisible), + isInlineEditing: Boolean(props?.setIsInlineFlyoutVisible), }} />
    diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts index 6d06dfb7e6aac..2ef775b51f54b 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts @@ -29,7 +29,7 @@ export interface ConfigPanelWrapperProps { uiActions: UiActionsStart; getUserMessages?: UserMessagesGetter; hideLayerHeader?: boolean; - setIsInlineFlyoutFooterVisible?: (status: boolean) => void; + setIsInlineFlyoutVisible?: (status: boolean) => void; } export interface LayerPanelProps { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts index c1032d144ac33..fd2868b8a4063 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_helpers.ts @@ -150,6 +150,7 @@ export function getSuggestions({ return filteredCount || filteredCount === datasourceSuggestion.keptLayerIds.length; }) .flatMap((datasourceSuggestion) => { + const datasourceId = datasourceSuggestion.datasourceId; const table = datasourceSuggestion.table; const currentVisualizationState = visualizationId === activeVisualization?.id ? visualizationState : undefined; @@ -170,7 +171,8 @@ export function getSuggestions({ palette, visualizeTriggerFieldContext && 'isVisualizeAction' in visualizeTriggerFieldContext, activeData, - allowMixed + allowMixed, + datasourceId ); }); }) @@ -240,7 +242,8 @@ function getVisualizationSuggestions( mainPalette?: SuggestionRequest['mainPalette'], isFromContext?: boolean, activeData?: Record, - allowMixed?: boolean + allowMixed?: boolean, + datasourceId?: string ) { try { return visualization @@ -253,6 +256,7 @@ function getVisualizationSuggestions( isFromContext, activeData, allowMixed, + datasourceId, }) .map(({ state, ...visualizationSuggestion }) => ({ ...visualizationSuggestion, diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss index f139bbe3ca122..cd2ee706c1e18 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.scss @@ -1,6 +1,10 @@ @import '../../mixins'; @import '../../variables'; +.lnsSuggestionPanel .euiAccordion__buttonContent { + width: 100%; +} + .lnsSuggestionPanel__suggestions { @include euiScrollBar; @include lnsOverflowShadowHorizontal; @@ -16,14 +20,9 @@ margin-right: -$euiSizeXS; } -.lnsSuggestionPanel { - padding-bottom: $euiSizeS; -} - .lnsSuggestionPanel__button { position: relative; // Let the expression progress indicator position itself against the button flex: 0 0 auto; - width: $lnsSuggestionWidth !important; // sass-lint:disable-line no-important height: $lnsSuggestionHeight; margin-right: $euiSizeS; margin-left: $euiSizeXS / 2; @@ -58,6 +57,10 @@ } } +.lnsSuggestionPanel__button-fixedWidth { + width: $lnsSuggestionWidth !important; // sass-lint:disable-line no-important +} + .lnsSuggestionPanel__suggestionIcon { color: $euiColorDarkShade; width: 100%; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx index a4e65b280d203..c487f31fd82ff 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx @@ -10,6 +10,7 @@ import './suggestion_panel.scss'; import { camelCase, pick } from 'lodash'; import React, { useState, useEffect, useMemo, useRef, useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/react'; import useLocalStorage from 'react-use/lib/useLocalStorage'; import { EuiIcon, @@ -20,7 +21,9 @@ import { EuiButtonEmpty, EuiAccordion, EuiText, + EuiNotificationBadge, } from '@elastic/eui'; +import { euiThemeVars } from '@kbn/ui-theme'; import { IconType } from '@elastic/eui/src/components/icon/icon'; import { Ast, fromExpression, toExpression } from '@kbn/interpreter'; import { i18n } from '@kbn/i18n'; @@ -65,6 +68,7 @@ import { selectFramePublicAPI, } from '../../state_management'; import { filterAndSortUserMessages } from '../../app_plugin/get_application_user_messages'; + const MAX_SUGGESTIONS_DISPLAYED = 5; const LOCAL_STORAGE_SUGGESTIONS_PANEL = 'LENS_SUGGESTIONS_PANEL_HIDDEN'; @@ -99,10 +103,13 @@ export interface SuggestionPanelProps { visualizationMap: VisualizationMap; ExpressionRenderer: ReactExpressionRendererType; frame: FramePublicAPI; - getUserMessages: UserMessagesGetter; + getUserMessages?: UserMessagesGetter; nowProvider: DataPublicPluginStart['nowProvider']; core: CoreStart; showOnlyIcons?: boolean; + wrapSuggestions?: boolean; + isAccordionOpen?: boolean; + toggleAccordionCb?: (flag: boolean) => void; } const PreviewRenderer = ({ @@ -165,6 +172,7 @@ const SuggestionPreview = ({ onSelect, showTitleAsLabel, onRender, + wrapSuggestions, }: { onSelect: () => void; preview: { @@ -177,15 +185,30 @@ const SuggestionPreview = ({ selected: boolean; showTitleAsLabel?: boolean; onRender: () => void; + wrapSuggestions?: boolean; }) => { return ( - +
    selectFramePublicAPI(state, datasourceMap)); const changesApplied = useLensSelector(selectChangesApplied); // get user's selection from localStorage, this key defines if the suggestions panel will be hidden or not + const initialAccordionStatusValue = + typeof isAccordionOpen !== 'undefined' ? !Boolean(isAccordionOpen) : false; const [hideSuggestions, setHideSuggestions] = useLocalStorage( LOCAL_STORAGE_SUGGESTIONS_PANEL, - false + initialAccordionStatusValue ); + useEffect(() => { + if (typeof isAccordionOpen !== 'undefined') { + setHideSuggestions(!Boolean(isAccordionOpen)); + } + }, [isAccordionOpen, setHideSuggestions]); const toggleSuggestions = useCallback(() => { setHideSuggestions(!hideSuggestions); - }, [setHideSuggestions, hideSuggestions]); + toggleAccordionCb?.(!hideSuggestions); + }, [setHideSuggestions, hideSuggestions, toggleAccordionCb]); const missingIndexPatterns = getMissingIndexPattern( activeDatasourceId ? datasourceMap[activeDatasourceId] : null, @@ -304,8 +338,10 @@ export function SuggestionPanel({ ), })); - const hasErrors = - getUserMessages(['visualization', 'visualizationInEditor'], { severity: 'error' }).length > 0; + const hasErrors = getUserMessages + ? getUserMessages(['visualization', 'visualizationInEditor'], { severity: 'error' }).length > + 0 + : false; const newStateExpression = currentVisualization.state && currentVisualization.activeId && !hasErrors @@ -450,6 +486,7 @@ export function SuggestionPanel({ selected={lastSelectedSuggestion === -1} showTitleAsLabel onRender={() => onSuggestionRender(0)} + wrapSuggestions={wrapSuggestions} /> )} {!hideSuggestions && @@ -474,64 +511,88 @@ export function SuggestionPanel({ selected={index === lastSelectedSuggestion} onRender={() => onSuggestionRender(index + 1)} showTitleAsLabel={showOnlyIcons} + wrapSuggestions={wrapSuggestions} /> ); })} ); }; - + const title = ( + +

    + +

    +
    + ); return ( -
    - -

    - -

    - - } - forceState={hideSuggestions ? 'closed' : 'open'} - onToggle={toggleSuggestions} - extraAction={ - existsStagedPreview && - !hideSuggestions && ( - - { - dispatchLens(submitSuggestion()); - }} - > - {i18n.translate('xpack.lens.sugegstion.refreshSuggestionLabel', { - defaultMessage: 'Refresh', + + {existsStagedPreview && ( + - - ) - } + > + { + dispatchLens(submitSuggestion()); + }} + > + {i18n.translate('xpack.lens.sugegstion.refreshSuggestionLabel', { + defaultMessage: 'Refresh', + })} + + + )} + {wrapSuggestions && ( + + {suggestions.length + 1} + + )} + + ) + } + > +
    -
    - {changesApplied ? renderSuggestionsUI() : renderApplyChangesPrompt()} -
    - -
    + {changesApplied ? renderSuggestionsUI() : renderApplyChangesPrompt()} +
    + ); } diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss index 391361570d04b..2c0d374a7d07f 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.scss @@ -149,3 +149,10 @@ 75% { transform: translateY(15%); } 100% { transform: translateY(10%); } } + +.lnsVisualizationToolbar--fixed { + position: fixed; + width: 100%; + z-index: 1; + background-color: $euiColorLightestShade; +} diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx index ea2c8d27086fb..f5ee47cbcd294 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/workspace_panel_wrapper.tsx @@ -53,10 +53,11 @@ export interface WorkspacePanelWrapperProps { export function VisualizationToolbar(props: { activeVisualization: Visualization | null; framePublicAPI: FramePublicAPI; + isFixedPosition?: boolean; }) { const dispatchLens = useLensDispatch(); const visualization = useLensSelector(selectVisualizationState); - const { activeVisualization } = props; + const { activeVisualization, isFixedPosition } = props; const setVisualizationState = useCallback( (newState: unknown) => { if (!activeVisualization) { @@ -77,7 +78,12 @@ export function VisualizationToolbar(props: { return ( <> {ToolbarComponent && ( - + {ToolbarComponent({ frame: props.framePublicAPI, state: visualization.state, diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index b9d0bae197909..16d730139c14a 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -176,7 +176,6 @@ interface LensBaseEmbeddableInput extends EmbeddableInput { onTableRowClick?: ( data: Simplify ) => void; - shouldShowLegendAction?: (actionId: string) => boolean; } export type LensByValueInput = { @@ -748,7 +747,11 @@ export class Embeddable * Gets the Lens embeddable's datasource and visualization states * updates the embeddable input */ - async updateVisualization(datasourceState: unknown, visualizationState: unknown) { + async updateVisualization( + datasourceState: unknown, + visualizationState: unknown, + visualizationType?: string + ) { const viz = this.savedVis; const activeDatasourceId = (this.activeDatasourceId ?? 'formBased') as EditLensConfigurationProps['datasourceId']; @@ -770,7 +773,7 @@ export class Embeddable ), visualizationState, activeVisualization: this.activeVisualizationId - ? this.deps.visualizationMap[this.activeVisualizationId] + ? this.deps.visualizationMap[visualizationType ?? this.activeVisualizationId] : undefined, }); const attrs = { @@ -781,6 +784,7 @@ export class Embeddable datasourceStates, }, references, + visualizationType: visualizationType ?? viz.visualizationType, }; /** @@ -796,6 +800,15 @@ export class Embeddable } } + async updateSuggestion(attrs: LensSavedObjectAttributes) { + const viz = this.savedVis; + const newViz = { + ...viz, + ...attrs, + }; + this.updateInput({ attributes: newViz }); + } + /** * Callback which allows the navigation to the editor. * Used for the Edit in Lens link inside the inline editing flyout. @@ -849,6 +862,7 @@ export class Embeddable ); } @@ -1110,7 +1125,6 @@ export class Embeddable }} noPadding={this.visDisplayOptions.noPadding} docLinks={this.deps.coreStart.docLinks} - shouldShowLegendAction={input.shouldShowLegendAction} /> (a.order ?? Infinity) - (b.order ?? Infinity)) .map((action) => ({ id: action.id, + type: action.type, iconType: action.getIconType({ embeddable, data, trigger: cellValueTrigger })!, displayName: action.getDisplayName({ embeddable, data, trigger: cellValueTrigger }), execute: (cellData) => diff --git a/x-pack/plugins/lens/public/embeddable/expression_wrapper.tsx b/x-pack/plugins/lens/public/embeddable/expression_wrapper.tsx index 75b141514f20c..82205c5b5990e 100644 --- a/x-pack/plugins/lens/public/embeddable/expression_wrapper.tsx +++ b/x-pack/plugins/lens/public/embeddable/expression_wrapper.tsx @@ -47,7 +47,6 @@ export interface ExpressionWrapperProps { lensInspector: LensInspector; noPadding?: boolean; docLinks: CoreStart['docLinks']; - shouldShowLegendAction?: (actionId: string) => boolean; } export function ExpressionWrapper({ @@ -74,7 +73,6 @@ export function ExpressionWrapper({ lensInspector, noPadding, docLinks, - shouldShowLegendAction, }: ExpressionWrapperProps) { if (!expression) return null; return ( @@ -106,7 +104,6 @@ export function ExpressionWrapper({ onEvent={handleEvent} hasCompatibleActions={hasCompatibleActions} getCompatibleCellValueActions={getCompatibleCellValueActions} - shouldShowLegendAction={shouldShowLegendAction} />
    diff --git a/x-pack/plugins/lens/public/mocks/dataview_mock.ts b/x-pack/plugins/lens/public/mocks/dataview_mock.ts new file mode 100644 index 0000000000000..880b9a3f287db --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/dataview_mock.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DataView } from '@kbn/data-views-plugin/public'; +import { buildDataViewMock } from '@kbn/discover-utils/src/__mocks__'; + +const fields = [ + { + name: '_index', + type: 'string', + scripted: false, + filterable: true, + }, + { + name: '@timestamp', + displayName: 'timestamp', + type: 'date', + scripted: false, + filterable: true, + aggregatable: true, + sortable: true, + }, + { + name: 'message', + displayName: 'message', + type: 'string', + scripted: false, + filterable: false, + }, + { + name: 'extension', + displayName: 'extension', + type: 'string', + scripted: false, + filterable: true, + aggregatable: true, + }, + { + name: 'bytes', + displayName: 'bytes', + type: 'number', + scripted: false, + filterable: true, + aggregatable: true, + }, +] as DataView['fields']; + +export const mockDataViewWithTimefield = buildDataViewMock({ + name: 'index-pattern-with-timefield', + fields, + timeFieldName: '%timestamp', +}); diff --git a/x-pack/plugins/lens/public/mocks/index.ts b/x-pack/plugins/lens/public/mocks/index.ts index 6cc3ff02ff92e..f90ecc9b99fe9 100644 --- a/x-pack/plugins/lens/public/mocks/index.ts +++ b/x-pack/plugins/lens/public/mocks/index.ts @@ -29,6 +29,8 @@ export { renderWithReduxStore, } from './store_mocks'; export { lensPluginMock } from './lens_plugin_mock'; +export { mockDataViewWithTimefield } from './dataview_mock'; +export { mockAllSuggestions } from './suggestions_mock'; export type FrameMock = jest.Mocked; diff --git a/x-pack/plugins/lens/public/mocks/suggestions_mock.ts b/x-pack/plugins/lens/public/mocks/suggestions_mock.ts new file mode 100644 index 0000000000000..0ed32fbfd84da --- /dev/null +++ b/x-pack/plugins/lens/public/mocks/suggestions_mock.ts @@ -0,0 +1,291 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { Suggestion } from '../types'; + +export const currentSuggestionMock = { + title: 'Heat map', + hide: false, + score: 0.6, + previewIcon: 'heatmap', + visualizationId: 'lnsHeatmap', + visualizationState: { + shape: 'heatmap', + layerId: '46aa21fa-b747-4543-bf90-0b40007c546d', + layerType: 'data', + legend: { + isVisible: true, + position: 'right', + type: 'heatmap_legend', + }, + gridConfig: { + type: 'heatmap_grid', + isCellLabelVisible: false, + isYAxisLabelVisible: true, + isXAxisLabelVisible: true, + isYAxisTitleVisible: false, + isXAxisTitleVisible: false, + }, + valueAccessor: '5b9b8b76-0836-4a12-b9c0-980c9900502f', + xAccessor: '81e332d6-ee37-42a8-a646-cea4fc75d2d3', + }, + keptLayerIds: ['46aa21fa-b747-4543-bf90-0b40007c546d'], + datasourceState: { + layers: { + '46aa21fa-b747-4543-bf90-0b40007c546d': { + index: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', + query: { + esql: 'FROM kibana_sample_data_flights | keep Dest, AvgTicketPrice', + }, + columns: [ + { + columnId: '81e332d6-ee37-42a8-a646-cea4fc75d2d3', + fieldName: 'Dest', + meta: { + type: 'string', + }, + }, + { + columnId: '5b9b8b76-0836-4a12-b9c0-980c9900502f', + fieldName: 'AvgTicketPrice', + meta: { + type: 'number', + }, + }, + ], + allColumns: [ + { + columnId: '81e332d6-ee37-42a8-a646-cea4fc75d2d3', + fieldName: 'Dest', + meta: { + type: 'string', + }, + }, + { + columnId: '5b9b8b76-0836-4a12-b9c0-980c9900502f', + fieldName: 'AvgTicketPrice', + meta: { + type: 'number', + }, + }, + ], + timeField: 'timestamp', + }, + }, + fieldList: [], + indexPatternRefs: [], + initialContext: { + dataViewSpec: { + id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', + version: 'WzM1ODA3LDFd', + title: 'kibana_sample_data_flights', + timeFieldName: 'timestamp', + sourceFilters: [], + fields: { + AvgTicketPrice: { + count: 0, + name: 'AvgTicketPrice', + type: 'number', + esTypes: ['float'], + scripted: false, + searchable: true, + aggregatable: true, + readFromDocValues: true, + format: { + id: 'number', + params: { + pattern: '$0,0.[00]', + }, + }, + shortDotsEnable: false, + isMapped: true, + }, + Dest: { + count: 0, + name: 'Dest', + type: 'string', + esTypes: ['keyword'], + scripted: false, + searchable: true, + aggregatable: true, + readFromDocValues: true, + format: { + id: 'string', + }, + shortDotsEnable: false, + isMapped: true, + }, + timestamp: { + count: 0, + name: 'timestamp', + type: 'date', + esTypes: ['date'], + scripted: false, + searchable: true, + aggregatable: true, + readFromDocValues: true, + format: { + id: 'date', + }, + shortDotsEnable: false, + isMapped: true, + }, + }, + allowNoIndex: false, + name: 'Kibana Sample Data Flights', + }, + fieldName: '', + contextualFields: ['Dest', 'AvgTicketPrice'], + query: { + esql: 'FROM "kibana_sample_data_flights"', + }, + }, + }, + datasourceId: 'textBased', + columns: 2, + changeType: 'initial', +} as Suggestion; + +export const mockAllSuggestions = [ + currentSuggestionMock, + { + title: 'Donut', + score: 0.46, + visualizationId: 'lnsPie', + previewIcon: 'pie', + visualizationState: { + shape: 'donut', + layers: [ + { + layerId: '2513a3d4-ad9d-48ea-bd58-8b6419ab97e6', + primaryGroups: ['923f0681-3fe1-4987-aa27-d9c91fb95fa6'], + metrics: ['b5f41c04-4bca-4abe-ae5c-b1d4d6fb00e0'], + numberDisplay: 'percent', + categoryDisplay: 'default', + legendDisplay: 'default', + nestedLegend: false, + layerType: 'data', + }, + ], + }, + keptLayerIds: ['2513a3d4-ad9d-48ea-bd58-8b6419ab97e6'], + datasourceState: { + layers: { + '2513a3d4-ad9d-48ea-bd58-8b6419ab97e6': { + index: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', + query: { + esql: 'FROM "kibana_sample_data_flights"', + }, + columns: [ + { + columnId: '923f0681-3fe1-4987-aa27-d9c91fb95fa6', + fieldName: 'Dest', + meta: { + type: 'string', + }, + }, + { + columnId: 'b5f41c04-4bca-4abe-ae5c-b1d4d6fb00e0', + fieldName: 'AvgTicketPrice', + meta: { + type: 'number', + }, + }, + ], + allColumns: [ + { + columnId: '923f0681-3fe1-4987-aa27-d9c91fb95fa6', + fieldName: 'Dest', + meta: { + type: 'string', + }, + }, + { + columnId: 'b5f41c04-4bca-4abe-ae5c-b1d4d6fb00e0', + fieldName: 'AvgTicketPrice', + meta: { + type: 'number', + }, + }, + ], + timeField: 'timestamp', + }, + }, + fieldList: [], + indexPatternRefs: [], + initialContext: { + dataViewSpec: { + id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', + version: 'WzM1ODA3LDFd', + title: 'kibana_sample_data_flights', + timeFieldName: 'timestamp', + sourceFilters: [], + fields: { + AvgTicketPrice: { + count: 0, + name: 'AvgTicketPrice', + type: 'number', + esTypes: ['float'], + scripted: false, + searchable: true, + aggregatable: true, + readFromDocValues: true, + format: { + id: 'number', + params: { + pattern: '$0,0.[00]', + }, + }, + shortDotsEnable: false, + isMapped: true, + }, + Dest: { + count: 0, + name: 'Dest', + type: 'string', + esTypes: ['keyword'], + scripted: false, + searchable: true, + aggregatable: true, + readFromDocValues: true, + format: { + id: 'string', + }, + shortDotsEnable: false, + isMapped: true, + }, + timestamp: { + count: 0, + name: 'timestamp', + type: 'date', + esTypes: ['date'], + scripted: false, + searchable: true, + aggregatable: true, + readFromDocValues: true, + format: { + id: 'date', + }, + shortDotsEnable: false, + isMapped: true, + }, + }, + typeMeta: {}, + allowNoIndex: false, + name: 'Kibana Sample Data Flights', + }, + fieldName: '', + contextualFields: ['Dest', 'AvgTicketPrice'], + query: { + esql: 'FROM "kibana_sample_data_flights"', + }, + }, + }, + datasourceId: 'textBased', + columns: 2, + changeType: 'unchanged', + } as Suggestion, +]; diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss index 56cfe41c4b889..6572fd969a5be 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.scss @@ -1,6 +1,7 @@ // styles needed to display extra drop targets that are outside of the config panel main area while also allowing to scroll vertically .lnsConfigPanel__overlay { clip-path: polygon(-100% 0, 100% 0, 100% 100%, -100% 100%); + background: $euiColorLightestShade; .kbnOverlayMountWrapper { padding-left: $euiFormMaxWidth; margin-left: -$euiFormMaxWidth; diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts index b1647876581fd..8fd011fddfb2e 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts @@ -52,6 +52,7 @@ export async function executeAction({ embeddable, startDependencies, overlays, t size: 's', 'data-test-subj': 'customizeLens', type: 'push', + paddingSize: 'm', hideCloseButton: true, onClose: (overlayRef) => { if (overlayTracker) overlayTracker.clearOverlays(); diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 6ac2b98569d7f..e5c9fad96d6ca 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -198,6 +198,8 @@ export interface TableSuggestion { * The change type indicates what was changed in this table compared to the currently active table of this layer. */ changeType: TableChangeType; + + notAssignedMetrics?: boolean; } /** @@ -509,6 +511,8 @@ export interface Datasource { ) => Promise; injectReferencesToLayers?: (state: T, references?: SavedObjectReference[]) => T; + + suggestsLimitedColumns?: (state: T) => boolean; } export interface DatasourceFixAction { @@ -746,6 +750,7 @@ export interface OperationMetadata { export interface OperationDescriptor extends Operation { hasTimeShift: boolean; hasReducedTimeRange: boolean; + inMetricDimension?: boolean; } export interface VisualizationConfigProps { @@ -882,6 +887,7 @@ export interface SuggestionRequest { subVisualizationId?: string; activeData?: Record; allowMixed?: boolean; + datasourceId?: string; } /** @@ -1416,6 +1422,7 @@ export type LensTopNavMenuEntryGenerator = (props: { export interface LensCellValueAction { id: string; iconType: string; + type?: string; displayName: string; execute: (data: CellValueContext['data']) => void; } diff --git a/x-pack/plugins/lens/public/vis_type_alias.ts b/x-pack/plugins/lens/public/vis_type_alias.ts index 2fc493df38edc..20822ee76a094 100644 --- a/x-pack/plugins/lens/public/vis_type_alias.ts +++ b/x-pack/plugins/lens/public/vis_type_alias.ts @@ -11,8 +11,10 @@ import { getBasePath, getEditPath } from '../common/constants'; import { getLensClient } from './persistence/lens_client'; export const getLensAliasConfig = (): VisTypeAlias => ({ - aliasPath: getBasePath(), - aliasApp: 'lens', + alias: { + path: getBasePath(), + app: 'lens', + }, name: 'lens', promotion: true, title: i18n.translate('xpack.lens.visTypeAlias.title', { @@ -41,8 +43,7 @@ export const getLensAliasConfig = (): VisTypeAlias => ({ title, description, updatedAt, - editUrl: getEditPath(id), - editApp: 'lens', + editor: { editUrl: getEditPath(id), editApp: 'lens' }, icon: 'lensApp', stage: 'production', savedObjectType: type, diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/columns.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/columns.tsx index 51aa500bbfebf..c31486d0a0f05 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/columns.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/columns.tsx @@ -19,10 +19,15 @@ import type { DatatableColumnMeta, } from '@kbn/expressions-plugin/common'; import { EuiDataGridColumnCellAction } from '@elastic/eui/src/components/datagrid/data_grid_types'; +import { FILTER_CELL_ACTION_TYPE } from '@kbn/cell-actions/constants'; import type { FormatFactory } from '../../../../common/types'; import type { ColumnConfig } from '../../../../common/expressions'; import { LensCellValueAction } from '../../../types'; +const hasFilterCellAction = (actions: LensCellValueAction[]) => { + return actions.some(({ type }) => type === FILTER_CELL_ACTION_TYPE); +}; + export const createGridColumns = ( bucketColumns: string[], table: Datatable, @@ -81,7 +86,16 @@ export const createGridColumns = ( const columnArgs = columnConfig.columns.find(({ columnId }) => columnId === field); const cellActions: EuiDataGridColumnCellAction[] = []; - if (filterable && handleFilterClick && !columnArgs?.oneClickFilter) { + + // compatible cell actions from actions registry + const compatibleCellActions = columnCellValueActions?.[colIndex] ?? []; + + if ( + !hasFilterCellAction(compatibleCellActions) && + filterable && + handleFilterClick && + !columnArgs?.oneClickFilter + ) { cellActions.push( ({ rowIndex, columnId, Component }: EuiDataGridColumnCellActionProps) => { const { rowValue, contentsIsDefined, cellContent } = getContentData({ @@ -166,8 +180,6 @@ export const createGridColumns = ( ); } - // Add all the column compatible cell actions - const compatibleCellActions = columnCellValueActions?.[colIndex] ?? []; compatibleCellActions.forEach((action) => { cellActions.push(({ rowIndex, columnId, Component }: EuiDataGridColumnCellActionProps) => { const rowValue = table.rows[rowIndex][columnId]; diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx index a6810e77d4388..a3f4f6f797ee1 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.test.tsx @@ -138,6 +138,26 @@ describe('Datatable Visualization', () => { expect(suggestions.length).toBeGreaterThan(0); }); + it('should force table as suggestion when there are no number fields', () => { + const suggestions = datatableVisualization.getSuggestions({ + state: { + layerId: 'first', + layerType: LayerTypes.DATA, + columns: [{ columnId: 'col1' }], + }, + table: { + isMultiRow: true, + layerId: 'first', + changeType: 'initial', + columns: [strCol('col1'), strCol('col2')], + notAssignedMetrics: true, + }, + keptLayerIds: [], + }); + + expect(suggestions.length).toBeGreaterThan(0); + }); + it('should reject suggestion with static value', () => { function staticValueCol(columnId: string): TableSuggestionColumn { return { @@ -387,6 +407,48 @@ describe('Datatable Visualization', () => { }).groups[2].accessors ).toEqual([{ columnId: 'c' }, { columnId: 'b' }]); }); + + it('should compute the groups correctly for text based languages', () => { + const datasource = createMockDatasource('textBased', { + isTextBasedLanguage: jest.fn(() => true), + }); + datasource.publicAPIMock.getTableSpec.mockReturnValue([ + { columnId: 'c', fields: [] }, + { columnId: 'b', fields: [] }, + ]); + const frame = mockFrame(); + frame.datasourceLayers = { first: datasource.publicAPIMock }; + + const groups = datatableVisualization.getConfiguration({ + layerId: 'first', + state: { + layerId: 'first', + layerType: LayerTypes.DATA, + columns: [{ columnId: 'b', isMetric: true }, { columnId: 'c' }], + }, + frame, + }).groups; + + // rows + expect(groups[0].accessors).toEqual([ + { + columnId: 'c', + triggerIconType: undefined, + }, + ]); + + // columns + expect(groups[1].accessors).toEqual([]); + + // metrics + expect(groups[2].accessors).toEqual([ + { + columnId: 'b', + triggerIconType: undefined, + palette: undefined, + }, + ]); + }); }); describe('#removeDimension', () => { @@ -462,7 +524,11 @@ describe('Datatable Visualization', () => { ).toEqual({ layerId: 'layer1', layerType: LayerTypes.DATA, - columns: [{ columnId: 'b' }, { columnId: 'c' }, { columnId: 'd', isTransposed: false }], + columns: [ + { columnId: 'b' }, + { columnId: 'c' }, + { columnId: 'd', isTransposed: false, isMetric: false }, + ], }); }); @@ -482,7 +548,7 @@ describe('Datatable Visualization', () => { ).toEqual({ layerId: 'layer1', layerType: LayerTypes.DATA, - columns: [{ columnId: 'b', isTransposed: false }, { columnId: 'c' }], + columns: [{ columnId: 'b', isTransposed: false, isMetric: false }, { columnId: 'c' }], }); }); }); diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx index 35757771af754..505b20bdc3e58 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx @@ -165,11 +165,14 @@ export const getDatatableVisualization = ({ ? 0.5 : 1; + // forcing datatable as a suggestion when there are no metrics (number fields) + const forceSuggestion = Boolean(table?.notAssignedMetrics); + return [ { title, // table with >= 10 columns will have a score of 0.4, fewer columns reduce score - score: (Math.min(table.columns.length, 10) / 10) * 0.4 * changeFactor, + score: forceSuggestion ? 1 : (Math.min(table.columns.length, 10) / 10) * 0.4 * changeFactor, state: { ...(state || {}), layerId: table.layerId, @@ -187,6 +190,13 @@ export const getDatatableVisualization = ({ ]; }, + /* + Datatable works differently on text based datasource and form based + - Form based: It relies on the isBucketed flag to identify groups. It allows only numeric fields + on the Metrics dimension + - Text based: It relies on the isMetric flag to identify groups. It allows all type of fields + on the Metric dimension in cases where there are no numeric columns + **/ getConfiguration({ state, frame, layerId }) { const { sortedColumns, datasource } = getDataSourceAndSortedColumns(state, frame.datasourceLayers, layerId) || {}; @@ -199,9 +209,11 @@ export const getDatatableVisualization = ({ if (!sortedColumns) { return { groups: [] }; } + const isTextBasedLanguage = datasource?.isTextBasedLanguage(); return { groups: [ + // In this group we get columns that are not transposed and are not on the metric dimension { groupId: 'rows', groupLabel: i18n.translate('xpack.lens.datatable.breakdownRows', { @@ -216,11 +228,17 @@ export const getDatatableVisualization = ({ }), layerId: state.layerId, accessors: sortedColumns - .filter( - (c) => - datasource!.getOperationForColumnId(c)?.isBucketed && - !state.columns.find((col) => col.columnId === c)?.isTransposed - ) + .filter((c) => { + const column = state.columns.find((col) => col.columnId === c); + if (isTextBasedLanguage) { + return ( + !datasource!.getOperationForColumnId(c)?.inMetricDimension && + !column?.isMetric && + !column?.isTransposed + ); + } + return datasource!.getOperationForColumnId(c)?.isBucketed && !column?.isTransposed; + }) .map((accessor) => ({ columnId: accessor, triggerIconType: columnMap[accessor].hidden @@ -236,6 +254,7 @@ export const getDatatableVisualization = ({ hideGrouping: true, nestingOrder: 1, }, + // In this group we get columns that are transposed and are not on the metric dimension { groupId: 'columns', groupLabel: i18n.translate('xpack.lens.datatable.breakdownColumns', { @@ -250,11 +269,15 @@ export const getDatatableVisualization = ({ }), layerId: state.layerId, accessors: sortedColumns - .filter( - (c) => + .filter((c) => { + if (isTextBasedLanguage) { + return state.columns.find((col) => col.columnId === c)?.isTransposed; + } + return ( datasource!.getOperationForColumnId(c)?.isBucketed && state.columns.find((col) => col.columnId === c)?.isTransposed - ) + ); + }) .map((accessor) => ({ columnId: accessor })), supportsMoreColumns: true, filterOperations: (op) => op.isBucketed, @@ -263,6 +286,7 @@ export const getDatatableVisualization = ({ hideGrouping: true, nestingOrder: 0, }, + // In this group we get columns are on the metric dimension { groupId: 'metrics', groupLabel: i18n.translate('xpack.lens.datatable.metrics', { @@ -278,7 +302,16 @@ export const getDatatableVisualization = ({ }, layerId: state.layerId, accessors: sortedColumns - .filter((c) => !datasource!.getOperationForColumnId(c)?.isBucketed) + .filter((c) => { + const operation = datasource!.getOperationForColumnId(c); + if (isTextBasedLanguage) { + return ( + operation?.inMetricDimension || + state.columns.find((col) => col.columnId === c)?.isMetric + ); + } + return !operation?.isBucketed; + }) .map((accessor) => { const columnConfig = columnMap[accessor]; const stops = columnConfig?.palette?.params?.stops; @@ -316,7 +349,12 @@ export const getDatatableVisualization = ({ ...prevState, columns: prevState.columns.map((column) => { if (column.columnId === columnId || column.columnId === previousColumn) { - return { ...column, columnId, isTransposed: groupId === 'columns' }; + return { + ...column, + columnId, + isTransposed: groupId === 'columns', + isMetric: groupId === 'metrics', + }; } return column; }), @@ -324,7 +362,10 @@ export const getDatatableVisualization = ({ } return { ...prevState, - columns: [...prevState.columns, { columnId, isTransposed: groupId === 'columns' }], + columns: [ + ...prevState.columns, + { columnId, isTransposed: groupId === 'columns', isMetric: groupId === 'metrics' }, + ], }; }, removeDimension({ prevState, columnId }) { @@ -371,9 +412,11 @@ export const getDatatableVisualization = ({ ): Ast | null { const { sortedColumns, datasource } = getDataSourceAndSortedColumns(state, datasourceLayers, state.layerId) || {}; + const isTextBasedLanguage = datasource?.isTextBasedLanguage(); if ( sortedColumns?.length && + !isTextBasedLanguage && sortedColumns.filter((c) => !datasource!.getOperationForColumnId(c)?.isBucketed).length === 0 ) { return null; @@ -435,6 +478,15 @@ export const getDatatableVisualization = ({ const canColor = datasource!.getOperationForColumnId(column.columnId)?.dataType === 'number'; + let isTransposable = + !isTextBasedLanguage && + !datasource!.getOperationForColumnId(column.columnId)?.isBucketed; + + if (isTextBasedLanguage) { + const operation = datasource!.getOperationForColumnId(column.columnId); + isTransposable = Boolean(column?.isMetric || operation?.inMetricDimension); + } + const datatableColumnFn = buildExpressionFunction( 'lens_datatable_column', { @@ -443,8 +495,7 @@ export const getDatatableVisualization = ({ oneClickFilter: column.oneClickFilter, width: column.width, isTransposed: column.isTransposed, - transposable: !datasource!.getOperationForColumnId(column.columnId)?.isBucketed, - alignment: column.alignment, + transposable: isTransposable, colorMode: canColor && column.colorMode ? column.colorMode : 'none', palette: paletteService.get(CUSTOM_PALETTE).toExpression(paletteParams), summaryRow: hasNoSummaryRow ? undefined : column.summaryRow!, diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.test.ts index ff631ee605a59..8a89bca65a2d9 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.test.ts @@ -305,6 +305,70 @@ describe('heatmap suggestions', () => { }, ]); }); + + test('when no metric dimension but groups', () => { + expect( + getSuggestions({ + table: { + layerId: 'first', + isMultiRow: true, + columns: [ + { + columnId: 'date-column', + operation: { + isBucketed: true, + dataType: 'date', + scale: 'interval', + label: 'Date', + }, + }, + { + columnId: 'string-column-01', + operation: { + isBucketed: true, + dataType: 'string', + label: 'Bucket 1', + }, + }, + ], + changeType: 'initial', + }, + state: { + layerId: 'first', + layerType: LayerTypes.DATA, + } as HeatmapVisualizationState, + keptLayerIds: ['first'], + }) + ).toEqual([ + { + state: { + layerId: 'first', + layerType: LayerTypes.DATA, + shape: 'heatmap', + xAccessor: 'date-column', + yAccessor: 'string-column-01', + gridConfig: { + type: HEATMAP_GRID_FUNCTION, + isCellLabelVisible: false, + isYAxisLabelVisible: true, + isXAxisLabelVisible: true, + isYAxisTitleVisible: false, + isXAxisTitleVisible: false, + }, + legend: { + isVisible: true, + position: Position.Right, + type: LEGEND_FUNCTION, + }, + }, + title: 'Heat map', + hide: true, + incomplete: true, + previewIcon: IconChartHeatmap, + score: 0, + }, + ]); + }); test('for tables with a single bucket dimension', () => { expect( getSuggestions({ diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.ts b/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.ts index ccb9c1014c25b..3f748485bdb03 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/heatmap/suggestions.ts @@ -61,6 +61,7 @@ export const getSuggestions: Visualization['getSugges const isSingleBucketDimension = groups.length === 1 && metrics.length === 0; const isOnlyMetricDimension = groups.length === 0 && metrics.length === 1; + const isOnlyBucketDimension = groups.length > 0 && metrics.length === 0; /** * Hide for: @@ -77,6 +78,7 @@ export const getSuggestions: Visualization['getSugges table.changeType === 'reorder' || isSingleBucketDimension || hasOnlyDatehistogramBuckets || + isOnlyBucketDimension || isOnlyMetricDimension; const newState: HeatmapVisualizationState = { @@ -130,7 +132,7 @@ export const getSuggestions: Visualization['getSugges hide, previewIcon: IconChartHeatmap, score: Number(score.toFixed(1)), - incomplete: isSingleBucketDimension || isOnlyMetricDimension, + incomplete: isSingleBucketDimension || isOnlyMetricDimension || isOnlyBucketDimension, }, ]; }; diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts index e1803e106f2eb..e4b4dc1879456 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.test.ts @@ -98,6 +98,7 @@ describe('metric_suggestions', () => { ).map((table) => expect(getSuggestions({ table, keptLayerIds: ['l1'] })).toEqual([])) ); }); + test('does not suggest for a static value', () => { const suggestion = getSuggestions({ table: { @@ -133,6 +134,29 @@ describe('metric_suggestions', () => { expect(suggestion).toHaveLength(0); }); + + test('does not suggest for text based languages', () => { + const col = { + columnId: 'id', + operation: { + dataType: 'number', + label: `Top values`, + isBucketed: false, + }, + } as const; + const suggestion = getSuggestions({ + table: { + columns: [col], + isMultiRow: false, + layerId: 'l1', + changeType: 'unchanged', + }, + keptLayerIds: [], + datasourceId: 'textBased', + }); + + expect(suggestion).toHaveLength(0); + }); test('suggests a basic metric chart', () => { const [suggestion, ...rest] = getSuggestions({ table: { diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts index c48e463ec83df..7e00322fedcd6 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_suggestions.ts @@ -20,6 +20,7 @@ export function getSuggestions({ table, state, keptLayerIds, + datasourceId, }: SuggestionRequest): Array> { // We only render metric charts for single-row queries. We require a single, numeric column. if ( @@ -39,6 +40,11 @@ export function getSuggestions({ return []; } + // do not return the legacy metric vis for the textbased mode (i.e. ES|QL) + if (datasourceId === 'textBased') { + return []; + } + return [getSuggestion(table)]; } diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 12f737244bcb0..8af19f218fee9 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -90,7 +90,10 @@ "@kbn/search-response-warnings", "@kbn/logging", "@kbn/core-plugins-server", + "@kbn/text-based-languages", "@kbn/field-utils", + "@kbn/discover-utils", + "@kbn/cell-actions", "@kbn/shared-ux-button-toolbar" ], "exclude": [ diff --git a/x-pack/plugins/licensing/public/plugin.test.ts b/x-pack/plugins/licensing/public/plugin.test.ts index 9804f1ba8e1b7..5c571d0c6a40b 100644 --- a/x-pack/plugins/licensing/public/plugin.test.ts +++ b/x-pack/plugins/licensing/public/plugin.test.ts @@ -16,7 +16,6 @@ import { License } from '../common/license'; import { licenseMock } from '../common/licensing.mock'; import { coreMock } from '@kbn/core/public/mocks'; import { HttpInterceptor } from '@kbn/core/public'; -import type { AnalyticsServiceSetup } from '@kbn/core-analytics-browser'; const coreStart = coreMock.createStart(); describe('licensing plugin', () => { @@ -443,69 +442,5 @@ describe('licensing plugin', () => { expect(removeInterceptorMock).toHaveBeenCalledTimes(1); }); - - it('registers the subscription upsell events', async () => { - const sessionStorage = coreMock.createStorage(); - plugin = new LicensingPlugin(coreMock.createPluginInitializerContext(), sessionStorage); - - const coreSetup = coreMock.createSetup(); - - await plugin.setup(coreSetup); - await plugin.stop(); - - expect(findRegisteredEventTypeByName('subscription__upsell__click', coreSetup.analytics)) - .toMatchInlineSnapshot(` - Array [ - Object { - "eventType": "subscription__upsell__click", - "schema": Object { - "feature": Object { - "_meta": Object { - "description": "A human-readable identifier describing the feature that is being promoted", - }, - "type": "keyword", - }, - "source": Object { - "_meta": Object { - "description": "A human-readable identifier describing the location of the beginning of the subscription flow", - }, - "type": "keyword", - }, - }, - }, - ] - `); - expect(findRegisteredEventTypeByName('subscription__upsell__impression', coreSetup.analytics)) - .toMatchInlineSnapshot(` - Array [ - Object { - "eventType": "subscription__upsell__impression", - "schema": Object { - "feature": Object { - "_meta": Object { - "description": "A human-readable identifier describing the feature that is being promoted", - }, - "type": "keyword", - }, - "source": Object { - "_meta": Object { - "description": "A human-readable identifier describing the location of the beginning of the subscription flow", - }, - "type": "keyword", - }, - }, - }, - ] - `); - }); }); }); - -function findRegisteredEventTypeByName( - eventTypeName: string, - analyticsClientMock: jest.Mocked -) { - return analyticsClientMock.registerEventType.mock.calls.find( - ([{ eventType }]) => eventType === eventTypeName - )!; -} diff --git a/x-pack/plugins/licensing/public/plugin.ts b/x-pack/plugins/licensing/public/plugin.ts index bc350675d7dd2..3953a29a08214 100644 --- a/x-pack/plugins/licensing/public/plugin.ts +++ b/x-pack/plugins/licensing/public/plugin.ts @@ -8,7 +8,6 @@ import { Observable, Subject, Subscription } from 'rxjs'; import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; -import { registerEvents as registerSubscriptionTrackingEvents } from '@kbn/subscription-tracking'; import { ILicense } from '../common/types'; import { LicensingPluginSetup, LicensingPluginStart } from './types'; import { createLicenseUpdate } from '../common/license_update'; @@ -85,7 +84,6 @@ export class LicensingPlugin implements Plugin { if (license.isAvailable) { diff --git a/x-pack/plugins/licensing/tsconfig.json b/x-pack/plugins/licensing/tsconfig.json index 1deb735f99466..804bf057afa6d 100644 --- a/x-pack/plugins/licensing/tsconfig.json +++ b/x-pack/plugins/licensing/tsconfig.json @@ -14,8 +14,6 @@ "@kbn/std", "@kbn/i18n", "@kbn/analytics-client", - "@kbn/subscription-tracking", - "@kbn/core-analytics-browser", "@kbn/logging-mocks" ], "exclude": ["target/**/*"] diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx b/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx index 7edcf5b53f724..5c2bfb9045688 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx +++ b/x-pack/plugins/lists/public/exceptions/components/builder/entry_renderer.test.tsx @@ -20,7 +20,7 @@ import { isOperator, matchesOperator, } from '@kbn/securitysolution-list-utils'; -import { validateFilePathInput } from '@kbn/securitysolution-utils'; +import { validatePotentialWildcardInput } from '@kbn/securitysolution-utils'; import { useFindListsBySize } from '@kbn/securitysolution-list-hooks'; import type { FieldSpec } from '@kbn/data-plugin/common'; import { fields, getField } from '@kbn/data-plugin/common/mocks'; @@ -1050,7 +1050,7 @@ describe('BuilderEntryItem', () => { test('it invokes "setWarningsExist" when invalid value in field value input', async () => { const mockSetWarningsExists = jest.fn(); - (validateFilePathInput as jest.Mock).mockReturnValue('some warning message'); + (validatePotentialWildcardInput as jest.Mock).mockReturnValue('some warning message'); wrapper = mount( { test('it does not invoke "setWarningsExist" when valid value in field value input', async () => { const mockSetWarningsExists = jest.fn(); - (validateFilePathInput as jest.Mock).mockReturnValue(undefined); + (validatePotentialWildcardInput as jest.Mock).mockReturnValue(undefined); wrapper = mount( = ({ const renderOperatorInput = (isFirst: boolean): JSX.Element => { // for event filters forms - // show extra operators for wildcards when field is `file.path.text` - const isFilePathTextField = entry.field !== undefined && entry.field.name === 'file.path.text'; + // show extra operators for wildcards when field supports matches + const doesFieldSupportMatches = entry.field !== undefined && fieldSupportsMatches(entry.field); const isEventFilterList = listType === 'endpoint_events'; const augmentedOperatorsList = - operatorsList && isFilePathTextField && isEventFilterList + operatorsList && doesFieldSupportMatches && isEventFilterList ? operatorsList : operatorsList?.filter((operator) => operator.type !== OperatorTypeEnum.WILDCARD); @@ -358,8 +359,8 @@ export const BuilderEntryItem: React.FC = ({ } }; - // show this when wildcard filename with matches operator - const getWildcardWarning = (precedingWarning: string): React.ReactNode => { + // show this when wildcard with matches operator + const getWildcardWarningInfo = (precedingWarning: string): React.ReactNode => { return (

    {precedingWarning}{' '} @@ -368,7 +369,7 @@ export const BuilderEntryItem: React.FC = ({ content={ } size="m" @@ -430,11 +431,13 @@ export const BuilderEntryItem: React.FC = ({ if (osTypes) { [os] = osTypes as OperatingSystem[]; } - const warning = validateFilePathInput({ os, value: wildcardValue }); + const warning = validatePotentialWildcardInput({ + field: entry.field?.name, + os, + value: wildcardValue, + }); actualWarning = - warning === FILENAME_WILDCARD_WARNING - ? warning && getWildcardWarning(warning) - : warning; + warning === WILDCARD_WARNING ? warning && getWildcardWarningInfo(warning) : warning; } return ( diff --git a/x-pack/plugins/lists/public/exceptions/components/builder/helpers.test.ts b/x-pack/plugins/lists/public/exceptions/components/builder/helpers.test.ts index 3cc350629ff96..ef3982166e19b 100644 --- a/x-pack/plugins/lists/public/exceptions/components/builder/helpers.test.ts +++ b/x-pack/plugins/lists/public/exceptions/components/builder/helpers.test.ts @@ -212,7 +212,7 @@ describe('Exception builder helpers', () => { expect(output).toEqual(expected); }); - test('it returns all fields unfiletered if "item.nested" is not "child" or "parent"', () => { + test('it returns all fields unfiltered if "item.nested" is not "child" or "parent"', () => { const payloadIndexPattern = getMockIndexPattern(); const payloadItem: FormattedBuilderEntry = getMockBuilderEntry(); const output = getFilteredIndexPatterns(payloadIndexPattern, payloadItem); diff --git a/x-pack/plugins/log_explorer/public/components/flyout_detail/flyout_highlights.tsx b/x-pack/plugins/log_explorer/public/components/flyout_detail/flyout_highlights.tsx index 74d65d73f23b8..e74ee0a4b8130 100644 --- a/x-pack/plugins/log_explorer/public/components/flyout_detail/flyout_highlights.tsx +++ b/x-pack/plugins/log_explorer/public/components/flyout_detail/flyout_highlights.tsx @@ -7,7 +7,10 @@ import React from 'react'; import { FlyoutContentActions } from '@kbn/discover-plugin/public'; import { DataTableRecord } from '@kbn/discover-utils/src/types'; +import { AgentIcon, CloudProvider, CloudProviderIcon } from '@kbn/custom-icons'; import { useMeasure } from 'react-use/lib'; +import { AgentName } from '@kbn/elastic-agent-utils'; +import { first } from 'lodash'; import { FlyoutDoc } from './types'; import * as constants from '../../../common/constants'; import { HighlightField } from './sub_components/highlight_field'; @@ -47,156 +50,170 @@ export function FlyoutHighlights({ }) { const [ref, dimensions] = useMeasure(); const { columns, fieldWidth } = useFlyoutColumnWidth(dimensions.width); + return ( + {/* Service highlight */} {formattedDoc[constants.SERVICE_NAME_FIELD] && ( + } + label={flyoutServiceLabel} + value={flattenedDoc[constants.SERVICE_NAME_FIELD]} width={fieldWidth} /> )} {formattedDoc[constants.TRACE_ID_FIELD] && ( )} - + {/* Infrastructure highlight */} {formattedDoc[constants.HOST_NAME_FIELD] && ( )} {formattedDoc[constants.ORCHESTRATOR_CLUSTER_NAME_FIELD] && ( )} {formattedDoc[constants.ORCHESTRATOR_RESOURCE_ID_FIELD] && ( )} - + {/* Cloud highlight */} {formattedDoc[constants.CLOUD_PROVIDER_FIELD] && ( + } + label={flyoutCloudProviderLabel} + value={flattenedDoc[constants.CLOUD_PROVIDER_FIELD]} width={fieldWidth} /> )} {formattedDoc[constants.CLOUD_REGION_FIELD] && ( )} {formattedDoc[constants.CLOUD_AVAILABILITY_ZONE_FIELD] && ( )} {formattedDoc[constants.CLOUD_PROJECT_ID_FIELD] && ( )} {formattedDoc[constants.CLOUD_INSTANCE_ID_FIELD] && ( )} - + {/* Other highlights */} {formattedDoc[constants.LOG_FILE_PATH_FIELD] && ( )} {formattedDoc[constants.DATASTREAM_NAMESPACE_FIELD] && ( )} {formattedDoc[constants.DATASTREAM_DATASET_FIELD] && ( )} {formattedDoc[constants.AGENT_NAME_FIELD] && ( )} diff --git a/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx index ca47b10548236..1034a3015cc89 100644 --- a/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx +++ b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/highlight_field.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiText, copyToClipboard } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiText, copyToClipboard, EuiTextTruncate } from '@elastic/eui'; import React, { ReactNode, useMemo, useState } from 'react'; import { HoverAction, HoverActionType } from './hover_action'; import { @@ -18,21 +18,22 @@ import { import { useDiscoverActionsContext } from '../../../hooks/use_discover_action'; interface HighlightFieldProps { - label: string | ReactNode; field: string; - value: unknown; formattedValue: string; - dataTestSubj: string; + icon?: ReactNode; + label: string | ReactNode; + value: unknown; width: number; } export function HighlightField({ - label, field, - value, formattedValue, - dataTestSubj, + icon, + label, + value, width, + ...props }: HighlightFieldProps) { const filterForText = flyoutHoverActionFilterForText(value); const filterOutText = flyoutHoverActionFilterOutText(value); @@ -89,14 +90,33 @@ export function HighlightField({ [filterForText, filterOutText, actions, field, value, columnAdded] ); return formattedValue ? ( - + {label} - + + + {icon && {icon}} + + + {(truncatedText: string) => ( + + )} + + + + ) : null; diff --git a/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/hover_action.tsx b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/hover_action.tsx index 5ed25be2b36d9..1b5883ed082e5 100644 --- a/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/hover_action.tsx +++ b/x-pack/plugins/log_explorer/public/components/flyout_detail/sub_components/hover_action.tsx @@ -7,14 +7,7 @@ import React from 'react'; -import { - EuiFlexGroup, - EuiToolTip, - EuiButtonIcon, - useEuiTheme, - EuiTextTruncate, - EuiText, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiToolTip, EuiButtonIcon, useEuiTheme, EuiFlexItem } from '@elastic/eui'; import type { IconType } from '@elastic/eui'; export interface HoverActionType { @@ -26,12 +19,11 @@ export interface HoverActionType { } interface HoverActionProps { - displayText: string; + children: React.ReactNode; actions: HoverActionType[]; - width: number; } -export const HoverAction = ({ displayText, actions, width }: HoverActionProps) => { +export const HoverAction = ({ children, actions }: HoverActionProps) => { const { euiTheme } = useEuiTheme(); return ( @@ -49,14 +41,7 @@ export const HoverAction = ({ displayText, actions, width }: HoverActionProps) = }, }} > - - {(truncatedText: string) => ( - - )} - + {children} { {aiAssistant.isEnabled() && explainLogMessageMessages ? ( - + ) : null} {aiAssistant.isEnabled() && similarLogMessageMessages ? ( - + ) : null} diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts index 7e23353460df6..105b17dcd5a21 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts @@ -27,6 +27,13 @@ import { LICENSED_FEATURES } from '../../../licensed_features'; jest.mock('../../../kibana_services'); export class MockSearchSource { + getField(fieldName: string) { + if (fieldName === 'filter') { + return []; + } + + throw new Error(`Unsupported search source field: ${fieldName}`); + } setField = jest.fn(); setParent() {} getSearchRequestBody() { @@ -324,7 +331,7 @@ describe('ESGeoGridSource', () => { index: 'foo-*', renderAs: 'heatmap', requestBody: - "(fields:('0':('0':index,'1':(fields:())),'1':('0':size,'1':0),'2':('0':filter,'1':!()),'3':('0':query),'4':('0':index,'1':(fields:())),'5':('0':query,'1':(language:KQL,query:'')),'6':('0':aggs,'1':())))", + "(fields:('0':('0':index,'1':(fields:())),'1':('0':size,'1':0),'2':('0':filter,'1':!()),'3':('0':query),'4':('0':index,'1':(fields:())),'5':('0':query,'1':(language:KQL,query:'')),'6':('0':aggs,'1':()),'7':('0':filter,'1':!((meta:(),query:(exists:(field:bar)))))))", token: '1234', }); }); diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx index 4acb400807ad0..703ab4f45b962 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx @@ -21,6 +21,7 @@ import { DataView } from '@kbn/data-plugin/common'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; import { ACTION_GLOBAL_APPLY_FILTER } from '@kbn/unified-search-plugin/public'; import { getTileUrlParams } from '@kbn/maps-vector-tile-utils'; +import { type Filter, buildExistsFilter } from '@kbn/es-query'; import { makeESBbox } from '../../../../common/elasticsearch_util'; import { convertCompositeRespToGeoJson, convertRegularRespToGeoJson } from './convert_to_geojson'; import { UpdateSourceEditor } from './update_source_editor'; @@ -553,6 +554,11 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo const dataView = await this.getIndexPattern(); const searchSource = await this.makeSearchSource(requestMeta, 0); searchSource.setField('aggs', this.getValueAggsDsl(dataView)); + // Filter out documents without geo fields for broad index-pattern support + searchSource.setField('filter', [ + ...(searchSource.getField('filter') as Filter[]), + buildExistsFilter({ name: this._descriptor.geoField, type: 'geo_point' }, dataView), + ]); const mvtUrlServicePath = getHttp().basePath.prepend( `${MVT_GETGRIDTILE_API_PATH}/{z}/{x}/{y}.pbf` diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts index 7f7fde393de91..3585150459b89 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts @@ -53,6 +53,13 @@ describe('ESSearchSource', () => { beforeEach(async () => { const mockSearchSource = { + getField: (fieldName: string) => { + if (fieldName === 'filter') { + return []; + } + + throw new Error(`Unsupported search source field: ${fieldName}`); + }, setField: jest.fn(), getSearchRequestBody() { return { @@ -131,7 +138,7 @@ describe('ESSearchSource', () => { hasLabels: 'false', index: 'foobar-title-*', requestBody: - "(fields:('0':('0':index,'1':(fields:(),title:'foobar-title-*')),'1':('0':size,'1':1000),'2':('0':filter,'1':!()),'3':('0':query),'4':('0':index,'1':(fields:(),title:'foobar-title-*')),'5':('0':query,'1':(language:KQL,query:'tooltipField: foobar')),'6':('0':fieldsFromSource,'1':!(_id)),'7':('0':source,'1':!f),'8':('0':fields,'1':!(tooltipField,styleField))))", + "(fields:('0':('0':index,'1':(fields:(),title:'foobar-title-*')),'1':('0':size,'1':1000),'2':('0':filter,'1':!()),'3':('0':query),'4':('0':index,'1':(fields:(),title:'foobar-title-*')),'5':('0':query,'1':(language:KQL,query:'tooltipField: foobar')),'6':('0':fieldsFromSource,'1':!(_id)),'7':('0':source,'1':!f),'8':('0':fields,'1':!(tooltipField,styleField)),'9':('0':filter,'1':!((meta:(),query:(exists:(field:bar)))))))", token: '1234', }); }); diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx index 77f4b684caf1f..5d0f6aa59c55d 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx @@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n'; import type { SearchResponseWarning } from '@kbn/search-response-warnings'; import { GeoJsonProperties, Geometry, Position } from 'geojson'; import type { KibanaExecutionContext } from '@kbn/core/public'; -import { type Filter, buildPhraseFilter, type TimeRange } from '@kbn/es-query'; +import { type Filter, buildExistsFilter, buildPhraseFilter, type TimeRange } from '@kbn/es-query'; import type { DataViewField, DataView } from '@kbn/data-plugin/common'; import { lastValueFrom } from 'rxjs'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; @@ -923,6 +923,12 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource }) ); + // Filter out documents without geo fields to avoid shard failures for indices without geo fields + searchSource.setField('filter', [ + ...(searchSource.getField('filter') as Filter[]), + buildExistsFilter({ name: this._descriptor.geoField, type: 'geo_point' }, dataView), + ]); + const mvtUrlServicePath = getHttp().basePath.prepend(`${MVT_GETTILE_API_PATH}/{z}/{x}/{y}.pbf`); const tileUrlParams = getTileUrlParams({ diff --git a/x-pack/plugins/maps/public/maps_vis_type_alias.ts b/x-pack/plugins/maps/public/maps_vis_type_alias.ts index bcbf0170afb25..e161689643612 100644 --- a/x-pack/plugins/maps/public/maps_vis_type_alias.ts +++ b/x-pack/plugins/maps/public/maps_vis_type_alias.ts @@ -24,8 +24,10 @@ export function getMapsVisTypeAlias() { }); return { - aliasApp: APP_ID, - aliasPath: `/${MAP_PATH}`, + alias: { + app: APP_ID, + path: `/${MAP_PATH}`, + }, name: APP_ID, title: APP_NAME, description: appDescription, @@ -45,8 +47,10 @@ export function getMapsVisTypeAlias() { title, description, updatedAt, - editUrl: getEditPath(id), - editApp: APP_ID, + editor: { + editUrl: getEditPath(id), + editApp: APP_ID, + }, icon: APP_ICON, stage: 'production' as VisualizationStage, savedObjectType: type, diff --git a/x-pack/plugins/ml/common/constants/locator.ts b/x-pack/plugins/ml/common/constants/locator.ts index 92c89c5aedf94..614c037c13026 100644 --- a/x-pack/plugins/ml/common/constants/locator.ts +++ b/x-pack/plugins/ml/common/constants/locator.ts @@ -55,6 +55,7 @@ export const ML_PAGES = { ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE: 'jobs/new_job/step/job_type', ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX: 'jobs/new_job/step/index_or_search', ANOMALY_DETECTION_CREATE_JOB_FROM_LENS: 'jobs/new_job/from_lens', + ANOMALY_DETECTION_CREATE_JOB_FROM_PATTERN_ANALYSIS: 'jobs/new_job/from_pattern_analysis', ANOMALY_DETECTION_CREATE_JOB_FROM_MAP: 'jobs/new_job/from_map', ANOMALY_DETECTION_MODULES_VIEW_OR_CREATE: 'modules/check_view_or_create', SETTINGS: 'settings', diff --git a/x-pack/plugins/ml/common/constants/new_job.ts b/x-pack/plugins/ml/common/constants/new_job.ts index 24584a6e8d29b..676182d0ac162 100644 --- a/x-pack/plugins/ml/common/constants/new_job.ts +++ b/x-pack/plugins/ml/common/constants/new_job.ts @@ -26,6 +26,7 @@ export enum CREATED_BY_LABEL { APM_TRANSACTION = 'ml-module-apm-transaction', SINGLE_METRIC_FROM_LENS = 'single-metric-wizard-from-lens', MULTI_METRIC_FROM_LENS = 'multi-metric-wizard-from-lens', + CATEGORIZATION_FROM_PATTERN_ANALYSIS = 'categorization-wizard-from-pattern-analysis', } export const DEFAULT_MODEL_MEMORY_LIMIT = '10MB'; diff --git a/x-pack/plugins/ml/common/openapi/ml_apis.yaml b/x-pack/plugins/ml/common/openapi/ml_apis.yaml index 5b7a68309c940..9f2a7de498184 100644 --- a/x-pack/plugins/ml/common/openapi/ml_apis.yaml +++ b/x-pack/plugins/ml/common/openapi/ml_apis.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Machine learning APIs description: Kibana APIs for the machine learning feature - version: "1.0.1" + version: "1.0.2" license: name: Elastic License 2.0 url: https://www.elastic.co/licensing/elastic-license @@ -82,7 +82,8 @@ components: required: false schema: type: boolean - example: 'true' + examples: + - true securitySchemes: basicAuth: type: http @@ -187,12 +188,14 @@ components: properties: error: type: string - example: Unauthorized + examples: + - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 examples: mlSyncExample: summary: Two anomaly detection jobs required synchronization in this example. diff --git a/x-pack/plugins/ml/common/openapi/ml_apis_serverless.yaml b/x-pack/plugins/ml/common/openapi/ml_apis_serverless.yaml index 649bc3db06acc..6ff44e29517e6 100644 --- a/x-pack/plugins/ml/common/openapi/ml_apis_serverless.yaml +++ b/x-pack/plugins/ml/common/openapi/ml_apis_serverless.yaml @@ -1,8 +1,8 @@ -openapi: 3.0.1 +openapi: 3.1.0 info: title: Machine learning APIs description: Kibana APIs for the machine learning feature - version: "1.0.1" + version: "1.0.2" license: name: Elastic License 2.0 url: https://www.elastic.co/licensing/elastic-license @@ -46,7 +46,8 @@ components: required: false schema: type: boolean - example: 'true' + examples: + - true securitySchemes: apiKeyAuth: type: apiKey @@ -148,12 +149,14 @@ components: properties: error: type: string - example: Unauthorized + examples: + - Unauthorized message: type: string statusCode: type: integer - example: 401 + examples: + - 401 examples: mlSyncExample: summary: Two anomaly detection jobs required synchronization in this example. diff --git a/x-pack/plugins/ml/common/types/locator.ts b/x-pack/plugins/ml/common/types/locator.ts index 329ba59ba9073..85b2550eb8e30 100644 --- a/x-pack/plugins/ml/common/types/locator.ts +++ b/x-pack/plugins/ml/common/types/locator.ts @@ -49,6 +49,7 @@ export type MlGenericUrlState = MLPageState< | typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_ADVANCED | typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_LENS | typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_MAP + | typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_PATTERN_ANALYSIS | typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE | typeof ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX | typeof ML_PAGES.DATA_FRAME_ANALYTICS_CREATE_JOB diff --git a/x-pack/plugins/ml/common/types/ml_server_info.ts b/x-pack/plugins/ml/common/types/ml_server_info.ts index e5141d6f2e78f..215f46c26bef8 100644 --- a/x-pack/plugins/ml/common/types/ml_server_info.ts +++ b/x-pack/plugins/ml/common/types/ml_server_info.ts @@ -20,6 +20,8 @@ export interface MlServerDefaults { export interface MlServerLimits { max_model_memory_limit?: string; effective_max_model_memory_limit?: string; + max_single_ml_node_processors?: number; + total_ml_processors?: number; } export interface MlInfoResponse { diff --git a/x-pack/plugins/ml/common/types/trained_models.ts b/x-pack/plugins/ml/common/types/trained_models.ts index 70f588712c351..95815cd3b87af 100644 --- a/x-pack/plugins/ml/common/types/trained_models.ts +++ b/x-pack/plugins/ml/common/types/trained_models.ts @@ -98,6 +98,7 @@ export type TrainedModelConfigResponse = estypes.MlTrainedModelConfig & { * Associated pipelines. Extends response from the ES endpoint. */ pipelines?: Record | null; + origin_job_exists?: boolean; metadata?: { analytics_config: DataFrameAnalyticsConfig; diff --git a/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx b/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx index 3919f9f9e5ccd..70c3be96c6674 100644 --- a/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx +++ b/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx @@ -65,6 +65,7 @@ export const ChangePointDetectionPage: FC = () => { 'share', 'storage', 'theme', + 'uiActions', 'uiSettings', 'unifiedSearch', 'usageCollection', diff --git a/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx b/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx index 455ff9bfc1377..187843505cef7 100644 --- a/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx +++ b/x-pack/plugins/ml/public/application/aiops/log_categorization.tsx @@ -56,6 +56,7 @@ export const LogCategorizationPage: FC = () => { 'share', 'storage', 'theme', + 'uiActions', 'uiSettings', 'unifiedSearch', ])} diff --git a/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx b/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx index c20264a129ea3..4c2c1dfd637db 100644 --- a/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx +++ b/x-pack/plugins/ml/public/application/aiops/log_rate_analysis.tsx @@ -59,6 +59,7 @@ export const LogRateAnalysisPage: FC = () => { 'share', 'storage', 'theme', + 'uiActions', 'uiSettings', 'unifiedSearch', ])} diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.tsx b/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.tsx index 556dd5c810d84..eb5450d0d61bf 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.tsx +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/anomaly_details.tsx @@ -361,7 +361,7 @@ const CategoryExamples: FC<{ definition: CategoryDefinition; examples: string[] {definition !== undefined && definition.terms && ( diff --git a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx index e617d05f94d31..aecbb0aa01089 100644 --- a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx +++ b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx @@ -101,7 +101,7 @@ export interface ScatterplotMatrixProps { legendType?: LegendType; searchQuery?: estypes.QueryDslQueryContainer; runtimeMappings?: RuntimeMappings; - indexPattern?: DataView; + dataView?: DataView; query?: Query; } @@ -113,7 +113,7 @@ export const ScatterplotMatrix: FC = ({ legendType, searchQuery, runtimeMappings, - indexPattern, + dataView, query, }) => { const { esSearch } = useMlApiContext(); @@ -210,9 +210,7 @@ export const ScatterplotMatrix: FC = ({ vegaSpec.data = { url: { '%context%': true, - ...(indexPattern?.timeFieldName - ? { ['%timefield%']: `${indexPattern?.timeFieldName}` } - : {}), + ...(dataView?.timeFieldName ? { ['%timefield%']: `${dataView?.timeFieldName}` } : {}), index, body: { fields: fieldsToFetch, @@ -300,7 +298,7 @@ export const ScatterplotMatrix: FC = ({ } const combinedRuntimeMappings = - indexPattern && getCombinedRuntimeMappings(indexPattern, runtimeMappings); + dataView && getCombinedRuntimeMappings(dataView, runtimeMappings); const body = { fields: queryFields, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts index 6cd5c40d66e4a..139b49f7c2b45 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts @@ -37,12 +37,10 @@ export const useResultsViewConfig = (jobId: string) => { } = useMlKibana(); const trainedModelsApiService = useTrainedModelsApiService(); - const [indexPattern, setIndexPattern] = useState(undefined); - const [indexPatternErrorMessage, setIndexPatternErrorMessage] = useState( - undefined - ); + const [dataView, setDataView] = useState(undefined); + const [dataViewErrorMessage, setDataViewErrorMessage] = useState(undefined); const [isInitialized, setIsInitialized] = useState(false); - const [needsDestIndexPattern, setNeedsDestIndexPattern] = useState(false); + const [needsDestDataView, setNeedsDestDataView] = useState(false); const [isLoadingJobConfig, setIsLoadingJobConfig] = useState(false); const [jobConfig, setJobConfig] = useState(undefined); const [jobCapsServiceErrorMessage, setJobCapsServiceErrorMessage] = useState( @@ -100,39 +98,39 @@ export const useResultsViewConfig = (jobId: string) => { try { const destIndex = getDestinationIndex(jobConfigUpdate); const destDataViewId = (await getDataViewIdFromName(destIndex)) ?? destIndex; - let dataView: DataView | undefined; + let fetchedDataView: DataView | undefined; try { - dataView = await dataViews.get(destDataViewId); + fetchedDataView = await dataViews.get(destDataViewId); // Force refreshing the fields list here because a user directly coming // from the job creation wizard might land on the page without the // data view being fully initialized because it was created // before the analytics job populated the destination index. - await dataViews.refreshFields(dataView); + await dataViews.refreshFields(fetchedDataView); } catch (e) { - dataView = undefined; + fetchedDataView = undefined; } - if (dataView === undefined) { - setNeedsDestIndexPattern(true); + if (fetchedDataView === undefined) { + setNeedsDestDataView(true); const sourceIndex = jobConfigUpdate.source.index[0]; const sourceDataViewId = (await getDataViewIdFromName(sourceIndex)) ?? sourceIndex; try { - dataView = await dataViews.get(sourceDataViewId); + fetchedDataView = await dataViews.get(sourceDataViewId); } catch (e) { - dataView = undefined; + fetchedDataView = undefined; } } - if (dataView !== undefined) { - await newJobCapsServiceAnalytics.initializeFromDataVIew(dataView); + if (fetchedDataView !== undefined) { + await newJobCapsServiceAnalytics.initializeFromDataVIew(fetchedDataView); setJobConfig(analyticsConfigs.data_frame_analytics[0]); - setIndexPattern(dataView); + setDataView(fetchedDataView); setIsInitialized(true); setIsLoadingJobConfig(false); } else { - setIndexPatternErrorMessage( + setDataViewErrorMessage( i18n.translate('xpack.ml.dataframe.analytics.results.dataViewMissingErrorMessage', { defaultMessage: 'To view this page, a Kibana data view is necessary for either the destination or source index of this analytics job.', @@ -153,15 +151,15 @@ export const useResultsViewConfig = (jobId: string) => { }, []); return { - indexPattern, - indexPatternErrorMessage, + dataView, + dataViewErrorMessage, isInitialized, isLoadingJobConfig, jobCapsServiceErrorMessage, jobConfig, jobConfigErrorMessage, jobStatus, - needsDestIndexPattern, + needsDestDataView, totalFeatureImportance, }; }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index c574a6f661085..d065ef84fa970 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -356,9 +356,9 @@ export const ConfigurationStepForm: FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const indexPatternFieldsTableItems = useMemo(() => { - if (indexData?.indexPatternFields !== undefined) { - return indexData.indexPatternFields.map((field) => ({ + const dataViewFieldsTableItems = useMemo(() => { + if (indexData?.dataViewFields !== undefined) { + return indexData.dataViewFields.map((field) => ({ name: field, is_included: false, is_required: false, @@ -366,7 +366,7 @@ export const ConfigurationStepForm: FC = ({ } return []; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [`${indexData?.indexPatternFields}`]); + }, [`${indexData?.dataViewFields}`]); useEffect(() => { if (typeof savedSearchQueryStr === 'string') { @@ -377,11 +377,11 @@ export const ConfigurationStepForm: FC = ({ useEffect(() => { if (isJobTypeWithDepVar) { - const indexPatternRuntimeFields = getCombinedRuntimeMappings(selectedDataView); + const dataViewRuntimeFields = getCombinedRuntimeMappings(selectedDataView); let runtimeOptions; - if (indexPatternRuntimeFields) { - runtimeOptions = getRuntimeDepVarOptions(jobType, indexPatternRuntimeFields); + if (dataViewRuntimeFields) { + runtimeOptions = getRuntimeDepVarOptions(jobType, dataViewRuntimeFields); } loadDepVarOptions(form, runtimeOptions); @@ -527,7 +527,7 @@ export const ConfigurationStepForm: FC = ({ legendType: getScatterplotMatrixLegendType(jobType), searchQuery: jobConfigQuery, runtimeMappings, - indexPattern: selectedDataView, + dataView: selectedDataView, }), // eslint-disable-next-line react-hooks/exhaustive-deps [ @@ -571,7 +571,7 @@ export const ConfigurationStepForm: FC = ({ const tableItems = includesTableItems.length > 0 && !noDocsContainMappedFields ? includesTableItems - : indexPatternFieldsTableItems; + : dataViewFieldsTableItems; return ( = ({ fullWidth > diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx index c32530658e6f8..bf5e43a8f72ac 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx @@ -42,13 +42,8 @@ export const CreateStep: FC = ({ actions, state, step }) => { const { createAnalyticsJob, setFormState, startAnalyticsJob } = actions; const { isAdvancedEditorValidJson, isJobCreated, isJobStarted, isValid, requestMessages } = state; - const { - createIndexPattern, - destinationIndex, - destinationIndexPatternTitleExists, - jobId, - jobType, - } = state.form; + const { createDataView, destinationIndex, destinationDataViewTitleExists, jobId, jobType } = + state.form; const [startChecked, setStartChecked] = useState(true); const [creationTriggered, setCreationTriggered] = useState(false); @@ -56,7 +51,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { useEffect(() => { if (canCreateDataView === false) { - setFormState({ createIndexPattern: false }); + setFormState({ createDataView: false }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [capabilities]); @@ -106,7 +101,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { onChange={(e) => { setStartChecked(e.target.checked); if (e.target.checked === false) { - setFormState({ createIndexPattern: false }); + setFormState({ createDataView: false }); } }} /> @@ -117,8 +112,8 @@ export const CreateStep: FC = ({ actions, state, step }) => { = ({ actions, state, step }) => { , ] : []), - ...(createIndexPattern && destinationIndexPatternTitleExists + ...(createDataView && destinationDataViewTitleExists ? [ i18n.translate( 'xpack.ml.dataframe.analytics.create.dataViewExistsError', @@ -146,7 +141,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { ), ] : []), - ...(!createIndexPattern && !destinationIndexPatternTitleExists + ...(!createDataView && !destinationDataViewTitleExists ? [ {i18n.translate( @@ -163,7 +158,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { > = ({ actions, state, step }) => { defaultMessage: 'Create data view', } )} - checked={createIndexPattern === true} - onChange={() => setFormState({ createIndexPattern: !createIndexPattern })} - data-test-subj="mlAnalyticsCreateJobWizardCreateIndexPatternCheckbox" + checked={createDataView === true} + onChange={() => setFormState({ createDataView: !createDataView })} + data-test-subj="mlAnalyticsCreateJobWizardCreateDataViewCheckbox" /> @@ -186,7 +181,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { disabled={ !isValid || !isAdvancedEditorValidJson || - (destinationIndexPatternTitleExists === true && createIndexPattern === true) + (destinationDataViewTitleExists === true && createDataView === true) } onClick={handleCreation} fill diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts index cf3c0fcf05ef2..2336113f917da 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts @@ -25,7 +25,7 @@ import { getFieldType, getDataGridSchemaFromKibanaFieldType, getDataGridSchemaFromESFieldType, - getFieldsFromKibanaIndexPattern, + getFieldsFromKibanaDataView, showDataGridColumnChartErrorMessageToast, useDataGrid, useRenderCellValue, @@ -58,8 +58,8 @@ function getRuntimeFieldColumns(runtimeMappings: RuntimeMappings) { }); } -function getIndexPatternColumns(indexPattern: DataView, fieldsFilter: string[]) { - const { fields } = indexPattern; +function getDataViewColumns(dataView: DataView, fieldsFilter: string[]) { + const { fields } = dataView; return fields .filter((field) => fieldsFilter.includes(field.name)) @@ -78,7 +78,7 @@ function getIndexPatternColumns(indexPattern: DataView, fieldsFilter: string[]) } export const useIndexData = ( - indexPattern: DataView, + dataView: DataView, query: Record | undefined, toastNotifications: CoreSetup['notifications']['toasts'], runtimeMappings?: RuntimeMappings @@ -87,7 +87,7 @@ export const useIndexData = ( // This is a workaround to avoid passing potentially thousands of unpopulated fields // (for example, as part of filebeat/metricbeat/ECS based indices) // to the data grid component which would significantly slow down the page. - const [indexPatternFields, setIndexPatternFields] = useState(); + const [dataViewFields, setDataViewFields] = useState(); const [timeRangeMs, setTimeRangeMs] = useState(); useEffect(() => { @@ -96,7 +96,7 @@ export const useIndexData = ( setStatus(INDEX_STATUS.LOADING); const esSearchRequest = { - index: indexPattern.title, + index: dataView.title, body: { fields: ['*'], _source: false, @@ -116,13 +116,13 @@ export const useIndexData = ( // Get all field names for each returned doc and flatten it // to a list of unique field names used across all docs. - const allDataViewFields = getFieldsFromKibanaIndexPattern(indexPattern); + const allDataViewFields = getFieldsFromKibanaDataView(dataView); const populatedFields = [...new Set(docs.map(Object.keys).flat(1))] .filter((d) => allDataViewFields.includes(d)) .sort(); setStatus(INDEX_STATUS.LOADED); - setIndexPatternFields(populatedFields); + setDataViewFields(populatedFields); } catch (e) { setErrorMessage(extractErrorMessage(e)); setStatus(INDEX_STATUS.ERROR); @@ -136,20 +136,20 @@ export const useIndexData = ( // To be used for data grid column selection // and will be applied to doc and chart queries. const combinedRuntimeMappings = useMemo( - () => getCombinedRuntimeMappings(indexPattern, runtimeMappings), - [indexPattern, runtimeMappings] + () => getCombinedRuntimeMappings(dataView, runtimeMappings), + [dataView, runtimeMappings] ); // Available data grid columns, will be a combination of index pattern and runtime fields. const [columns, setColumns] = useState([]); useEffect(() => { - if (Array.isArray(indexPatternFields)) { + if (Array.isArray(dataViewFields)) { setColumns([ - ...getIndexPatternColumns(indexPattern, indexPatternFields), + ...getDataViewColumns(dataView, dataViewFields), ...(combinedRuntimeMappings ? getRuntimeFieldColumns(combinedRuntimeMappings) : []), ]); } - }, [indexPattern, indexPatternFields, combinedRuntimeMappings]); + }, [dataView, dataViewFields, combinedRuntimeMappings]); const dataGrid = useDataGrid(columns); @@ -175,19 +175,19 @@ export const useIndexData = ( setErrorMessage(''); setStatus(INDEX_STATUS.LOADING); - const timeFieldName = indexPattern.getTimeField()?.name; + const timeFieldName = dataView.getTimeField()?.name; const sort: EsSorting = sortingColumns.reduce((s, column) => { s[column.id] = { order: column.direction }; return s; }, {} as EsSorting); const esSearchRequest = { - index: indexPattern.title, + index: dataView.title, body: { query, from: pagination.pageIndex * pagination.pageSize, size: pagination.pageSize, fields: [ - ...(indexPatternFields ?? []), + ...(dataViewFields ?? []), ...(isRuntimeMappings(combinedRuntimeMappings) ? Object.keys(combinedRuntimeMappings) : []), @@ -246,22 +246,22 @@ export const useIndexData = ( } } - if (indexPatternFields !== undefined && query !== undefined) { + if (dataViewFields !== undefined && query !== undefined) { fetchIndexData(); } // custom comparison // eslint-disable-next-line react-hooks/exhaustive-deps }, [ - indexPattern.title, - indexPatternFields, + dataView.title, + dataViewFields, // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify([query, pagination, sortingColumns, combinedRuntimeMappings]), ]); const dataLoader = useMemo( - () => new DataLoader(indexPattern, toastNotifications), + () => new DataLoader(dataView, toastNotifications), // eslint-disable-next-line react-hooks/exhaustive-deps - [indexPattern] + [dataView] ); useEffect(() => { @@ -291,16 +291,16 @@ export const useIndexData = ( // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dataGrid.chartsVisible, - indexPattern.title, + dataView.title, // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify([query, dataGrid.visibleColumns, runtimeMappings]), ]); - const renderCellValue = useRenderCellValue(indexPattern, pagination, tableItems); + const renderCellValue = useRenderCellValue(dataView, pagination, tableItems); return { ...dataGrid, - indexPatternFields, + dataViewFields, renderCellValue, timeRangeMs, }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/index_pattern_prompt/index_pattern_prompt.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/data_view_prompt.tsx similarity index 96% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/index_pattern_prompt/index_pattern_prompt.tsx rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/data_view_prompt.tsx index cd60be7290b96..922ef80b3d1f2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/index_pattern_prompt/index_pattern_prompt.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/data_view_prompt.tsx @@ -15,7 +15,7 @@ interface Props { destIndex?: string; } -export const IndexPatternPrompt: FC = ({ destIndex, color }) => { +export const DataViewPrompt: FC = ({ destIndex, color }) => { const { services: { http: { basePath }, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/index.ts new file mode 100644 index 0000000000000..4c5dbfd0a67b2 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/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 { DataViewPrompt } from './data_view_prompt'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx index 4e89a2a0833a1..d47dc0212f501 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx @@ -59,7 +59,7 @@ import { replaceStringTokens } from '../../../../../util/string_utils'; import { parseInterval } from '../../../../../../../common/util/parse_interval'; import { ExpandableSection, ExpandableSectionProps, HEADER_ITEMS_LOADING } from '.'; -import { IndexPatternPrompt } from '../index_pattern_prompt'; +import { DataViewPrompt } from '../data_view_prompt'; const showingDocs = i18n.translate( 'xpack.ml.dataframe.analytics.explorationResults.documentsShownHelpText', @@ -121,9 +121,9 @@ const getResultsSectionHeaderItems = ( interface ExpandableSectionResultsProps { colorRange?: ReturnType; indexData: UseIndexDataReturnType; - indexPattern?: DataView; + dataView?: DataView; jobConfig?: DataFrameAnalyticsConfig; - needsDestIndexPattern: boolean; + needsDestDataView: boolean; resultsField?: string; searchQuery: estypes.QueryDslQueryContainer; } @@ -131,9 +131,9 @@ interface ExpandableSectionResultsProps { export const ExpandableSectionResults: FC = ({ colorRange, indexData, - indexPattern, + dataView, jobConfig, - needsDestIndexPattern, + needsDestDataView, resultsField, searchQuery, }) => { @@ -146,7 +146,7 @@ export const ExpandableSectionResults: FC = ({ }, } = useMlKibana(); - const dataViewId = indexPattern?.id; + const dataViewId = dataView?.id; const discoverLocator = useMemo( () => share.url.locators.get('DISCOVER_APP_LOCATOR'), @@ -206,7 +206,7 @@ export const ExpandableSectionResults: FC = ({ if (discoverLocator !== undefined) { const url = await discoverLocator.getRedirectUrl({ - indexPatternId: dataViewId, + dataViewId, timeRange: data.query.timefilter.timefilter.getTime(), filters: data.query.filterManager.getFilters(), query: { @@ -239,7 +239,7 @@ export const ExpandableSectionResults: FC = ({ if (timeRangeInterval !== null) { // Create a copy of the record as we are adding properties into it. const record = cloneDeep(item); - const timestamp = record[indexPattern!.timeFieldName!]; + const timestamp = record[dataView!.timeFieldName!]; const configuredUrlValue = customUrl.url_value; if (configuredUrlValue.includes('$earliest$')) { @@ -373,9 +373,9 @@ export const ExpandableSectionResults: FC = ({ const resultsSectionContent = ( <> - {jobConfig !== undefined && needsDestIndexPattern && ( + {jobConfig !== undefined && needsDestDataView && (

    - +
    )} {jobConfig !== undefined && @@ -386,7 +386,7 @@ export const ExpandableSectionResults: FC = ({ )} {(columnsWithCharts.length > 0 || searchQuery !== defaultSearchQuery) && - indexPattern !== undefined && ( + dataView !== undefined && ( <> {columnsWithCharts.length > 0 && (tableItems.length > 0 || status === INDEX_STATUS.LOADED) && ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx index 348c7051993a7..bd5cd677a7141 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_page_wrapper/exploration_page_wrapper.tsx @@ -35,7 +35,7 @@ import { LoadingPanel } from '../loading_panel'; import { FeatureImportanceSummaryPanelProps } from '../total_feature_importance_summary/feature_importance_summary'; import { useExplorationUrlState } from '../../hooks/use_exploration_url_state'; import { ExplorationQueryBarProps } from '../exploration_query_bar/exploration_query_bar'; -import { IndexPatternPrompt } from '../index_pattern_prompt'; +import { DataViewPrompt } from '../data_view_prompt'; function getFilters(resultsField: string) { return { @@ -84,15 +84,15 @@ export const ExplorationPageWrapper: FC = ({ FeatureImportanceSummaryPanel, }) => { const { - indexPattern, - indexPatternErrorMessage, + dataView, + dataViewErrorMessage, isInitialized, isLoadingJobConfig, jobCapsServiceErrorMessage, jobConfig, jobConfigErrorMessage, jobStatus, - needsDestIndexPattern, + needsDestDataView, totalFeatureImportance, } = useResultsViewConfig(jobId); @@ -121,13 +121,13 @@ export const ExplorationPageWrapper: FC = ({ const destIndex = getDestinationIndex(jobConfig); const scatterplotFieldOptions = useScatterplotFieldOptions( - indexPattern, + dataView, jobConfig?.analyzed_fields?.includes, jobConfig?.analyzed_fields?.excludes, resultsField ); - if (indexPatternErrorMessage !== undefined) { + if (dataViewErrorMessage !== undefined) { return ( = ({ iconType="cross" >

    - {indexPatternErrorMessage} - {needsDestIndexPattern ? ( - - ) : null} + {dataViewErrorMessage} + {needsDestDataView ? : null}

    @@ -170,7 +168,7 @@ export const ExplorationPageWrapper: FC = ({ )} - {indexPattern !== undefined && jobConfig && ( + {dataView !== undefined && jobConfig && ( <> @@ -178,7 +176,7 @@ export const ExplorationPageWrapper: FC = ({ = ({ = ({ {isLoadingJobConfig === true && jobConfig === undefined && } {isLoadingJobConfig === false && jobConfig !== undefined && - indexPattern !== undefined && + dataView !== undefined && isInitialized === true && ( )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx index e2998651f2c21..e1efd592e956e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx @@ -25,7 +25,7 @@ import { removeFilterFromQueryString } from '../../../../../explorer/explorer_ut import { useMlKibana } from '../../../../../contexts/kibana'; export interface ExplorationQueryBarProps { - indexPattern: DataView; + dataView: DataView; setSearchQuery: (update: { queryString: string; query?: estypes.QueryDslQueryContainer; @@ -41,7 +41,7 @@ export interface ExplorationQueryBarProps { } export const ExplorationQueryBar: FC = ({ - indexPattern, + dataView, setSearchQuery, filters, query, @@ -99,7 +99,7 @@ export const ExplorationQueryBar: FC = ({ case SEARCH_QUERY_LANGUAGE.KUERY: convertedQuery = toElasticsearchQuery( fromKueryExpression(query.query as string), - indexPattern + dataView ); break; case SEARCH_QUERY_LANGUAGE.LUCENE: @@ -181,7 +181,7 @@ export const ExplorationQueryBar: FC = ({ = React.memo( - ({ indexPattern, jobConfig, needsDestIndexPattern, searchQuery }) => { + ({ dataView, jobConfig, needsDestDataView, searchQuery }) => { const { services: { mlServices: { mlApiServices }, @@ -39,7 +39,7 @@ export const ExplorationResultsTable: FC = React.memo( } = useMlKibana(); const classificationData = useExplorationResults( - indexPattern, + dataView, jobConfig, searchQuery, getToastNotifications(), @@ -54,10 +54,10 @@ export const ExplorationResultsTable: FC = React.memo(
    diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts index c7216037241d3..0a5dd784a6496 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts @@ -43,7 +43,7 @@ import { useTrainedModelsApiService } from '../../../../../services/ml_api_servi import { useExplorationDataGrid } from './use_exploration_data_grid'; export const useExplorationResults = ( - indexPattern: DataView | undefined, + dataView: DataView | undefined, jobConfig: DataFrameAnalyticsConfig | undefined, searchQuery: estypes.QueryDslQueryContainer, toastNotifications: CoreSetup['notifications']['toasts'], @@ -54,7 +54,7 @@ export const useExplorationResults = ( const trainedModelsApiService = useTrainedModelsApiService(); const needsDestIndexFields = - indexPattern !== undefined && indexPattern.title === jobConfig?.source.index[0]; + dataView !== undefined && dataView.title === jobConfig?.source.index[0]; const columns: EuiDataGridColumn[] = []; @@ -90,10 +90,9 @@ export const useExplorationResults = ( }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( - () => - indexPattern !== undefined ? new DataLoader(indexPattern, toastNotifications) : undefined, + () => (dataView !== undefined ? new DataLoader(dataView, toastNotifications) : undefined), // eslint-disable-next-line react-hooks/exhaustive-deps - [indexPattern] + [dataView] ); const fetchColumnChartsData = async function () { @@ -179,7 +178,7 @@ export const useExplorationResults = ( const resultsField = jobConfig?.dest.results_field ?? DEFAULT_RESULTS_FIELD; const renderCellValue = useRenderCellValue( - indexPattern, + dataView, dataGrid.pagination, dataGrid.tableItems, resultsField diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx index 9fc517d293e7f..9cbca46a03c8f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx @@ -37,7 +37,7 @@ export const JobConfigErrorCallout: FC = ({ application: { getUrlForApp }, }, } = useMlKibana(); - const containsIndexPatternLink = + const containsDataViewLink = typeof jobCapsServiceErrorMessage === 'string' && jobCapsServiceErrorMessage.includes('locate that index-pattern') && jobCapsServiceErrorMessage.includes('click here to re-create'); @@ -45,7 +45,7 @@ export const JobConfigErrorCallout: FC = ({ const message = (

    {jobConfigErrorMessage ? jobConfigErrorMessage : jobCapsServiceErrorMessage}

    ); - const newIndexPatternUrl = useMemo( + const newDataViewUrl = useMemo( () => getUrlForApp('management', { path: 'kibana/indexPatterns', @@ -54,8 +54,8 @@ export const JobConfigErrorCallout: FC = ({ [] ); - const calloutBody = containsIndexPatternLink ? ( - + const calloutBody = containsDataViewLink ? ( + {message} ) : ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx index f8fa311cb8a2a..8259ec4188c3e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx @@ -33,7 +33,7 @@ import { getFeatureCount } from './common'; import { useOutlierData } from './use_outlier_data'; import { useExplorationUrlState } from '../../hooks/use_exploration_url_state'; import { ExplorationQueryBarProps } from '../exploration_query_bar/exploration_query_bar'; -import { IndexPatternPrompt } from '../index_pattern_prompt'; +import { DataViewPrompt } from '../data_view_prompt'; export type TableItem = Record; @@ -42,12 +42,12 @@ interface ExplorationProps { } export const OutlierExploration: FC = React.memo(({ jobId }) => { - const { indexPattern, indexPatternErrorMessage, jobConfig, needsDestIndexPattern } = + const { dataView, dataViewErrorMessage, jobConfig, needsDestDataView } = useResultsViewConfig(jobId); const [pageUrlState, setPageUrlState] = useExplorationUrlState(); const [searchQuery, setSearchQuery] = useState(defaultSearchQuery); - const outlierData = useOutlierData(indexPattern, jobConfig, searchQuery); + const outlierData = useOutlierData(dataView, jobConfig, searchQuery); const searchQueryUpdateHandler: ExplorationQueryBarProps['setSearchQuery'] = useCallback( (update) => { @@ -81,20 +81,20 @@ export const OutlierExploration: FC = React.memo(({ jobId }) = // If feature influence was enabled for the legacy job we'll show a callout // with some additional information for a workaround. const showLegacyFeatureInfluenceFormatCallout = - !needsDestIndexPattern && + !needsDestDataView && isOutlierAnalysis(jobConfig?.analysis) && jobConfig?.analysis.outlier_detection.compute_feature_influence === true && columnsWithCharts.findIndex((d) => d.id === `${resultsField}.${FEATURE_INFLUENCE}`) === -1; const scatterplotFieldOptions = useScatterplotFieldOptions( - indexPattern, + dataView, jobConfig?.analyzed_fields?.includes, jobConfig?.analyzed_fields?.excludes, resultsField ); const destIndex = getDestinationIndex(jobConfig); - if (indexPatternErrorMessage !== undefined) { + if (dataViewErrorMessage !== undefined) { return ( = React.memo(({ jobId }) = iconType="cross" >

    - {indexPatternErrorMessage} - {needsDestIndexPattern ? ( - - ) : null} + {dataViewErrorMessage} + {needsDestDataView ? : null}

    @@ -124,10 +122,10 @@ export const OutlierExploration: FC = React.memo(({ jobId }) = )} {(columnsWithCharts.length > 0 || searchQuery !== defaultSearchQuery) && - indexPattern !== undefined && ( + dataView !== undefined && ( <> @@ -165,9 +163,9 @@ export const OutlierExploration: FC = React.memo(({ jobId }) = showColorRange && !showLegacyFeatureInfluenceFormatCallout ? colorRange : undefined } indexData={outlierData} - indexPattern={indexPattern} + dataView={dataView} jobConfig={jobConfig} - needsDestIndexPattern={needsDestIndexPattern} + needsDestDataView={needsDestDataView} searchQuery={searchQuery} /> diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts index 73d88ecff6a23..4be3120569923 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts @@ -41,17 +41,17 @@ import { getFeatureCount, getOutlierScoreFieldName } from './common'; import { useExplorationDataGrid } from '../exploration_results_table/use_exploration_data_grid'; export const useOutlierData = ( - indexPattern: DataView | undefined, + dataView: DataView | undefined, jobConfig: DataFrameAnalyticsConfig | undefined, searchQuery: estypes.QueryDslQueryContainer ): UseIndexDataReturnType => { const needsDestIndexFields = - indexPattern !== undefined && indexPattern.title === jobConfig?.source.index[0]; + dataView !== undefined && dataView.title === jobConfig?.source.index[0]; const columns = useMemo(() => { const newColumns: EuiDataGridColumn[] = []; - if (jobConfig !== undefined && indexPattern !== undefined) { + if (jobConfig !== undefined && dataView !== undefined) { const resultsField = jobConfig.dest.results_field; const { fieldTypes } = getIndexFields(jobConfig, needsDestIndexFields); newColumns.push( @@ -63,7 +63,7 @@ export const useOutlierData = ( return newColumns; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [jobConfig, indexPattern]); + }, [jobConfig, dataView]); const dataGrid = useExplorationDataGrid( columns, @@ -95,11 +95,8 @@ export const useOutlierData = ( }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( - () => - indexPattern !== undefined - ? new DataLoader(indexPattern, getToastNotifications()) - : undefined, - [indexPattern] + () => (dataView !== undefined ? new DataLoader(dataView, getToastNotifications()) : undefined), + [dataView] ); const fetchColumnChartsData = async function () { @@ -146,7 +143,7 @@ export const useOutlierData = ( ); const renderCellValue = useRenderCellValue( - indexPattern, + dataView, dataGrid.pagination, dataGrid.tableItems, jobConfig?.dest.results_field ?? DEFAULT_RESULTS_FIELD, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_modal.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_modal.tsx index 3d22ed72487f5..d18c43cda549b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_modal.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_modal.tsx @@ -21,12 +21,12 @@ export const DeleteActionModal: FC = ({ closeModal, deleteAndCloseModal, deleteTargetIndex, - deleteIndexPattern, - indexPatternExists, + deleteDataView, + dataViewExists, isLoading, item, toggleDeleteIndex, - toggleDeleteIndexPattern, + toggleDeleteDataView, userCanDeleteIndex, userCanDeleteDataView, }) => { @@ -77,15 +77,15 @@ export const DeleteActionModal: FC = ({ )}
    - {userCanDeleteIndex && indexPatternExists && ( + {userCanDeleteIndex && dataViewExists && ( )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx index d9a888b9e3147..03364165095d2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/delete_action_name.test.tsx @@ -99,7 +99,7 @@ describe('DeleteAction', () => { fireEvent.click(deleteButton); expect(getByTestId('mlAnalyticsJobDeleteModal')).toBeInTheDocument(); expect(queryByTestId('mlAnalyticsJobDeleteIndexSwitch')).toBeNull(); - expect(queryByTestId('mlAnalyticsJobDeleteIndexPatternSwitch')).toBeNull(); + expect(queryByTestId('mlAnalyticsJobDeleteDataViewSwitch')).toBeNull(); mock.mockRestore(); }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx index 1a828f6b6cdf0..f4c2773cd42f1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx @@ -42,10 +42,10 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { const [isDeleteJobCheckModalVisible, setDeleteJobCheckModalVisible] = useState(false); const [deleteItem, setDeleteItem] = useState(false); const [deleteTargetIndex, setDeleteTargetIndex] = useState(true); - const [deleteIndexPattern, setDeleteIndexPattern] = useState(true); + const [deleteDataView, setDeleteDataView] = useState(true); const [userCanDeleteIndex, setUserCanDeleteIndex] = useState(false); const [userCanDeleteDataView, setUserCanDeleteDataView] = useState(false); - const [indexPatternExists, setIndexPatternExists] = useState(false); + const [dataViewExists, setDataViewExists] = useState(false); const [isLoading, setIsLoading] = useState(false); const { @@ -57,13 +57,13 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { const toastNotificationService = useToastNotificationService(); - const checkIndexPatternExists = async () => { + const checkDataViewExists = async () => { try { const dv = (await dataViews.getIdsWithTitle()).find(({ title }) => title === indexName); if (dv !== undefined) { - setIndexPatternExists(true); + setDataViewExists(true); } else { - setIndexPatternExists(false); + setDataViewExists(false); } setIsLoading(false); } catch (e) { @@ -93,7 +93,7 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { capabilities.indexPatterns.save === true; setUserCanDeleteDataView(canDeleteDataView); if (canDeleteDataView === false) { - setDeleteIndexPattern(false); + setDeleteDataView(false); } } catch (e) { const error = extractErrorMessage(e); @@ -116,7 +116,7 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { setIsLoading(true); // Check if a data view exists corresponding to current DFA job // if data view does exist, show it to user - checkIndexPatternExists(); + checkDataViewExists(); // Check if an user has permission to delete the index & data view checkUserIndexPermission(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -129,12 +129,12 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { setModalVisible(false); if (item !== undefined) { - if ((userCanDeleteIndex && deleteTargetIndex) || (userCanDeleteIndex && deleteIndexPattern)) { + if ((userCanDeleteIndex && deleteTargetIndex) || (userCanDeleteIndex && deleteDataView)) { deleteAnalyticsAndDestIndex( item.config, item.stats, deleteTargetIndex, - indexPatternExists && deleteIndexPattern, + dataViewExists && deleteDataView, toastNotificationService ); } else { @@ -143,7 +143,7 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { } }; const toggleDeleteIndex = () => setDeleteTargetIndex(!deleteTargetIndex); - const toggleDeleteIndexPattern = () => setDeleteIndexPattern(!deleteIndexPattern); + const toggleDeleteDataView = () => setDeleteDataView(!deleteDataView); const openModal = (newItem: DataFrameAnalyticsListRowEssentials) => { setItem(newItem); @@ -181,9 +181,9 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { closeModal, deleteAndCloseModal, deleteTargetIndex, - deleteIndexPattern, + deleteDataView, deleteItem, - indexPatternExists, + dataViewExists, isDeleteJobCheckModalVisible, isModalVisible, isLoading, @@ -192,7 +192,7 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { openModal, openDeleteJobCheckModal, toggleDeleteIndex, - toggleDeleteIndexPattern, + toggleDeleteDataView, userCanDeleteIndex, userCanDeleteDataView, }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx index 89c16fbb93050..9525042f6a47a 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx @@ -146,7 +146,7 @@ export const SourceSelection: FC = () => { type: 'index-pattern', getIconForSavedObject: () => 'indexPatternApp', name: i18n.translate( - 'xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.indexPattern', + 'xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.dataView', { defaultMessage: 'Data view', } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts index b9b8de0ce0d55..a1dffe771d8d2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts @@ -18,7 +18,7 @@ export enum ACTION { RESET_FORM, SET_ADVANCED_EDITOR_RAW_STRING, SET_FORM_STATE, - SET_INDEX_PATTERN_TITLES, + SET_DATA_VIEW_TITLES, SET_IS_JOB_CREATED, SET_IS_JOB_STARTED, SET_IS_MODAL_BUTTON_DISABLED, @@ -51,9 +51,9 @@ export type Action = } | { type: ACTION.SET_FORM_STATE; payload: Partial } | { - type: ACTION.SET_INDEX_PATTERN_TITLES; + type: ACTION.SET_DATA_VIEW_TITLES; payload: { - indexPatternsMap: SourceIndexMap; + dataViewsMap: SourceIndexMap; }; } | { type: ACTION.SET_IS_JOB_CREATED; isJobCreated: State['isJobCreated'] } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts index 1a5beada2c3c0..5f02d7bbbb4fd 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts @@ -39,7 +39,7 @@ const getMockState = ({ jobIdEmpty: false, jobIdValid: true, jobIdExists: false, - createIndexPattern: false, + createDataView: false, }, jobConfig: { source: { index }, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts index 69eececeba129..d2689a009fb1b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts @@ -148,7 +148,7 @@ export const validateNumTopFeatureImportanceValues = ( }; export const validateAdvancedEditor = (state: State): State => { - const { jobIdEmpty, jobIdValid, jobIdExists, jobType, createIndexPattern } = state.form; + const { jobIdEmpty, jobIdValid, jobIdExists, jobType, createDataView } = state.form; const { jobConfig } = state; state.advancedEditorMessages = []; @@ -161,8 +161,7 @@ export const validateAdvancedEditor = (state: State): State => { const destinationIndexName = jobConfig?.dest?.index ?? ''; const destinationIndexNameEmpty = destinationIndexName === ''; const destinationIndexNameValid = isValidIndexName(destinationIndexName); - const destinationIndexPatternTitleExists = - state.indexPatternsMap[destinationIndexName] !== undefined; + const destinationDataViewTitleExists = state.dataViewsMap[destinationIndexName] !== undefined; const analyzedFields = jobConfig?.analyzed_fields?.includes || []; @@ -294,7 +293,7 @@ export const validateAdvancedEditor = (state: State): State => { ), message: '', }); - } else if (destinationIndexPatternTitleExists && !createIndexPattern) { + } else if (destinationDataViewTitleExists && !createDataView) { state.advancedEditorMessages.push({ error: i18n.translate( 'xpack.ml.dataframe.analytics.create.advancedEditorMessage.destinationIndexNameExistsWarn', @@ -360,7 +359,7 @@ export const validateAdvancedEditor = (state: State): State => { }); } - state.form.destinationIndexPatternTitleExists = destinationIndexPatternTitleExists; + state.form.destinationDataViewTitleExists = destinationDataViewTitleExists; state.isValid = includesValid && @@ -377,7 +376,7 @@ export const validateAdvancedEditor = (state: State): State => { !dependentVariableEmpty && !modelMemoryLimitEmpty && (numTopFeatureImportanceValuesValid || jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION) && - (!destinationIndexPatternTitleExists || !createIndexPattern); + (!destinationDataViewTitleExists || !createDataView); return state; }; @@ -425,8 +424,8 @@ const validateForm = (state: State): State => { sourceIndexNameValid, destinationIndexNameEmpty, destinationIndexNameValid, - destinationIndexPatternTitleExists, - createIndexPattern, + destinationDataViewTitleExists, + createDataView, dependentVariable, modelMemoryLimit, numTopFeatureImportanceValuesValid, @@ -458,7 +457,7 @@ const validateForm = (state: State): State => { destinationIndexNameValid && !dependentVariableEmpty && (numTopFeatureImportanceValuesValid || jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION) && - (!destinationIndexPatternTitleExists || !createIndexPattern); + (!destinationDataViewTitleExists || !createDataView); return state; }; @@ -513,8 +512,8 @@ export function reducer(state: State, action: Action): State { if (action.payload.destinationIndex !== undefined) { newFormState.destinationIndexNameEmpty = newFormState.destinationIndex === ''; newFormState.destinationIndexNameValid = isValidIndexName(newFormState.destinationIndex); - newFormState.destinationIndexPatternTitleExists = - state.indexPatternsMap[newFormState.destinationIndex] !== undefined; + newFormState.destinationDataViewTitleExists = + state.dataViewsMap[newFormState.destinationIndex] !== undefined; } if (action.payload.jobId !== undefined) { @@ -541,13 +540,13 @@ export function reducer(state: State, action: Action): State { ? validateAdvancedEditor({ ...state, form: newFormState }) : validateForm({ ...state, form: newFormState }); - case ACTION.SET_INDEX_PATTERN_TITLES: { + case ACTION.SET_DATA_VIEW_TITLES: { const newState = { ...state, ...action.payload, }; - newState.form.destinationIndexPatternTitleExists = - newState.indexPatternsMap[newState.form.destinationIndex] !== undefined; + newState.form.destinationDataViewTitleExists = + newState.dataViewsMap[newState.form.destinationIndex] !== undefined; return newState; } @@ -591,8 +590,8 @@ export function reducer(state: State, action: Action): State { formState.destinationIndexNameEmpty = formState.destinationIndex === ''; formState.destinationIndexNameValid = isValidIndexName(formState.destinationIndex || ''); - formState.destinationIndexPatternTitleExists = - state.indexPatternsMap[formState.destinationIndex || ''] !== undefined; + formState.destinationDataViewTitleExists = + state.dataViewsMap[formState.destinationIndex || ''] !== undefined; if (formState.numTopFeatureImportanceValues !== undefined) { formState.numTopFeatureImportanceValuesValid = validateNumTopFeatureImportanceValues( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index d567c7d19b3d3..efffc221c3174 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -35,13 +35,10 @@ export const UNSET_CONFIG_ITEM = '--'; export type EsIndexName = string; export type DependentVariable = string; -export type IndexPatternTitle = string; +export type DataViewTitle = string; export type AnalyticsJobType = DataFrameAnalysisConfigType | undefined; -type IndexPatternId = string; -export type SourceIndexMap = Record< - IndexPatternTitle, - { label: IndexPatternTitle; value: IndexPatternId } ->; +type DataViewId = string; +export type SourceIndexMap = Record; export interface FormMessage { error?: string; @@ -55,7 +52,7 @@ export interface State { form: { alpha: undefined | number; computeFeatureInfluence: string; - createIndexPattern: boolean; + createDataView: boolean; classAssignmentObjective: undefined | string; dependentVariable: DependentVariable; description: string; @@ -63,7 +60,7 @@ export interface State { destinationIndexNameExists: boolean; destinationIndexNameEmpty: boolean; destinationIndexNameValid: boolean; - destinationIndexPatternTitleExists: boolean; + destinationDataViewTitleExists: boolean; downsampleFactor: undefined | number; earlyStoppingEnabled: undefined | boolean; eta: undefined | number; @@ -120,7 +117,7 @@ export interface State { useEstimatedMml: boolean; }; disabled: boolean; - indexPatternsMap: SourceIndexMap; + dataViewsMap: SourceIndexMap; isAdvancedEditorEnabled: boolean; isAdvancedEditorValidJson: boolean; hasSwitchedToEditor: boolean; @@ -141,7 +138,7 @@ export const getInitialState = (): State => ({ form: { alpha: undefined, computeFeatureInfluence: 'true', - createIndexPattern: true, + createDataView: true, classAssignmentObjective: undefined, dependentVariable: '', description: '', @@ -149,7 +146,7 @@ export const getInitialState = (): State => ({ destinationIndexNameExists: false, destinationIndexNameEmpty: true, destinationIndexNameValid: false, - destinationIndexPatternTitleExists: false, + destinationDataViewTitleExists: false, earlyStoppingEnabled: undefined, downsampleFactor: undefined, eta: undefined, @@ -210,7 +207,7 @@ export const getInitialState = (): State => ({ !mlNodesAvailable() || !checkPermission('canCreateDataFrameAnalytics') || !checkPermission('canStartStopDataFrameAnalytics'), - indexPatternsMap: {}, + dataViewsMap: {}, isAdvancedEditorEnabled: false, isAdvancedEditorValidJson: true, hasSwitchedToEditor: false, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts index e7b618808100b..d0dbfe24fb9b7 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts @@ -59,7 +59,7 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const { refresh } = useRefreshAnalyticsList(); const { form, jobConfig, isAdvancedEditorEnabled } = state; - const { createIndexPattern, jobId } = form; + const { createDataView, jobId } = form; let { destinationIndex } = form; const addRequestMessage = (requestMessage: FormMessage) => @@ -73,8 +73,8 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const setAdvancedEditorRawString = (advancedEditorRawString: string) => dispatch({ type: ACTION.SET_ADVANCED_EDITOR_RAW_STRING, advancedEditorRawString }); - const setIndexPatternTitles = (payload: { indexPatternsMap: SourceIndexMap }) => - dispatch({ type: ACTION.SET_INDEX_PATTERN_TITLES, payload }); + const setDataViewTitles = (payload: { dataViewsMap: SourceIndexMap }) => + dispatch({ type: ACTION.SET_DATA_VIEW_TITLES, payload }); const setIsJobCreated = (isJobCreated: boolean) => dispatch({ type: ACTION.SET_IS_JOB_CREATED, isJobCreated }); @@ -110,7 +110,7 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { ), }); setIsJobCreated(true); - if (createIndexPattern) { + if (createDataView) { createKibanaDataView(destinationIndex, dataViews, form.timeFieldName, addRequestMessage); } refresh(); @@ -132,17 +132,17 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const prepareFormValidation = async () => { try { // Set the existing data view names. - const indexPatternsMap: SourceIndexMap = {}; + const dataViewsMap: SourceIndexMap = {}; const savedObjects = (await dataViews.getCache()) || []; savedObjects.forEach((obj) => { const title = obj?.attributes?.title; if (title !== undefined) { const id = obj?.id || ''; - indexPatternsMap[title] = { label: title, value: id }; + dataViewsMap[title] = { label: title, value: id }; } }); - setIndexPatternTitles({ - indexPatternsMap, + setDataViewTitles({ + dataViewsMap, }); } catch (e) { addRequestMessage({ diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts index 8929f39bea43c..ea3c24884bbec 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/services/analytics_service/delete_analytics.ts @@ -48,7 +48,7 @@ export const deleteAnalyticsAndDestIndex = async ( analyticsConfig: DataFrameAnalyticsListRow['config'], analyticsStats: DataFrameAnalyticsListRow['stats'], deleteDestIndex: boolean, - deleteDestIndexPattern: boolean, + deleteDestDataView: boolean, toastNotificationService: ToastNotificationService ) => { const destinationIndex = analyticsConfig.dest.index; @@ -59,7 +59,7 @@ export const deleteAnalyticsAndDestIndex = async ( const status = await ml.dataFrameAnalytics.deleteDataFrameAnalyticsAndDestIndex( analyticsConfig.id, deleteDestIndex, - deleteDestIndexPattern + deleteDestDataView ); if (status.analyticsJobDeleted?.success) { toastNotificationService.displaySuccessToast( @@ -97,7 +97,7 @@ export const deleteAnalyticsAndDestIndex = async ( ); } - if (status.destIndexPatternDeleted?.success) { + if (status.destDataViewDeleted?.success) { toastNotificationService.displaySuccessToast( i18n.translate( 'xpack.ml.dataframe.analyticsList.deleteAnalyticsWithDataViewSuccessMessage', @@ -108,8 +108,8 @@ export const deleteAnalyticsAndDestIndex = async ( ) ); } - if (status.destIndexPatternDeleted?.error) { - const error = extractErrorMessage(status.destIndexPatternDeleted.error); + if (status.destDataViewDeleted?.error) { + const error = extractErrorMessage(status.destDataViewDeleted.error); toastNotificationService.displayDangerToast( i18n.translate('xpack.ml.dataframe.analyticsList.deleteAnalyticsWithDataViewErrorMessage', { defaultMessage: 'An error occurred deleting data view {destinationIndex}: {error}', diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js index 51fbb39f9f733..169f739de41cd 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_chart_distribution.js @@ -177,7 +177,7 @@ export class ExplorerChartDistribution extends React.Component { .rangePoints([rowMargin, chartHeight - rowMargin]) .domain(scaleCategories); } else { - throw `chartType '${chartType}' not supported`; + throw new Error(`chartType '${chartType}' not supported`); } const yAxis = d3.svg diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index 721f0958ba5fe..d202ffbd38b3f 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -160,6 +160,7 @@ export interface SwimlaneProps { showYAxis?: boolean; yAxisWidth?: HeatmapStyle['yAxisLabel']['width']; chartsService: ChartsPluginStart; + onRenderComplete?: () => void; } /** @@ -187,6 +188,7 @@ export const SwimlaneContainer: FC = ({ showLegend = true, 'data-test-subj': dataTestSubj, yAxisWidth, + onRenderComplete, }) => { const [chartWidth, setChartWidth] = useState(0); @@ -453,6 +455,11 @@ export const SwimlaneContainer: FC = ({ debugState={window._echDebugStateFlag ?? false} onBrushEnd={onBrushEnd as BrushEndListener} locale={i18n.getLocale()} + onRenderChange={(isRendered) => { + if (isRendered && onRenderComplete) { + onRenderComplete(); + } + }} /> j.blocked !== undefined)) { + if ( + blockingJobsRefreshTimeout === null && + jobsSummaryList.some((j) => j.blocked !== undefined) + ) { // if there are some jobs in a deleting state, start polling for // deleting jobs so we can update the jobs list once the // deleting tasks are over diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts index 4b4ce72992775..f5f491426b0a3 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_dashboard/quick_create_job_base.ts @@ -69,21 +69,21 @@ export class QuickJobCreatorBase { datafeedConfig, jobConfig, createdByLabel, - dashboard, start, end, startJob, runInRealTime, + dashboard, }: { jobId: string; datafeedConfig: Datafeed; jobConfig: Job; createdByLabel: CREATED_BY_LABEL; - dashboard: Dashboard; start: number | undefined; end: number | undefined; startJob: boolean; runInRealTime: boolean; + dashboard?: Dashboard; }) { const datafeedId = createDatafeedId(jobId); const datafeed = { ...datafeedConfig, job_id: jobId, datafeed_id: datafeedId }; @@ -93,7 +93,7 @@ export class QuickJobCreatorBase { job_id: jobId, custom_settings: { created_by: createdByLabel, - ...(await this.getCustomUrls(dashboard, datafeed)), + ...(dashboard ? await this.getCustomUrls(dashboard, datafeed) : {}), }, }; @@ -230,7 +230,7 @@ export class QuickJobCreatorBase { return mergedQueries; } - protected async createDashboardLink(dashboard: Dashboard, datafeedConfig: estypes.MlDatafeed) { + private async createDashboardLink(dashboard: Dashboard, datafeedConfig: estypes.MlDatafeed) { const dashboardTitle = dashboard?.getTitle(); if (dashboardTitle === undefined || dashboardTitle === '') { // embeddable may have not been in a dashboard @@ -274,7 +274,7 @@ export class QuickJobCreatorBase { return { url_name: urlName, url_value: url, time_range: 'auto' }; } - protected async getCustomUrls(dashboard: Dashboard, datafeedConfig: estypes.MlDatafeed) { + private async getCustomUrls(dashboard: Dashboard, datafeedConfig: estypes.MlDatafeed) { const customUrls = await this.createDashboardLink(dashboard, datafeedConfig); return dashboard !== undefined && customUrls !== null ? { custom_urls: [customUrls] } : {}; } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts index 2ade08c3cf23d..4df2b74347f47 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/quick_create_job.ts @@ -135,7 +135,7 @@ export class QuickLensJobCreator extends QuickJobCreatorBase { } } - async createJob( + private async createJob( chartInfo: ChartInfo, startString: string, endString: string, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts index 9dcce1facf298..c8ad1ee6942e4 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_lens/route_resolver.ts @@ -15,7 +15,7 @@ import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import { QuickLensJobCreator } from './quick_create_job'; import type { MlApiServices } from '../../../services/ml_api_service'; -import { getDefaultQuery } from '../utils/new_job_utils'; +import { getDefaultQuery, getRisonValue } from '../utils/new_job_utils'; interface Dependencies { lens: LensPublicStart; @@ -27,8 +27,8 @@ interface Dependencies { export async function resolver( deps: Dependencies, lensSavedObjectRisonString: string | undefined, - fromRisonStrong: string, - toRisonStrong: string, + fromRisonString: string, + toRisonString: string, queryRisonString: string, filtersRisonString: string, layerIndexRisonString: string @@ -43,37 +43,11 @@ export async function resolver( throw new Error('Cannot create visualization'); } - let query: Query; - let filters: Filter[]; - try { - query = rison.decode(queryRisonString) as Query; - } catch (error) { - query = getDefaultQuery(); - } - try { - filters = rison.decode(filtersRisonString) as Filter[]; - } catch (error) { - filters = []; - } - - let from: string; - let to: string; - try { - from = rison.decode(fromRisonStrong) as string; - } catch (error) { - from = ''; - } - try { - to = rison.decode(toRisonStrong) as string; - } catch (error) { - to = ''; - } - let layerIndex: number | undefined; - try { - layerIndex = rison.decode(layerIndexRisonString) as number; - } catch (error) { - layerIndex = undefined; - } + const query = getRisonValue(queryRisonString, getDefaultQuery()) as Query; + const filters = getRisonValue(filtersRisonString, []); + const from = getRisonValue(fromRisonString, ''); + const to = getRisonValue(toRisonString, ''); + const layerIndex = getRisonValue(layerIndexRisonString, undefined); const jobCreator = new QuickLensJobCreator( lens, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts index e590600cd4047..954abd2d14abc 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/quick_create_job.ts @@ -162,7 +162,7 @@ export class QuickGeoJobCreator extends QuickJobCreatorBase { } } - async createGeoJob({ + private async createGeoJob({ dataViewId, sourceDataView, from, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts index 39753c77038ca..0728ca3c61d59 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_map/route_resolver.ts @@ -5,16 +5,13 @@ * 2.0. */ -import rison from '@kbn/rison'; -import type { Query } from '@kbn/es-query'; -import type { Filter } from '@kbn/es-query'; import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import type { TimefilterContract } from '@kbn/data-plugin/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import type { MlApiServices } from '../../../services/ml_api_service'; import { QuickGeoJobCreator } from './quick_create_job'; -import { getDefaultQuery } from '../utils/new_job_utils'; +import { getDefaultQuery, getRisonValue } from '../utils/new_job_utils'; interface Dependencies { kibanaConfig: IUiSettingsClient; @@ -24,66 +21,32 @@ interface Dependencies { } export async function resolver( deps: Dependencies, - dashboard: string, - dataViewId: string, - embeddable: string, - geoField: string, - splitField: string, + dashboardRisonString: string, + dataViewIdRisonString: string, + embeddableRisonString: string, + geoFieldRisonString: string, + splitFieldRisonString: string, fromRisonString: string, toRisonString: string, - layer?: string + layerRisonString?: string ) { const { kibanaConfig, timeFilter, dashboardService, mlApiServices } = deps; - let decodedDashboard; - let decodedEmbeddable; - let decodedLayer; - let splitFieldDecoded; - let dvId; + const defaultLayer = { query: getDefaultQuery(), filters: [] }; - try { - dvId = rison.decode(dataViewId) as string; - } catch (error) { - dvId = ''; - } + const dashboard = getRisonValue(dashboardRisonString, defaultLayer); + const embeddable = getRisonValue(embeddableRisonString, defaultLayer); - try { - decodedDashboard = rison.decode(dashboard) as { query: Query; filters: Filter[] }; - } catch (error) { - decodedDashboard = { query: getDefaultQuery(), filters: [] }; - } + const layer = + layerRisonString !== undefined + ? getRisonValue(layerRisonString, defaultLayer) + : defaultLayer; - try { - decodedEmbeddable = rison.decode(embeddable) as { query: Query; filters: Filter[] }; - } catch (error) { - decodedEmbeddable = { query: getDefaultQuery(), filters: [] }; - } + const geoField = getRisonValue(geoFieldRisonString, ''); + const splitField = getRisonValue(splitFieldRisonString, null); + const dataViewId = getRisonValue(dataViewIdRisonString, ''); - if (layer) { - try { - decodedLayer = rison.decode(layer) as { query: Query }; - } catch (error) { - decodedLayer = { query: getDefaultQuery(), filters: [] }; - } - } - - try { - splitFieldDecoded = rison.decode(splitField) as string; - } catch (error) { - splitFieldDecoded = null; - } - - let from: string; - let to: string; - try { - from = rison.decode(fromRisonString) as string; - } catch (error) { - from = ''; - } - try { - to = rison.decode(toRisonString) as string; - } catch (error) { - to = ''; - } + const from = getRisonValue(fromRisonString, ''); + const to = getRisonValue(toRisonString, ''); const jobCreator = new QuickGeoJobCreator( kibanaConfig, @@ -93,15 +56,15 @@ export async function resolver( ); await jobCreator.createAndStashGeoJob( - dvId, + dataViewId, from, to, - decodedDashboard.query, - decodedDashboard.filters, - decodedEmbeddable.query, - decodedEmbeddable.filters, + dashboard.query, + dashboard.filters, + embeddable.query, + embeddable.filters, geoField, - splitFieldDecoded, - decodedLayer?.query + splitField, + layer?.query ); } diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/index.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/index.ts new file mode 100644 index 0000000000000..51b3194f28c95 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { + QuickCategorizationJobCreator, + CATEGORIZATION_TYPE, + type CategorizationType, +} from './quick_create_job'; + +export { resolver } from './route_resolver'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/quick_create_job.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/quick_create_job.ts new file mode 100644 index 0000000000000..721d48d1908b6 --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/quick_create_job.ts @@ -0,0 +1,209 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { IUiSettingsClient } from '@kbn/core/public'; +import type { DataPublicPluginStart, TimefilterContract } from '@kbn/data-plugin/public'; +import type { DashboardStart } from '@kbn/dashboard-plugin/public'; +import { DataViewField, DataView } from '@kbn/data-views-plugin/common'; +import type { TimeRange } from '@kbn/es-query'; +import { i18n } from '@kbn/i18n'; +import { MLCATEGORY, ML_JOB_AGGREGATION } from '@kbn/ml-anomaly-utils'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { CREATED_BY_LABEL, DEFAULT_BUCKET_SPAN } from '../../../../../common/constants/new_job'; +import { type CreateState, QuickJobCreatorBase } from '../job_from_dashboard/quick_create_job_base'; +import type { MlApiServices } from '../../../services/ml_api_service'; +import { createEmptyDatafeed, createEmptyJob } from '../common/job_creator/util/default_configs'; +import { stashJobForCloning } from '../common/job_creator/util/general'; +import type { JobCreatorType } from '../common/job_creator'; + +export const CATEGORIZATION_TYPE = { + COUNT: ML_JOB_AGGREGATION.COUNT, + RARE: ML_JOB_AGGREGATION.RARE, +} as const; + +export type CategorizationType = typeof CATEGORIZATION_TYPE[keyof typeof CATEGORIZATION_TYPE]; + +export class QuickCategorizationJobCreator extends QuickJobCreatorBase { + constructor( + kibanaConfig: IUiSettingsClient, + timeFilter: TimefilterContract, + dashboardService: DashboardStart, + private data: DataPublicPluginStart, + mlApiServices: MlApiServices + ) { + super(kibanaConfig, timeFilter, dashboardService, mlApiServices); + } + + public async createAndSaveJob( + categorizationType: CategorizationType, + jobId: string, + bucketSpan: string, + dataView: DataView, + field: DataViewField, + partitionField: DataViewField | null, + stopOnWarn: boolean, + query: QueryDslQueryContainer, + timeRange: TimeRange, + startJob: boolean, + runInRealTime: boolean + ): Promise { + if (query === undefined) { + throw new Error('Cannot create job, query and filters are undefined'); + } + + const { jobConfig, datafeedConfig, start, end } = await this.createJob( + categorizationType, + dataView, + field, + partitionField, + stopOnWarn, + timeRange, + query, + bucketSpan + ); + const createdByLabel = CREATED_BY_LABEL.CATEGORIZATION_FROM_PATTERN_ANALYSIS; + + const result = await this.putJobAndDataFeed({ + jobId, + datafeedConfig, + jobConfig, + createdByLabel, + start, + end, + startJob, + runInRealTime, + }); + return result; + } + + public async createAndStashADJob( + categorizationType: CategorizationType, + dataViewId: string, + fieldName: string, + partitionFieldName: string | null, + stopOnWarn: boolean, + startString: string, + endString: string, + query: QueryDslQueryContainer + ) { + try { + const dataView = await this.data.dataViews.get(dataViewId); + const field = dataView.getFieldByName(fieldName); + const partitionField = partitionFieldName + ? dataView.getFieldByName(partitionFieldName) ?? null + : null; + + if (field === undefined) { + throw new Error('Cannot create job, field is undefined'); + } + + const { jobConfig, datafeedConfig, start, end, includeTimeRange } = await this.createJob( + categorizationType, + dataView, + field, + partitionField, + stopOnWarn, + { from: startString, to: endString }, + query, + DEFAULT_BUCKET_SPAN + ); + + // add job config and start and end dates to the + // job cloning stash, so they can be used + // by the new job wizards + stashJobForCloning( + { + jobConfig, + datafeedConfig, + createdBy: CREATED_BY_LABEL.CATEGORIZATION_FROM_PATTERN_ANALYSIS, + start, + end, + } as JobCreatorType, + true, + includeTimeRange, + !includeTimeRange + ); + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + } + } + + private async createJob( + categorizationType: CategorizationType, + dataView: DataView, + field: DataViewField, + partitionField: DataViewField | null, + stopOnWarn: boolean, + timeRange: TimeRange, + query: QueryDslQueryContainer, + bucketSpan: string + ) { + const jobConfig = createEmptyJob(); + const datafeedConfig = createEmptyDatafeed(dataView.getIndexPattern()); + + datafeedConfig.query = query; + jobConfig.analysis_config = { + categorization_field_name: field.name, + per_partition_categorization: { + enabled: partitionField !== null, + stop_on_warn: stopOnWarn, + }, + influencers: [MLCATEGORY], + detectors: [ + { + function: categorizationType, + by_field_name: MLCATEGORY, + }, + ], + bucket_span: bucketSpan, + }; + + if (partitionField !== null) { + jobConfig.analysis_config.detectors[0].partition_field_name = partitionField.name; + jobConfig.analysis_config.influencers!.push(partitionField.name); + } + + jobConfig.data_description.time_field = dataView.timeFieldName; + + let start: number | undefined; + let end: number | undefined; + let includeTimeRange = true; + + try { + // attempt to parse the start and end dates. + // if start and end values cannot be determined + // instruct the job cloning code to auto-select the + // full time range for the index. + const { min, max } = this.timeFilter.calculateBounds(timeRange); + start = min?.valueOf(); + end = max?.valueOf(); + + if (start === undefined || end === undefined || isNaN(start) || isNaN(end)) { + throw Error( + i18n.translate('xpack.ml.newJob.fromLens.createJob.error.timeRange', { + defaultMessage: 'Incompatible time range', + }) + ); + } + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + includeTimeRange = false; + start = undefined; + end = undefined; + } + + return { + jobConfig, + datafeedConfig, + start, + end, + includeTimeRange, + }; + } +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/route_resolver.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/route_resolver.ts new file mode 100644 index 0000000000000..0f8462128d2cf --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/route_resolver.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; +import type { DataPublicPluginStart, TimefilterContract } from '@kbn/data-plugin/public'; +import type { DashboardStart } from '@kbn/dashboard-plugin/public'; +import type { QueryDslQueryContainer } from '@kbn/data-views-plugin/common/types'; +import { + type CategorizationType, + QuickCategorizationJobCreator, + CATEGORIZATION_TYPE, +} from './quick_create_job'; +import type { MlApiServices } from '../../../services/ml_api_service'; + +import { getDefaultDatafeedQuery, getRisonValue } from '../utils/new_job_utils'; + +interface Dependencies { + kibanaConfig: IUiSettingsClient; + timeFilter: TimefilterContract; + dashboardService: DashboardStart; + data: DataPublicPluginStart; + mlApiServices: MlApiServices; +} +export async function resolver( + deps: Dependencies, + categorizationTypeRisonString: string, + dataViewIdRisonString: string, + fieldRisonString: string, + partitionFieldRisonString: string | null, + stopOnWarnRisonString: string, + fromRisonString: string, + toRisonString: string, + queryRisonString: string +) { + const { mlApiServices, timeFilter, kibanaConfig, dashboardService, data } = deps; + + const query = getRisonValue(queryRisonString, getDefaultDatafeedQuery()); + const from = getRisonValue(fromRisonString, ''); + const to = getRisonValue(toRisonString, ''); + const categorizationType = getRisonValue( + categorizationTypeRisonString, + CATEGORIZATION_TYPE.COUNT + ); + const dataViewId = getRisonValue(dataViewIdRisonString, ''); + const field = getRisonValue(fieldRisonString, ''); + const partitionField = + partitionFieldRisonString === null ? '' : getRisonValue(partitionFieldRisonString, ''); + const stopOnWarn = getRisonValue(stopOnWarnRisonString, false); + + const jobCreator = new QuickCategorizationJobCreator( + kibanaConfig, + timeFilter, + dashboardService, + data, + mlApiServices + ); + await jobCreator.createAndStashADJob( + categorizationType, + dataViewId, + field, + partitionField, + stopOnWarn, + from, + to, + query + ); +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/utils.ts b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/utils.ts new file mode 100644 index 0000000000000..4bc84a4df20dc --- /dev/null +++ b/x-pack/plugins/ml/public/application/jobs/new_job/job_from_pattern_analysis/utils.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { DataViewField, DataView } from '@kbn/data-views-plugin/common'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { SharePluginStart } from '@kbn/share-plugin/public'; +import type { TimeRange } from '@kbn/es-query'; +import { ML_APP_LOCATOR } from '../../../../../common/constants/locator'; +import { ML_PAGES } from '../../../../locator'; +import type { CategorizationType } from './quick_create_job'; + +export async function redirectToADJobWizards( + categorizationType: CategorizationType, + dataView: DataView, + field: DataViewField, + partitionField: DataViewField | null, + stopOnWarn: boolean, + query: QueryDslQueryContainer, + timeRange: TimeRange, + share: SharePluginStart +) { + const locator = share.url.locators.get(ML_APP_LOCATOR)!; + + const url = await locator.getUrl({ + page: ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_PATTERN_ANALYSIS, + pageState: { + categorizationType, + dataViewId: dataView.id, + field: field.name, + partitionField: partitionField?.name || null, + stopOnWarn, + from: timeRange.from, + to: timeRange.to, + query: JSON.stringify(query), + }, + }); + + window.open(url, '_blank'); +} diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts index b13cde5e94ccd..ba31ff5e4cd94 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts @@ -55,6 +55,7 @@ async function getWizardUrlFromCloningJob(createdBy: string | undefined, dataVie page = JOB_TYPE.POPULATION; break; case CREATED_BY_LABEL.CATEGORIZATION: + case CREATED_BY_LABEL.CATEGORIZATION_FROM_PATTERN_ANALYSIS: page = JOB_TYPE.CATEGORIZATION; break; case CREATED_BY_LABEL.RARE: diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/utils/new_job_utils.ts b/x-pack/plugins/ml/public/application/jobs/new_job/utils/new_job_utils.ts index 32fd17c9d1f10..eef866da2d287 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/utils/new_job_utils.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/utils/new_job_utils.ts @@ -7,6 +7,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { cloneDeep } from 'lodash'; +import rison from '@kbn/rison'; import { Query, fromKueryExpression, @@ -162,3 +163,14 @@ export function checkCardinalitySuccess(data: any) { return response; } + +export function getRisonValue( + risonString: string, + defaultValue: T +) { + try { + return rison.decode(risonString) as T; + } catch (error) { + return defaultValue; + } +} diff --git a/x-pack/plugins/ml/public/application/model_management/deployment_setup.tsx b/x-pack/plugins/ml/public/application/model_management/deployment_setup.tsx index 3ac6960af55ca..102af34d3e95d 100644 --- a/x-pack/plugins/ml/public/application/model_management/deployment_setup.tsx +++ b/x-pack/plugins/ml/public/application/model_management/deployment_setup.tsx @@ -31,7 +31,7 @@ import type { I18nStart, OverlayStart, ThemeServiceStart } from '@kbn/core/publi import { css } from '@emotion/react'; import { numberValidator } from '@kbn/ml-agg-utils'; import { toMountPoint } from '@kbn/react-kibana-mount'; -import { isCloudTrial } from '../services/ml_server_info'; +import { getNewJobLimits, isCloudTrial } from '../services/ml_server_info'; import { composeValidators, dictionaryValidator, @@ -42,7 +42,7 @@ import { ModelItem } from './models_list'; interface DeploymentSetupProps { config: ThreadingParams; onConfigChange: (config: ThreadingParams) => void; - errors: Partial>; + errors: Partial>>; isUpdate?: boolean; deploymentsParams?: Record; } @@ -66,6 +66,11 @@ export const DeploymentSetup: FC = ({ isUpdate, deploymentsParams, }) => { + const { + total_ml_processors: totalMlProcessors, + max_single_ml_node_processors: maxSingleMlNodeProcessors, + } = getNewJobLimits(); + const numOfAllocation = config.numOfAllocations; const threadsPerAllocations = config.threadsPerAllocations; @@ -76,17 +81,20 @@ export const DeploymentSetup: FC = ({ const threadsPerAllocationsOptions = useMemo( () => - new Array(THREADS_MAX_EXPONENT).fill(null).map((v, i) => { - const value = Math.pow(2, i); - const id = value.toString(); - - return { - id, - label: id, - value, - }; - }), - [] + new Array(THREADS_MAX_EXPONENT) + .fill(null) + .map((v, i) => Math.pow(2, i)) + .filter(maxSingleMlNodeProcessors ? (v) => v <= maxSingleMlNodeProcessors : (v) => true) + .map((value) => { + const id = value.toString(); + + return { + id, + label: id, + value, + }; + }), + [maxSingleMlNodeProcessors] ); const disableThreadingControls = config.priority === 'low'; @@ -251,11 +259,28 @@ export const DeploymentSetup: FC = ({ } hasChildLabel={false} isDisabled={disableThreadingControls} + isInvalid={!!errors.numOfAllocations} + error={ + errors?.numOfAllocations?.min ? ( + + ) : errors?.numOfAllocations?.max ? ( + + ) : null + } > = ({ }) => { const isUpdate = !!initialParams; + const { total_ml_processors: totalMlProcessors } = getNewJobLimits(); + const [config, setConfig] = useState( initialParams ?? { numOfAllocations: 1, @@ -373,7 +400,7 @@ export const StartUpdateDeploymentModal: FC = ({ const numOfAllocationsValidator = composeValidators( requiredValidator(), - numberValidator({ min: 1, integerOnly: true }) + numberValidator({ min: 1, max: totalMlProcessors, integerOnly: true }) ); const numOfAllocationsErrors = numOfAllocationsValidator(config.numOfAllocations); diff --git a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx index 7c39528cf5b4a..0b6600e981f01 100644 --- a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx +++ b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx @@ -130,18 +130,19 @@ export function useModelActions({ return useMemo( () => [ { - name: i18n.translate('xpack.ml.trainedModels.modelsList.viewTrainingDataActionLabel', { + name: i18n.translate('xpack.ml.trainedModels.modelsList.viewTrainingDataNameActionLabel', { defaultMessage: 'View training data', }), description: i18n.translate( 'xpack.ml.trainedModels.modelsList.viewTrainingDataActionLabel', { - defaultMessage: 'View training data', + defaultMessage: 'Training data can be viewed when data frame analytics job exists.', } ), icon: 'visTable', type: 'icon', available: (item) => !!item.metadata?.analytics_config?.id, + enabled: (item) => item.origin_job_exists === true, onClick: async (item) => { if (item.metadata?.analytics_config === undefined) return; @@ -164,7 +165,6 @@ export function useModelActions({ await navigateToUrl(url); }, - isPrimary: true, }, { name: i18n.translate('xpack.ml.inference.modelsList.analyticsMapActionLabel', { @@ -481,7 +481,7 @@ export function useModelActions({ ); }, enabled: (item) => { - return item.state !== MODEL_STATE.STARTED; + return canStartStopTrainedModels && item.state !== MODEL_STATE.STARTED; }, }, { diff --git a/x-pack/plugins/ml/public/application/model_management/models_list.tsx b/x-pack/plugins/ml/public/application/model_management/models_list.tsx index 56486d1bbbd4f..e9672729b6f4f 100644 --- a/x-pack/plugins/ml/public/application/model_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/model_management/models_list.tsx @@ -79,6 +79,7 @@ export type ModelItem = TrainedModelConfigResponse & { type?: string[]; stats?: Stats & { deployment_stats: TrainedModelDeploymentStatsResponse[] }; pipelines?: ModelPipelines['pipelines'] | null; + origin_job_exists?: boolean; deployment_ids: string[]; putModelConfig?: object; state: ModelState; diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/from_pattern_analysis.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_pattern_analysis.tsx new file mode 100644 index 0000000000000..1ac93184f201e --- /dev/null +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/from_pattern_analysis.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { Redirect } from 'react-router-dom'; +import { parse } from 'query-string'; +import { useMlKibana } from '../../../contexts/kibana'; +import { ML_PAGES } from '../../../../locator'; +import { createPath, MlRoute, PageLoader, PageProps } from '../../router'; +import { useRouteResolver } from '../../use_resolver'; +import { resolver } from '../../../jobs/new_job/job_from_pattern_analysis'; + +export const fromPatternAnalysisRouteFactory = (): MlRoute => ({ + path: createPath(ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_PATTERN_ANALYSIS), + render: (props, deps) => , + breadcrumbs: [], +}); + +const PageWrapper: FC = ({ location }) => { + const { + categorizationType, + dataViewId, + field, + partitionField, + stopOnWarn, + from, + to, + query, + }: Record = parse(location.search, { + sort: false, + }); + const { + services: { + data, + dashboard: dashboardService, + uiSettings: kibanaConfig, + mlServices: { mlApiServices }, + }, + } = useMlKibana(); + + const { context } = useRouteResolver('full', ['canCreateJob'], { + redirect: () => + resolver( + { + mlApiServices, + timeFilter: data.query.timefilter.timefilter, + kibanaConfig, + dashboardService, + data, + }, + categorizationType, + dataViewId, + field, + partitionField, + stopOnWarn, + from, + to, + query + ), + }); + + return ( + + {} + + ); +}; diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/index.ts b/x-pack/plugins/ml/public/application/routing/routes/new_job/index.ts index 675b391d1e826..d4876aba2444e 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/index.ts +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/index.ts @@ -12,3 +12,4 @@ export * from './wizard'; export * from './recognize'; export * from './from_lens'; export * from './from_map'; +export * from './from_pattern_analysis'; diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/data_frame_analytics.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/data_frame_analytics.ts index 9d9d0f859655e..6381f8d6e5143 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/data_frame_analytics.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/data_frame_analytics.ts @@ -49,7 +49,7 @@ export interface DeleteDataFrameAnalyticsWithIndexResponse { acknowledged: boolean; analyticsJobDeleted: DeleteDataFrameAnalyticsWithIndexStatus; destIndexDeleted: DeleteDataFrameAnalyticsWithIndexStatus; - destIndexPatternDeleted: DeleteDataFrameAnalyticsWithIndexStatus; + destDataViewDeleted: DeleteDataFrameAnalyticsWithIndexStatus; } export interface JobsExistsResponse { @@ -152,11 +152,11 @@ export const dataFrameAnalyticsApiProvider = (httpService: HttpService) => ({ deleteDataFrameAnalyticsAndDestIndex( analyticsId: string, deleteDestIndex: boolean, - deleteDestIndexPattern: boolean + deleteDestDataView: boolean ) { return httpService.http({ path: `${ML_INTERNAL_BASE_PATH}/data_frame/analytics/${analyticsId}`, - query: { deleteDestIndex, deleteDestIndexPattern }, + query: { deleteDestIndex, deleteDestDataView }, method: 'DELETE', version: '1', }); diff --git a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts index f073c4afea844..511a1a1457b02 100644 --- a/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts +++ b/x-pack/plugins/ml/public/application/services/new_job_capabilities/new_job_capabilities_service.ts @@ -14,15 +14,21 @@ import { EVENT_RATE_FIELD_ID, } from '@kbn/ml-anomaly-utils'; import { getGeoFields, filterCategoryFields } from '../../../../common/util/fields_utils'; -import { ml } from '../ml_api_service'; +import { ml, type MlApiServices } from '../ml_api_service'; import { processTextAndKeywordFields, NewJobCapabilitiesServiceBase } from './new_job_capabilities'; -class NewJobCapsService extends NewJobCapabilitiesServiceBase { +export class NewJobCapsService extends NewJobCapabilitiesServiceBase { private _catFields: Field[] = []; private _dateFields: Field[] = []; private _geoFields: Field[] = []; private _includeEventRateField: boolean = true; private _removeTextFields: boolean = true; + private _mlApiService: MlApiServices; + + constructor(mlApiService: MlApiServices) { + super(); + this._mlApiService = mlApiService; + } public get catFields(): Field[] { return this._catFields; @@ -49,7 +55,10 @@ class NewJobCapsService extends NewJobCapabilitiesServiceBase { this._includeEventRateField = includeEventRateField; this._removeTextFields = removeTextFields; - const resp = await ml.jobs.newJobCaps(dataView.getIndexPattern(), dataView.type === 'rollup'); + const resp = await this._mlApiService.jobs.newJobCaps( + dataView.getIndexPattern(), + dataView.type === 'rollup' + ); const { fields: allFields, aggs } = createObjects(resp, dataView.getIndexPattern()); if (this._includeEventRateField === true) { @@ -175,4 +184,4 @@ function addEventRateField(aggs: Aggregation[], fields: Field[]) { fields.splice(0, 0, eventRateField); } -export const newJobCapsService = new NewJobCapsService(); +export const newJobCapsService = new NewJobCapsService(ml); diff --git a/x-pack/plugins/ml/public/application/util/index_utils.ts b/x-pack/plugins/ml/public/application/util/index_utils.ts index faa663e579bc5..4bca137d4e507 100644 --- a/x-pack/plugins/ml/public/application/util/index_utils.ts +++ b/x-pack/plugins/ml/public/application/util/index_utils.ts @@ -129,6 +129,6 @@ export function timeBasedIndexCheck(dataView: DataView, showNotification = false * Returns true if the data view index pattern contains a : * which means it is cross-cluster */ -export function isCcsIndexPattern(dataViewIndexPattern: string) { - return dataViewIndexPattern.includes(':'); +export function isCcsIndexPattern(indexPattern: string) { + return indexPattern.includes(':'); } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx index 7186148caf6e4..27322086dc014 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx @@ -79,7 +79,7 @@ export const EmbeddableSwimLaneContainer: FC = ( services, chartWidth, fromPage, - { onRenderComplete, onError, onLoading } + { onError, onLoading } ); useEffect(() => { @@ -171,6 +171,7 @@ export const EmbeddableSwimLaneContainer: FC = ( /> } chartsService={chartsService} + onRenderComplete={onRenderComplete} />
    ); diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts index eace431179dad..4e0f491007cd0 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts @@ -22,7 +22,6 @@ describe('useSwimlaneInputResolver', () => { const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); const renderCallbacks = { - onRenderComplete: jest.fn(), onLoading: jest.fn(), onError: jest.fn(), }; @@ -113,7 +112,6 @@ describe('useSwimlaneInputResolver', () => { expect(services[2].anomalyTimelineService.loadOverallData).toHaveBeenCalledTimes(1); expect(renderCallbacks.onLoading).toHaveBeenCalledTimes(1); - expect(renderCallbacks.onRenderComplete).toHaveBeenCalledTimes(1); await act(async () => { embeddableInput.next({ @@ -130,7 +128,6 @@ describe('useSwimlaneInputResolver', () => { expect(services[2].anomalyTimelineService.loadOverallData).toHaveBeenCalledTimes(2); expect(renderCallbacks.onLoading).toHaveBeenCalledTimes(2); - expect(renderCallbacks.onRenderComplete).toHaveBeenCalledTimes(2); await act(async () => { embeddableInput.next({ @@ -147,7 +144,6 @@ describe('useSwimlaneInputResolver', () => { expect(services[2].anomalyTimelineService.loadOverallData).toHaveBeenCalledTimes(3); expect(renderCallbacks.onLoading).toHaveBeenCalledTimes(3); - expect(renderCallbacks.onRenderComplete).toHaveBeenCalledTimes(3); }); test('should not complete the observable on error', async () => { diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts index d543ff4cc9bf1..8669c3b7bd523 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts @@ -50,8 +50,7 @@ export function useSwimlaneInputResolver( services: [CoreStart, MlStartDependencies, AnomalySwimlaneServices], chartWidth: number, fromPage: number, - renderCallbacks: { - onRenderComplete: () => void; + reportingCallbacks: { onLoading: () => void; onError: (error: Error) => void; } @@ -131,7 +130,7 @@ export function useSwimlaneInputResolver( tap(setIsLoading.bind(null, true)), debounceTime(FETCH_RESULTS_DEBOUNCE_MS), tap(() => { - renderCallbacks.onLoading(); + reportingCallbacks.onLoading(); }), switchMap(([explorerJobs, input, bucketInterval, fromPageInput, perPageFromState]) => { if (!explorerJobs) { @@ -246,18 +245,11 @@ export function useSwimlaneInputResolver( useEffect(() => { if (error) { - renderCallbacks.onError(error); + reportingCallbacks.onError(error); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [error]); - useEffect(() => { - if (swimlaneData) { - renderCallbacks.onRenderComplete(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [swimlaneData]); - return [ swimlaneType, swimlaneData, diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/create_job.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/create_job.tsx new file mode 100644 index 0000000000000..5e52b0f5cd212 --- /dev/null +++ b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/create_job.tsx @@ -0,0 +1,273 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC, useCallback, useMemo, useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { + EuiCheckableCard, + EuiTitle, + EuiSpacer, + EuiSwitch, + EuiHorizontalRule, + EuiComboBoxOptionOption, + EuiComboBox, + EuiFormRow, + EuiCallOut, +} from '@elastic/eui'; + +import type { DataViewField, DataView } from '@kbn/data-views-plugin/common'; +import type { TimeRange } from '@kbn/es-query'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { redirectToADJobWizards } from '../../../../application/jobs/new_job/job_from_pattern_analysis/utils'; +import { createFieldOptions } from '../../../../application/jobs/new_job/common/job_creator/util/general'; +import { NewJobCapsService } from '../../../../application/services/new_job_capabilities/new_job_capabilities_service'; +import { + type CategorizationType, + CATEGORIZATION_TYPE, + QuickCategorizationJobCreator, +} from '../../../../application/jobs/new_job/job_from_pattern_analysis'; +import { useMlFromLensKibanaContext } from '../../common/context'; +import { JobDetails, type CreateADJobParams } from '../../common/job_details'; + +interface Props { + dataView: DataView; + field: DataViewField; + query: QueryDslQueryContainer; + timeRange: TimeRange; +} + +export const CreateJob: FC = ({ dataView, field, query, timeRange }) => { + const { + services: { + data, + share, + uiSettings, + mlServices: { mlApiServices }, + dashboardService, + }, + } = useMlFromLensKibanaContext(); + + const [categorizationType, setCategorizationType] = useState( + CATEGORIZATION_TYPE.COUNT + ); + const [enablePerPartitionCategorization, setEnablePerPartitionCategorization] = useState(false); + const [stopOnWarn, setStopOnWarn] = useState(false); + const [categoryFieldOptions, setCategoryFieldsOptions] = useState([]); + const [selectedPartitionFieldOptions, setSelectedPartitionFieldOptions] = useState< + EuiComboBoxOptionOption[] + >([]); + const [formComplete, setFormComplete] = useState(undefined); + + const toggleEnablePerPartitionCategorization = useCallback( + () => setEnablePerPartitionCategorization(!enablePerPartitionCategorization), + [enablePerPartitionCategorization] + ); + + const toggleStopOnWarn = useCallback(() => setStopOnWarn(!stopOnWarn), [stopOnWarn]); + + useMemo(() => { + const newJobCapsService = new NewJobCapsService(mlApiServices); + newJobCapsService.initializeFromDataVIew(dataView).then(() => { + const options: EuiComboBoxOptionOption[] = [ + ...createFieldOptions(newJobCapsService.categoryFields, []), + ].map((o) => ({ + ...o, + })); + setCategoryFieldsOptions(options); + }); + }, [dataView, mlApiServices]); + + const quickJobCreator = useMemo( + () => + new QuickCategorizationJobCreator( + uiSettings, + data.query.timefilter.timefilter, + dashboardService, + data, + mlApiServices + ), + + [dashboardService, data, mlApiServices, uiSettings] + ); + + function createADJobInWizard() { + const partitionField = selectedPartitionFieldOptions.length + ? dataView.getFieldByName(selectedPartitionFieldOptions[0].label) ?? null + : null; + redirectToADJobWizards( + categorizationType, + dataView, + field, + partitionField, + stopOnWarn, + query, + timeRange, + share + ); + } + + useEffect(() => { + setSelectedPartitionFieldOptions([]); + setStopOnWarn(false); + }, [enablePerPartitionCategorization]); + + useEffect(() => { + setFormComplete( + enablePerPartitionCategorization === false || selectedPartitionFieldOptions.length > 0 + ); + }, [enablePerPartitionCategorization, selectedPartitionFieldOptions]); + + async function createADJob({ jobId, bucketSpan, startJob, runInRealTime }: CreateADJobParams) { + const partitionField = selectedPartitionFieldOptions.length + ? dataView.getFieldByName(selectedPartitionFieldOptions[0].label) ?? null + : null; + const result = await quickJobCreator.createAndSaveJob( + categorizationType, + jobId, + bucketSpan, + dataView, + field, + partitionField, + stopOnWarn, + query, + timeRange, + startJob, + runInRealTime + ); + return result; + } + return ( + + <> + + +
    + +
    +
    + + + + } + checked={categorizationType === CATEGORIZATION_TYPE.COUNT} + onChange={() => setCategorizationType(CATEGORIZATION_TYPE.COUNT)} + /> + + + + + +
    + +
    +
    + + + + } + checked={categorizationType === CATEGORIZATION_TYPE.RARE} + onChange={() => setCategorizationType(CATEGORIZATION_TYPE.RARE)} + /> + + + } + /> + + {enablePerPartitionCategorization ? ( + <> + + + + } + /> + + + + + } + > + + + + + + + } + /> + + ) : null} + + + + + +
    + ); +}; diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/flyout.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/flyout.tsx new file mode 100644 index 0000000000000..48781b1776141 --- /dev/null +++ b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/flyout.tsx @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiFlyoutBody, + EuiTitle, + EuiSpacer, + EuiText, +} from '@elastic/eui'; + +import type { DataViewField, DataView } from '@kbn/data-views-plugin/common'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { TimeRange } from '@kbn/es-query'; +import { CreateJob } from './create_job'; + +interface Props { + dataView: DataView; + field: DataViewField; + query: QueryDslQueryContainer; + timeRange: TimeRange; + onClose: () => void; +} + +export const CreateCategorizationJobFlyout: FC = ({ + onClose, + dataView, + field, + query, + timeRange, +}) => { + return ( + <> + + +

    + +

    +
    + + + + +
    + + + + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/index.ts b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/index.ts new file mode 100644 index 0000000000000..ab544dc3d55bd --- /dev/null +++ b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/flyout/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 { CreateCategorizationJobFlyout } from './flyout'; diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/aiops/index.ts b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/index.ts new file mode 100644 index 0000000000000..a156caa5ef57a --- /dev/null +++ b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/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 { showPatternAnalysisToADJobFlyout } from './show_flyout'; diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/aiops/show_flyout.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/show_flyout.tsx new file mode 100644 index 0000000000000..c1fe261cbe927 --- /dev/null +++ b/x-pack/plugins/ml/public/embeddables/job_creation/aiops/show_flyout.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import type { CoreStart } from '@kbn/core/public'; +import type { SharePluginStart } from '@kbn/share-plugin/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { LensPublicStart } from '@kbn/lens-plugin/public'; +import type { DashboardStart } from '@kbn/dashboard-plugin/public'; +import type { DataView, DataViewField } from '@kbn/data-views-plugin/common'; +import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { TimeRange } from '@kbn/es-query'; +import { createFlyout, type FlyoutComponentProps } from '../common/create_flyout'; +import { CreateCategorizationJobFlyout } from './flyout'; + +export async function showPatternAnalysisToADJobFlyout( + dataView: DataView, + field: DataViewField, + query: QueryDslQueryContainer, + timeRange: TimeRange, + coreStart: CoreStart, + share: SharePluginStart, + data: DataPublicPluginStart, + dashboardService: DashboardStart, + lens?: LensPublicStart +): Promise { + const Comp: FC = ({ onClose }) => ( + + ); + return createFlyout(Comp, coreStart, share, data, dashboardService, lens); +} diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/lens/context.ts b/x-pack/plugins/ml/public/embeddables/job_creation/common/context.ts similarity index 100% rename from x-pack/plugins/ml/public/embeddables/job_creation/lens/context.ts rename to x-pack/plugins/ml/public/embeddables/job_creation/common/context.ts diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/common/create_flyout.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/common/create_flyout.tsx index 7fd5f9e86fca8..b1bc9ec47ba94 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/common/create_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/common/create_flyout.tsx @@ -14,15 +14,16 @@ import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; -import type { MapEmbeddable } from '@kbn/maps-plugin/public'; -import type { Embeddable } from '@kbn/lens-plugin/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import { getMlGlobalServices } from '../../../application/app'; +export interface FlyoutComponentProps { + onClose: () => void; +} + export function createFlyout( FlyoutComponent: React.FunctionComponent, - embeddable: MapEmbeddable | Embeddable, coreStart: CoreStart, share: SharePluginStart, data: DataPublicPluginStart, @@ -57,7 +58,6 @@ export function createFlyout( }} > { onFlyoutClose(); resolve(); diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx index e2fff3bd286cf..312d75a2a97b7 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/common/job_details.tsx @@ -32,6 +32,7 @@ import type { Embeddable } from '@kbn/lens-plugin/public'; import type { MapEmbeddable } from '@kbn/maps-plugin/public'; import { extractErrorMessage } from '@kbn/ml-error-utils'; +import type { TimeRange } from '@kbn/es-query'; import { QuickLensJobCreator } from '../../../application/jobs/new_job/job_from_lens'; import type { LayerResult } from '../../../application/jobs/new_job/job_from_lens'; import type { CreateState } from '../../../application/jobs/new_job/job_from_dashboard'; @@ -40,12 +41,12 @@ import { basicJobValidation } from '../../../../common/util/job_utils'; import { JOB_ID_MAX_LENGTH } from '../../../../common/constants/validation'; import { invalidTimeIntervalMessage } from '../../../application/jobs/new_job/common/job_validator/util'; import { ML_APP_LOCATOR, ML_PAGES } from '../../../../common/constants/locator'; -import { useMlFromLensKibanaContext } from '../lens/context'; +import { useMlFromLensKibanaContext } from './context'; export interface CreateADJobParams { jobId: string; bucketSpan: string; - embeddable: MapEmbeddable | Embeddable; + embeddable: MapEmbeddable | Embeddable | undefined; startJob: boolean; runInRealTime: boolean; } @@ -56,8 +57,10 @@ interface Props { createADJob: (args: CreateADJobParams) => Promise; layer?: LayerResult; layerIndex: number; - embeddable: Embeddable | MapEmbeddable; + embeddable: Embeddable | MapEmbeddable | undefined; + timeRange: TimeRange | undefined; incomingCreateError?: { text: string; errorText: string }; + outerFormComplete?: boolean; } enum STATE { @@ -75,7 +78,9 @@ export const JobDetails: FC = ({ layer, layerIndex, embeddable, + timeRange, incomingCreateError, + outerFormComplete, }) => { const { services: { @@ -121,7 +126,6 @@ export const JobDetails: FC = ({ const viewResults = useCallback( async (type: JOB_TYPE | null) => { - const { timeRange } = embeddable.getInput(); const locator = share.url.locators.get(ML_APP_LOCATOR); if (locator) { const page = startJob @@ -144,7 +148,7 @@ export const JobDetails: FC = ({ application.navigateToUrl(url); } }, - [jobId, embeddable, share, application, startJob] + [share, startJob, jobId, timeRange, application] ); function setStartJobWrapper(start: boolean) { @@ -313,7 +317,8 @@ export const JobDetails: FC = ({ state === STATE.VALIDATING || jobId === '' || jobIdValidationError !== '' || - bucketSpanValidationError !== '' + bucketSpanValidationError !== '' || + outerFormComplete === false } onClick={createJob.bind(null, layerIndex)} size="s" diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/flyout.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/flyout.tsx index 06420c071c220..dc0ab2edd4a1e 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/flyout.tsx @@ -23,7 +23,7 @@ import { import { Layer } from './layer'; import type { LayerResult } from '../../../../application/jobs/new_job/job_from_lens'; import { VisualizationExtractor } from '../../../../application/jobs/new_job/job_from_lens'; -import { useMlFromLensKibanaContext } from '../context'; +import { useMlFromLensKibanaContext } from '../../common/context'; interface Props { embeddable: Embeddable; diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx index 0d024bd2d77af..d82ddbf94dd86 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx @@ -17,7 +17,7 @@ import { } from '../../../../../application/jobs/new_job/job_from_lens'; import type { LayerResult } from '../../../../../application/jobs/new_job/job_from_lens'; import { JOB_TYPE } from '../../../../../../common/constants/new_job'; -import { useMlFromLensKibanaContext } from '../../context'; +import { useMlFromLensKibanaContext } from '../../../common/context'; import { JobDetails, CreateADJobParams } from '../../../common/job_details'; interface Props { @@ -79,6 +79,7 @@ export const CompatibleLayer: FC = ({ layer, layerIndex, embeddable }) => createADJob={createADJob} createADJobInWizard={createADJobInWizard} embeddable={embeddable} + timeRange={embeddable.getInput().timeRange} layer={layer} layerIndex={layerIndex} > diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/lens/show_flyout.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/lens/show_flyout.tsx index 91e6f6f001861..375588765bd18 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/lens/show_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/lens/show_flyout.tsx @@ -5,13 +5,14 @@ * 2.0. */ +import React, { FC } from 'react'; import type { Embeddable } from '@kbn/lens-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { LensPublicStart } from '@kbn/lens-plugin/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; -import { createFlyout } from '../common/create_flyout'; +import { createFlyout, type FlyoutComponentProps } from '../common/create_flyout'; import { LensLayerSelectionFlyout } from './lens_vis_layer_selection_flyout'; export async function showLensVisToADJobFlyout( @@ -19,16 +20,11 @@ export async function showLensVisToADJobFlyout( coreStart: CoreStart, share: SharePluginStart, data: DataPublicPluginStart, - lens: LensPublicStart, - dashboardService: DashboardStart + dashboardService: DashboardStart, + lens: LensPublicStart ): Promise { - return createFlyout( - LensLayerSelectionFlyout, - embeddable, - coreStart, - share, - data, - dashboardService, - lens + const Comp: FC = ({ onClose }) => ( + ); + return createFlyout(Comp, coreStart, share, data, dashboardService, lens); } diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx index d4075414e3a94..8f368dc0a82c0 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/map/map_vis_layer_selection_flyout/layer/compatible_layer.tsx @@ -25,7 +25,7 @@ import { QuickGeoJobCreator, redirectToGeoJobWizard, } from '../../../../../application/jobs/new_job/job_from_map'; -import { useMlFromLensKibanaContext } from '../../../lens/context'; +import { useMlFromLensKibanaContext } from '../../../common/context'; import { JobDetails, CreateADJobParams } from '../../../common/job_details'; interface DropDownLabel { @@ -147,6 +147,7 @@ export const CompatibleLayer: FC = ({ embeddable, layer, layerIndex }) => createADJob={createGeoJob} createADJobInWizard={createGeoJobInWizard} embeddable={embeddable} + timeRange={embeddable.getInput().timeRange} incomingCreateError={createError} > <> diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx index 5380513f1dc97..293ec69b30dbe 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import React, { FC } from 'react'; import type { CoreStart } from '@kbn/core/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; @@ -12,7 +13,7 @@ import type { MapEmbeddable } from '@kbn/maps-plugin/public'; import type { DashboardStart } from '@kbn/dashboard-plugin/public'; import { GeoJobFlyout } from './flyout'; -import { createFlyout } from '../common/create_flyout'; +import { createFlyout, type FlyoutComponentProps } from '../common/create_flyout'; export async function showMapVisToADJobFlyout( embeddable: MapEmbeddable, @@ -21,5 +22,8 @@ export async function showMapVisToADJobFlyout( data: DataPublicPluginStart, dashboardService: DashboardStart ): Promise { - return createFlyout(GeoJobFlyout, embeddable, coreStart, share, data, dashboardService); + const Comp: FC = ({ onClose }) => ( + + ); + return createFlyout(Comp, coreStart, share, data, dashboardService); } diff --git a/x-pack/plugins/ml/public/locator/ml_locator.ts b/x-pack/plugins/ml/public/locator/ml_locator.ts index e397778315a6a..05fe312fd9a46 100644 --- a/x-pack/plugins/ml/public/locator/ml_locator.ts +++ b/x-pack/plugins/ml/public/locator/ml_locator.ts @@ -85,6 +85,7 @@ export class MlLocatorDefinition implements LocatorDefinition { case ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_ADVANCED: case ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_LENS: case ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_MAP: + case ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_FROM_PATTERN_ANALYSIS: case ML_PAGES.DATA_VISUALIZER: case ML_PAGES.DATA_VISUALIZER_FILE: case ML_PAGES.DATA_VISUALIZER_INDEX_VIEWER: diff --git a/x-pack/plugins/ml/public/ui_actions/index.ts b/x-pack/plugins/ml/public/ui_actions/index.ts index 4067547e08956..4e756d9d44d50 100644 --- a/x-pack/plugins/ml/public/ui_actions/index.ts +++ b/x-pack/plugins/ml/public/ui_actions/index.ts @@ -8,9 +8,14 @@ import { CoreSetup } from '@kbn/core/public'; import { UiActionsSetup } from '@kbn/ui-actions-plugin/public'; import { CONTEXT_MENU_TRIGGER } from '@kbn/embeddable-plugin/public'; +import { CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER } from '@kbn/ml-ui-actions'; import { createEditSwimlanePanelAction } from './edit_swimlane_panel_action'; import { createOpenInExplorerAction } from './open_in_anomaly_explorer_action'; import { createVisToADJobAction } from './open_vis_in_ml_action'; +import { + createCategorizationADJobAction, + createCategorizationADJobTrigger, +} from './open_create_categorization_job_action'; import { MlPluginStart, MlStartDependencies } from '../plugin'; import { createApplyInfluencerFiltersAction } from './apply_influencer_filters_action'; import { @@ -45,6 +50,7 @@ export function registerMlUiActions( const clearSelectionAction = createClearSelectionAction(core.getStartServices); const editExplorerPanelAction = createEditAnomalyChartsPanelAction(core.getStartServices); const visToAdJobAction = createVisToADJobAction(core.getStartServices); + const categorizationADJobAction = createCategorizationADJobAction(core.getStartServices); // Register actions uiActions.registerAction(editSwimlanePanelAction); @@ -54,6 +60,7 @@ export function registerMlUiActions( uiActions.registerAction(applyTimeRangeSelectionAction); uiActions.registerAction(clearSelectionAction); uiActions.registerAction(editExplorerPanelAction); + uiActions.registerAction(categorizationADJobAction); // Assign triggers uiActions.attachAction(CONTEXT_MENU_TRIGGER, editSwimlanePanelAction.id); @@ -62,6 +69,7 @@ export function registerMlUiActions( uiActions.registerTrigger(swimLaneSelectionTrigger); uiActions.registerTrigger(entityFieldSelectionTrigger); + uiActions.registerTrigger(createCategorizationADJobTrigger); uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, applyInfluencerFiltersAction); uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, applyTimeRangeSelectionAction); @@ -69,4 +77,8 @@ export function registerMlUiActions( uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, clearSelectionAction); uiActions.addTriggerAction(EXPLORER_ENTITY_FIELD_SELECTION_TRIGGER, applyEntityFieldFilterAction); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, visToAdJobAction); + uiActions.addTriggerAction( + CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER, + categorizationADJobAction + ); } diff --git a/x-pack/plugins/ml/public/ui_actions/open_create_categorization_job_action.tsx b/x-pack/plugins/ml/public/ui_actions/open_create_categorization_job_action.tsx new file mode 100644 index 0000000000000..2855020a201df --- /dev/null +++ b/x-pack/plugins/ml/public/ui_actions/open_create_categorization_job_action.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import type { Trigger, UiActionsActionDefinition } from '@kbn/ui-actions-plugin/public'; +import { + CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_ACTION, + CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER, + type CreateCategorizationADJobContext, +} from '@kbn/ml-ui-actions'; +import type { MlCoreSetup } from '../plugin'; + +export const createCategorizationADJobTrigger: Trigger = { + id: CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_TRIGGER, + title: i18n.translate('xpack.ml.actions.createADJobFromPatternAnalysis', { + defaultMessage: 'Create categorization anomaly detection job', + }), + description: i18n.translate('xpack.ml.actions.createADJobFromPatternAnalysis', { + defaultMessage: 'Create categorization anomaly detection job', + }), +}; + +export function createCategorizationADJobAction( + getStartServices: MlCoreSetup['getStartServices'] +): UiActionsActionDefinition { + return { + id: 'create-ml-categorization-ad-job-action', + type: CREATE_PATTERN_ANALYSIS_TO_ML_AD_JOB_ACTION, + getIconType(context): string { + return 'machineLearningApp'; + }, + getDisplayName: () => + i18n.translate('xpack.ml.actions.createADJobFromPatternAnalysis', { + defaultMessage: 'Create categorization anomaly detection job', + }), + async execute({ dataView, field, query, timeRange }: CreateCategorizationADJobContext) { + if (!dataView) { + throw new Error('Not possible to execute an action without the embeddable context'); + } + + try { + const [{ showPatternAnalysisToADJobFlyout }, [coreStart, { share, data, dashboard }]] = + await Promise.all([import('../embeddables/job_creation/aiops'), getStartServices()]); + + await showPatternAnalysisToADJobFlyout( + dataView, + field, + query, + timeRange, + coreStart, + share, + data, + dashboard + ); + } catch (e) { + return Promise.reject(); + } + }, + async isCompatible({ dataView, field }: CreateCategorizationADJobContext) { + return ( + dataView.timeFieldName !== undefined && + dataView.fields.find((f) => f.name === field.name) !== undefined + ); + }, + }; +} diff --git a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx index fb0aa38e44d90..f47df760ea9cd 100644 --- a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx @@ -39,7 +39,7 @@ export function createVisToADJobAction( if (lens === undefined) { return; } - await showLensVisToADJobFlyout(embeddable, coreStart, share, data, lens, dashboard); + await showLensVisToADJobFlyout(embeddable, coreStart, share, data, dashboard, lens); } else if (isMapEmbeddable(embeddable)) { const [{ showMapVisToADJobFlyout }, [coreStart, { share, data, dashboard }]] = await Promise.all([import('../embeddables/job_creation/map'), getStartServices()]); diff --git a/x-pack/plugins/ml/server/models/data_frame_analytics/index_patterns.ts b/x-pack/plugins/ml/server/models/data_frame_analytics/data_view_handler.ts similarity index 93% rename from x-pack/plugins/ml/server/models/data_frame_analytics/index_patterns.ts rename to x-pack/plugins/ml/server/models/data_frame_analytics/data_view_handler.ts index fc07c69d8dc73..97ec5cbf97665 100644 --- a/x-pack/plugins/ml/server/models/data_frame_analytics/index_patterns.ts +++ b/x-pack/plugins/ml/server/models/data_frame_analytics/data_view_handler.ts @@ -9,7 +9,7 @@ import { DataViewsService } from '@kbn/data-views-plugin/common'; export class DataViewHandler { constructor(private dataViewService: DataViewsService) {} - // returns a id based on an index pattern name + // returns a id based on an data view name async getDataViewId(indexName: string) { const dv = (await this.dataViewService.find(indexName)).find( ({ title }) => title === indexName diff --git a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts index 302a8b2c89bbf..129ab0f987028 100644 --- a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts +++ b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts @@ -18,35 +18,35 @@ import { wrapError } from '../client/error_wrapper'; import { analyticsAuditMessagesProvider } from '../models/data_frame_analytics/analytics_audit_messages'; import type { RouteInitialization } from '../types'; import { - dataAnalyticsJobConfigSchema, - dataAnalyticsJobUpdateSchema, - dataAnalyticsEvaluateSchema, - dataAnalyticsExplainSchema, - analyticsIdSchema, - analyticsMapQuerySchema, + dataFrameAnalyticsJobConfigSchema, + dataFrameAnalyticsJobUpdateSchema, + dataFrameAnalyticsEvaluateSchema, + dataFrameAnalyticsExplainSchema, + dataFrameAnalyticsIdSchema, + dataFrameAnalyticsMapQuerySchema, stopsDataFrameAnalyticsJobQuerySchema, deleteDataFrameAnalyticsJobSchema, - jobsExistSchema, - analyticsQuerySchema, - analyticsNewJobCapsParamsSchema, - analyticsNewJobCapsQuerySchema, -} from './schemas/data_analytics_schema'; + dataFrameAnalyticsJobsExistSchema, + dataFrameAnalyticsQuerySchema, + dataFrameAnalyticsNewJobCapsParamsSchema, + dataFrameAnalyticsNewJobCapsQuerySchema, +} from './schemas/data_frame_analytics_schema'; import type { ExtendAnalyticsMapArgs } from '../models/data_frame_analytics/types'; -import { DataViewHandler } from '../models/data_frame_analytics/index_patterns'; +import { DataViewHandler } from '../models/data_frame_analytics/data_view_handler'; import { AnalyticsManager } from '../models/data_frame_analytics/analytics_manager'; import { validateAnalyticsJob } from '../models/data_frame_analytics/validation'; import { fieldServiceProvider } from '../models/job_service/new_job_caps/field_service'; import { getAuthorizationHeader } from '../lib/request_authorization'; import type { MlClient } from '../lib/ml_client'; -function getDataViewId(dataViewsService: DataViewsService, patternName: string) { +async function getDataViewId(dataViewsService: DataViewsService, patternName: string) { const iph = new DataViewHandler(dataViewsService); - return iph.getDataViewId(patternName); + return await iph.getDataViewId(patternName); } -function deleteDestDataViewById(dataViewsService: DataViewsService, dataViewId: string) { +async function deleteDestDataViewById(dataViewsService: DataViewsService, dataViewId: string) { const iph = new DataViewHandler(dataViewsService); - return iph.deleteDataViewById(dataViewId); + return await iph.deleteDataViewById(dataViewId); } function getExtendedMap( @@ -144,7 +144,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - query: analyticsQuerySchema, + query: dataFrameAnalyticsQuerySchema, }, }, }, @@ -185,8 +185,8 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, - query: analyticsQuerySchema, + params: dataFrameAnalyticsIdSchema, + query: dataFrameAnalyticsQuerySchema, }, }, }, @@ -262,7 +262,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, + params: dataFrameAnalyticsIdSchema, }, }, }, @@ -305,8 +305,8 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, - body: dataAnalyticsJobConfigSchema, + params: dataFrameAnalyticsIdSchema, + body: dataFrameAnalyticsJobConfigSchema, }, }, }, @@ -352,7 +352,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - body: dataAnalyticsEvaluateSchema, + body: dataFrameAnalyticsEvaluateSchema, }, }, }, @@ -397,7 +397,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - body: dataAnalyticsExplainSchema, + body: dataFrameAnalyticsExplainSchema, }, }, }, @@ -440,7 +440,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, + params: dataFrameAnalyticsIdSchema, query: deleteDataFrameAnalyticsJobSchema, }, }, @@ -449,11 +449,11 @@ export function dataFrameAnalyticsRoutes( async ({ mlClient, client, request, response, getDataViewsService }) => { try { const { analyticsId } = request.params; - const { deleteDestIndex, deleteDestIndexPattern } = request.query; + const { deleteDestIndex, deleteDestDataView } = request.query; let destinationIndex: string | undefined; const analyticsJobDeleted: DeleteDataFrameAnalyticsWithIndexStatus = { success: false }; const destIndexDeleted: DeleteDataFrameAnalyticsWithIndexStatus = { success: false }; - const destIndexPatternDeleted: DeleteDataFrameAnalyticsWithIndexStatus = { + const destDataViewDeleted: DeleteDataFrameAnalyticsWithIndexStatus = { success: false, }; @@ -473,7 +473,7 @@ export function dataFrameAnalyticsRoutes( return response.customError(wrapError(e)); } - if (deleteDestIndex || deleteDestIndexPattern) { + if (deleteDestIndex || deleteDestDataView) { // If user checks box to delete the destinationIndex associated with the job if (destinationIndex && deleteDestIndex) { // Verify if user has privilege to delete the destination index @@ -494,16 +494,16 @@ export function dataFrameAnalyticsRoutes( } // Delete the index pattern if there's an index pattern that matches the name of dest index - if (destinationIndex && deleteDestIndexPattern) { + if (destinationIndex && deleteDestDataView) { try { const dataViewsService = await getDataViewsService(); const dataViewId = await getDataViewId(dataViewsService, destinationIndex); if (dataViewId) { await deleteDestDataViewById(dataViewsService, dataViewId); } - destIndexPatternDeleted.success = true; + destDataViewDeleted.success = true; } catch (deleteDestIndexPatternError) { - destIndexPatternDeleted.error = deleteDestIndexPatternError; + destDataViewDeleted.error = deleteDestIndexPatternError; } } } @@ -521,7 +521,7 @@ export function dataFrameAnalyticsRoutes( const results = { analyticsJobDeleted, destIndexDeleted, - destIndexPatternDeleted, + destDataViewDeleted, }; return response.ok({ body: results, @@ -555,7 +555,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, + params: dataFrameAnalyticsIdSchema, }, }, }, @@ -597,7 +597,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, + params: dataFrameAnalyticsIdSchema, query: stopsDataFrameAnalyticsJobQuerySchema, }, }, @@ -640,8 +640,8 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, - body: dataAnalyticsJobUpdateSchema, + params: dataFrameAnalyticsIdSchema, + body: dataFrameAnalyticsJobUpdateSchema, }, }, }, @@ -686,7 +686,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, + params: dataFrameAnalyticsIdSchema, }, }, }, @@ -728,7 +728,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - body: jobsExistSchema, + body: dataFrameAnalyticsJobsExistSchema, }, }, }, @@ -785,8 +785,8 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsIdSchema, - query: analyticsMapQuerySchema, + params: dataFrameAnalyticsIdSchema, + query: dataFrameAnalyticsMapQuerySchema, }, }, }, @@ -851,8 +851,8 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - params: analyticsNewJobCapsParamsSchema, - query: analyticsNewJobCapsQuerySchema, + params: dataFrameAnalyticsNewJobCapsParamsSchema, + query: dataFrameAnalyticsNewJobCapsQuerySchema, }, }, }, @@ -906,7 +906,7 @@ export function dataFrameAnalyticsRoutes( version: '1', validate: { request: { - body: dataAnalyticsJobConfigSchema, + body: dataFrameAnalyticsJobConfigSchema, }, }, }, diff --git a/x-pack/plugins/ml/server/routes/schemas/data_analytics_schema.ts b/x-pack/plugins/ml/server/routes/schemas/data_frame_analytics_schema.ts similarity index 80% rename from x-pack/plugins/ml/server/routes/schemas/data_analytics_schema.ts rename to x-pack/plugins/ml/server/routes/schemas/data_frame_analytics_schema.ts index 7b67a56fe485e..1026e425c20cc 100644 --- a/x-pack/plugins/ml/server/routes/schemas/data_analytics_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/data_frame_analytics_schema.ts @@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema'; import { runtimeMappingsSchema } from './runtime_mappings_schema'; -export const dataAnalyticsJobConfigSchema = schema.object({ +export const dataFrameAnalyticsJobConfigSchema = schema.object({ description: schema.maybe(schema.string()), _meta: schema.maybe(schema.object({}, { unknowns: 'allow' })), dest: schema.object({ @@ -35,7 +35,7 @@ export const dataAnalyticsJobConfigSchema = schema.object({ max_num_threads: schema.maybe(schema.number()), }); -export const dataAnalyticsEvaluateSchema = schema.object({ +export const dataFrameAnalyticsEvaluateSchema = schema.object({ index: schema.string(), query: schema.maybe(schema.any()), evaluation: schema.maybe( @@ -47,7 +47,7 @@ export const dataAnalyticsEvaluateSchema = schema.object({ ), }); -export const dataAnalyticsExplainSchema = schema.object({ +export const dataFrameAnalyticsExplainSchema = schema.object({ description: schema.maybe(schema.string()), dest: schema.maybe(schema.any()), /** Source */ @@ -63,14 +63,14 @@ export const dataAnalyticsExplainSchema = schema.object({ _meta: schema.maybe(schema.object({}, { unknowns: 'allow' })), }); -export const analyticsIdSchema = schema.object({ +export const dataFrameAnalyticsIdSchema = schema.object({ /** * Analytics ID */ analyticsId: schema.string(), }); -export const analyticsQuerySchema = schema.object({ +export const dataFrameAnalyticsQuerySchema = schema.object({ /** * Analytics Query */ @@ -83,10 +83,10 @@ export const deleteDataFrameAnalyticsJobSchema = schema.object({ * Analytics Destination Index */ deleteDestIndex: schema.maybe(schema.boolean()), - deleteDestIndexPattern: schema.maybe(schema.boolean()), + deleteDestDataView: schema.maybe(schema.boolean()), }); -export const dataAnalyticsJobUpdateSchema = schema.object({ +export const dataFrameAnalyticsJobUpdateSchema = schema.object({ description: schema.maybe(schema.string()), model_memory_limit: schema.maybe(schema.string()), allow_lazy_start: schema.maybe(schema.boolean()), @@ -98,17 +98,19 @@ export const stopsDataFrameAnalyticsJobQuerySchema = schema.object({ force: schema.maybe(schema.boolean()), }); -export const jobsExistSchema = schema.object({ +export const dataFrameAnalyticsJobsExistSchema = schema.object({ analyticsIds: schema.arrayOf(schema.string()), allSpaces: schema.maybe(schema.boolean()), }); -export const analyticsMapQuerySchema = schema.maybe( +export const dataFrameAnalyticsMapQuerySchema = schema.maybe( schema.object({ treatAsRoot: schema.maybe(schema.any()), type: schema.maybe(schema.string()) }) ); -export const analyticsNewJobCapsParamsSchema = schema.object({ indexPattern: schema.string() }); +export const dataFrameAnalyticsNewJobCapsParamsSchema = schema.object({ + indexPattern: schema.string(), +}); -export const analyticsNewJobCapsQuerySchema = schema.maybe( +export const dataFrameAnalyticsNewJobCapsQuerySchema = schema.maybe( schema.object({ rollup: schema.maybe(schema.string()) }) ); diff --git a/x-pack/plugins/ml/server/routes/trained_models.ts b/x-pack/plugins/ml/server/routes/trained_models.ts index 8095411f911e7..34cbaf755c1e1 100644 --- a/x-pack/plugins/ml/server/routes/trained_models.ts +++ b/x-pack/plugins/ml/server/routes/trained_models.ts @@ -29,9 +29,9 @@ import { createIngestPipelineSchema, modelDownloadsQuery, } from './schemas/inference_schema'; -import type { +import { PipelineDefinition, - TrainedModelConfigResponse, + type TrainedModelConfigResponse, } from '../../common/types/trained_models'; import { mlLog } from '../lib/log'; import { forceQuerySchema } from './schemas/anomaly_detectors_schema'; @@ -39,10 +39,9 @@ import { modelsProvider } from '../models/model_management'; export const DEFAULT_TRAINED_MODELS_PAGE_SIZE = 10000; -export function filterForEnabledFeatureModels( - models: TrainedModelConfigResponse[] | estypes.MlTrainedModelConfig[], - enabledFeatures: MlFeatures -) { +export function filterForEnabledFeatureModels< + T extends TrainedModelConfigResponse | estypes.MlTrainedModelConfig +>(models: T[], enabledFeatures: MlFeatures) { let filteredModels = models; if (enabledFeatures.nlp === false) { filteredModels = filteredModels.filter((m) => m.model_type === 'tree_ensemble'); @@ -191,10 +190,38 @@ export function trainedModelsRoutes( mlLog.debug(e); } - const body = filterForEnabledFeatureModels(result, getEnabledFeatures()); + const filteredModels = filterForEnabledFeatureModels(result, getEnabledFeatures()); + + try { + const jobIds = filteredModels + .map((model) => { + const id = model.metadata?.analytics_config?.id; + if (id) { + return `${id}*`; + } + }) + .filter((id) => id !== undefined); + + if (jobIds.length) { + const { data_frame_analytics: jobs } = await mlClient.getDataFrameAnalytics({ + id: jobIds.join(','), + allow_no_match: true, + }); + + filteredModels.forEach((model) => { + const dfaId = model?.metadata?.analytics_config?.id; + if (dfaId !== undefined) { + // if this is a dfa model, set origin_job_exists + model.origin_job_exists = jobs.find((job) => job.id === dfaId) !== undefined; + } + }); + } + } catch (e) { + // Swallow error to prevent blocking trained models result + } return response.ok({ - body, + body: filteredModels, }); } catch (e) { return response.customError(wrapError(e)); diff --git a/x-pack/plugins/ml/tsconfig.json b/x-pack/plugins/ml/tsconfig.json index cca832eee0423..846825569da66 100644 --- a/x-pack/plugins/ml/tsconfig.json +++ b/x-pack/plugins/ml/tsconfig.json @@ -96,6 +96,7 @@ "@kbn/ml-runtime-field-utils", "@kbn/ml-date-utils", "@kbn/ml-category-validator", + "@kbn/ml-ui-actions", "@kbn/deeplinks-ml", "@kbn/core-notifications-browser-mocks", "@kbn/unified-field-list", diff --git a/x-pack/plugins/observability/common/custom_threshold_rule/types.ts b/x-pack/plugins/observability/common/custom_threshold_rule/types.ts index 40d569152d1a3..7668e19dc3900 100644 --- a/x-pack/plugins/observability/common/custom_threshold_rule/types.ts +++ b/x-pack/plugins/observability/common/custom_threshold_rule/types.ts @@ -8,7 +8,6 @@ import * as rt from 'io-ts'; import { SerializedSearchSourceFields } from '@kbn/data-plugin/common'; import { TimeUnitChar } from '../utils/formatters/duration'; -import { CUSTOM_AGGREGATOR } from './constants'; export const ThresholdFormatterTypeRT = rt.keyof({ abbreviatedNumber: null, @@ -84,7 +83,6 @@ export interface CustomThresholdExpressionMetric { } export interface CustomMetricExpressionParams extends BaseMetricExpressionParams { - aggType: typeof CUSTOM_AGGREGATOR; metrics: CustomThresholdExpressionMetric[]; equation?: string; label?: string; diff --git a/x-pack/plugins/observability/docs/openapi/slo/bundled.json b/x-pack/plugins/observability/docs/openapi/slo/bundled.json index b4f52b032a9fc..ff366afc2ff1f 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/bundled.json +++ b/x-pack/plugins/observability/docs/openapi/slo/bundled.json @@ -753,7 +753,8 @@ "apiKeyAuth": { "type": "apiKey", "in": "header", - "name": "ApiKey" + "name": "Authorization", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" } }, "parameters": { diff --git a/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml b/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml index 8efdbd9dfe2c2..5aa20726b6a07 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/bundled.yaml @@ -455,7 +455,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' parameters: kbn_xsrf: schema: diff --git a/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml b/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml index 687fd94f006a4..910f795aa40a7 100644 --- a/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml +++ b/x-pack/plugins/observability/docs/openapi/slo/entrypoint.yaml @@ -35,7 +35,8 @@ components: apiKeyAuth: type: apiKey in: header - name: ApiKey + name: Authorization + description: 'e.g. Authorization: ApiKey base64AccessApiKey' security: - basicAuth: [] - apiKeyAuth: [] diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap b/x-pack/plugins/observability/public/components/custom_threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap index 2e12193435726..0446f2fe1d4a2 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/__snapshots__/alert_details_app_section.test.tsx.snap @@ -22,7 +22,6 @@ Array [ "title": "unknown-index", }, "expression": Object { - "aggType": "custom", "comparator": ">", "metrics": Array [ Object { diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx index a5a029d764a89..deebe5a6cd4ca 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx @@ -134,7 +134,7 @@ export default function AlertDetailsAppSection({ -

    {criterion.aggType.toUpperCase()}

    +

    {criterion.label || 'CUSTOM'}

    = { expression: { - aggType: CUSTOM_AGGREGATOR, metrics: [ { name: 'A', @@ -120,7 +118,6 @@ CustomEquationEditorDefault.args = { CustomEquationEditorWithEquationErrors.args = { ...BASE_ARGS, expression: { - aggType: CUSTOM_AGGREGATOR, equation: 'Math.round(A / B)', metrics: [ { name: 'A', aggType: Aggregators.AVERAGE, field: 'system.cpu.user.pct' }, diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx index 164db3bac1682..e15248d72c497 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx @@ -22,6 +22,7 @@ import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; import { FormattedMessage } from '@kbn/i18n-react'; import { DataViewBase } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; +import { adjustThresholdBasedOnFormat } from '../../helpers/adjust_threshold_based_on_format'; import { Aggregators, CustomThresholdExpressionMetric, @@ -71,7 +72,12 @@ export function CustomEquationEditor({ const currentVars = previous?.map((m) => m.name) ?? []; const name = first(xor(VAR_NAMES, currentVars))!; const nextMetrics = [...(previous || []), { ...NEW_METRIC, name }]; - debouncedOnChange({ ...expression, metrics: nextMetrics, equation }); + debouncedOnChange({ + ...expression, + metrics: nextMetrics, + equation, + threshold: adjustThresholdBasedOnFormat(previous, nextMetrics, expression.threshold), + }); return nextMetrics; }); }, [debouncedOnChange, equation, expression]); @@ -81,7 +87,12 @@ export function CustomEquationEditor({ setCustomMetrics((previous) => { const nextMetrics = previous?.filter((row) => row.name !== name) ?? [NEW_METRIC]; const finalMetrics = (nextMetrics.length && nextMetrics) || [NEW_METRIC]; - debouncedOnChange({ ...expression, metrics: finalMetrics, equation }); + debouncedOnChange({ + ...expression, + metrics: finalMetrics, + equation, + threshold: adjustThresholdBasedOnFormat(previous, nextMetrics, expression.threshold), + }); return finalMetrics; }); }, @@ -92,7 +103,12 @@ export function CustomEquationEditor({ (metric: CustomThresholdExpressionMetric) => { setCustomMetrics((previous) => { const nextMetrics = previous?.map((m) => (m.name === metric.name ? metric : m)); - debouncedOnChange({ ...expression, metrics: nextMetrics, equation }); + debouncedOnChange({ + ...expression, + metrics: nextMetrics, + equation, + threshold: adjustThresholdBasedOnFormat(previous, nextMetrics, expression.threshold), + }); return nextMetrics; }); }, diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_controls.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_controls.tsx index d43c09d7c3787..305be75390df8 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_controls.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_controls.tsx @@ -5,7 +5,7 @@ * 2.0. */ import React from 'react'; -import { EuiFlexItem, EuiButtonIcon } from '@elastic/eui'; +import { EuiButtonIcon } from '@elastic/eui'; import { DELETE_LABEL } from '../../i18n_strings'; interface MetricRowControlProps { @@ -15,19 +15,16 @@ interface MetricRowControlProps { export function MetricRowControls({ onDelete, disableDelete }: MetricRowControlProps) { return ( - <> - - - - + ); } diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_with_agg.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_with_agg.tsx index 51c4713fef264..a00a086ef5528 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_with_agg.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/custom_equation/metric_row_with_agg.tsx @@ -112,117 +112,123 @@ export function MetricRowWithAgg({ const isFieldInvalid = get(errors, ['metrics', name, 'field']) != null || !field; return ( - <> - - - - { - setAggTypePopoverOpen(true); - }} - isInvalid={aggType !== Aggregators.COUNT && !field} - /> - - } - isOpen={aggTypePopoverOpen} - closePopover={() => { - setAggTypePopoverOpen(false); - }} - display="block" - ownFocus - anchorPosition={'downLeft'} - repositionOnScroll - > -
    - setAggTypePopoverOpen(false)}> - - + + + + + {i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.customEquationEditor.aggregationLabel', + { defaultMessage: 'Aggregation {name}', values: { name } } + )} + + {!disableDelete && ( + + + + )} + + } + > + { + setAggTypePopoverOpen(true); + }} + isInvalid={aggType !== Aggregators.COUNT && !field} + /> + + } + isOpen={aggTypePopoverOpen} + closePopover={() => { + setAggTypePopoverOpen(false); + }} + display="block" + ownFocus + anchorPosition={'downLeft'} + repositionOnScroll + > +
    + setAggTypePopoverOpen(false)}> + + - - + + + + { + handleAggChange(e.target.value); + }} + options={Object.values(aggregationTypes).map(({ text, value }) => { + return { + text, + value, + }; + })} + isInvalid={isAggInvalid} + /> + + + + {aggType === Aggregators.COUNT ? ( + + + + ) : ( - { - handleAggChange(e.target.value); - }} - options={Object.values(aggregationTypes).map(({ text, value }) => { - return { - text, - value, - }; - })} - isInvalid={isAggInvalid} + isInvalid={isFieldInvalid} + singleSelection={{ asPlainText: true }} + options={fieldOptions} + selectedOptions={field ? [{ label: field }] : []} + onChange={handleFieldChange} /> - - - {aggType === Aggregators.COUNT ? ( - - - - ) : ( - - - - )} - - -
    - - - - - + )} + + +
    +
    +
    +
    ); } diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.test.tsx index 956391a3f29b7..5af6cae385d73 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.test.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_chart.test.tsx @@ -12,7 +12,6 @@ import { DataViewBase } from '@kbn/es-query'; import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; import React, { ReactElement } from 'react'; import { act } from 'react-dom/test-utils'; -import { CUSTOM_AGGREGATOR } from '../../../../common/custom_threshold_rule/constants'; import { Aggregators, Comparator } from '../../../../common/custom_threshold_rule/types'; import { MetricExpression } from '../types'; import { ExpressionChart } from './expression_chart'; @@ -77,7 +76,6 @@ describe('ExpressionChart', () => { it('should display no data message', async () => { const expression: MetricExpression = { - aggType: CUSTOM_AGGREGATOR, metrics: [ { name: 'A', diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.test.tsx index 8b0a4de92bd7e..2bdd1f2def081 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.test.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.test.tsx @@ -9,7 +9,6 @@ import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; import React from 'react'; import { act } from 'react-dom/test-utils'; -import { CUSTOM_AGGREGATOR } from '../../../../common/custom_threshold_rule/constants'; import { Aggregators, Comparator } from '../../../../common/custom_threshold_rule/types'; import { MetricExpression } from '../types'; import { ExpressionRow } from './expression_row'; @@ -18,6 +17,7 @@ describe('ExpressionRow', () => { async function setup(expression: MetricExpression) { const wrapper = mountWithIntl( Condition} canDelete={false} fields={[ { @@ -57,7 +57,6 @@ describe('ExpressionRow', () => { it('should display thresholds as a percentage for pct metrics', async () => { const expression: MetricExpression = { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { @@ -83,7 +82,6 @@ describe('ExpressionRow', () => { it('should display thresholds as a decimal for all other metrics', async () => { const expression = { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.tsx index 0f53594bd49e9..6b0643791596a 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/expression_row.tsx @@ -12,9 +12,10 @@ import { EuiFlexItem, EuiFormRow, EuiSpacer, + EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo, useState, ReactElement } from 'react'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; import { AggregationType, @@ -47,6 +48,7 @@ const customComparators = { }; interface ExpressionRowProps { + title: ReactElement; fields: DataViewFieldBase[]; expressionId: number; expression: MetricExpression; @@ -77,6 +79,7 @@ export const ExpressionRow: React.FC = (props) => { remove, fields, canDelete, + title, } = props; const { metrics, comparator = Comparator.GT, threshold = [] } = expression; @@ -146,6 +149,29 @@ export const ExpressionRow: React.FC = (props) => { ); return ( <> + + + +
    {title}
    +
    +
    + {canDelete && ( + + remove(expressionId)} + /> + + )} +
    @@ -178,25 +204,8 @@ export const ExpressionRow: React.FC = (props) => { - {canDelete && ( - - remove(expressionId)} - /> - - )} {children} - ); }; diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.test.tsx index 9226da0ca2370..bc478e54135ba 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.test.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.test.tsx @@ -9,12 +9,11 @@ import React from 'react'; import { act } from 'react-dom/test-utils'; import { DataView } from '@kbn/data-views-plugin/common'; import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; -import { CUSTOM_AGGREGATOR } from '../../../../../common/custom_threshold_rule/constants'; import { Comparator, Aggregators } from '../../../../../common/custom_threshold_rule/types'; import { useKibana } from '../../../../utils/kibana_react'; import { kibanaStartMock } from '../../../../utils/kibana_react.mock'; import { MetricExpression } from '../../types'; -import { PreviewChart } from './preview_chart'; +import { getBufferThreshold, PreviewChart } from './preview_chart'; jest.mock('../../../../utils/kibana_react'); @@ -55,7 +54,6 @@ describe('Preview chart', () => { it('should display no data message', async () => { const expression: MetricExpression = { - aggType: CUSTOM_AGGREGATOR, metrics: [ { name: 'A', @@ -72,3 +70,18 @@ describe('Preview chart', () => { expect(wrapper.find('[data-test-subj="thresholdRuleNoChartData"]').exists()).toBeTruthy(); }); }); + +describe('getBufferThreshold', () => { + const testData = [ + { threshold: undefined, buffer: '0.00' }, + { threshold: 0.1, buffer: '0.12' }, + { threshold: 0.01, buffer: '0.02' }, + { threshold: 0.001, buffer: '0.01' }, + { threshold: 0.00098, buffer: '0.01' }, + { threshold: 130, buffer: '143.00' }, + ]; + + it.each(testData)('getBufferThreshold($threshold) = $buffer', ({ threshold, buffer }) => { + expect(getBufferThreshold(threshold)).toBe(buffer); + }); +}); diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.tsx index d5a8b763ca7b5..1c25d22b3a595 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/preview_chart/preview_chart.tsx @@ -44,6 +44,9 @@ const getOperationTypeFromRuleAggType = (aggType: AggType): OperationType => { return aggType; }; +export const getBufferThreshold = (threshold?: number): string => + (Math.ceil((threshold || 0) * 1.1 * 100) / 100).toFixed(2).toString(); + export function PreviewChart({ metricExpression, dataView, @@ -147,7 +150,7 @@ export function PreviewChart({ const bufferRefLine = new XYReferenceLinesLayer({ data: [ { - value: Math.round((threshold[0] || 0) * 1.1).toString(), + value: getBufferThreshold(threshold[0]), color: 'transparent', fill, format, @@ -218,12 +221,7 @@ export function PreviewChart({ decimals: isPercent ? 0 : 2, }, }, - filter: { - language: 'kuery', - query: filterQuery || '', - }, }; - const xYDataLayerOptions: XYLayerOptions = { buckets: { type: 'date_histogram', @@ -252,7 +250,6 @@ export function PreviewChart({ value: layer.value, label: layer.label, format: layer.format, - filter: layer.filter, })), options: xYDataLayerOptions, }); @@ -333,6 +330,10 @@ export function PreviewChart({ timeRange={{ from: `now-${timeSize * 20}${timeUnit}`, to: 'now' }} attributes={attributes} disableTriggers={true} + query={{ + language: 'kuery', + query: filterQuery || '', + }} /> ); diff --git a/x-pack/plugins/observability/public/components/custom_threshold/components/validation.tsx b/x-pack/plugins/observability/public/components/custom_threshold/components/validation.tsx index f360b415fa1be..2144757216fbe 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/components/validation.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/components/validation.tsx @@ -27,17 +27,12 @@ export function validateCustomThreshold({ const validationResult = { errors: {} }; const errors: { [id: string]: { - aggField: string[]; timeSizeUnit: string[]; timeWindowSize: string[]; critical: { threshold0: string[]; threshold1: string[]; }; - warning: { - threshold0: string[]; - threshold1: string[]; - }; metricsError?: string; metrics: Record; equation?: string; @@ -91,23 +86,9 @@ export function validateCustomThreshold({ threshold0: [], threshold1: [], }, - warning: { - threshold0: [], - threshold1: [], - }, metric: [], metrics: {}, }; - if (!c.aggType) { - errors[id].aggField.push( - i18n.translate( - 'xpack.observability.customThreshold.rule.alertFlyout.error.aggregationRequired', - { - defaultMessage: 'Aggregation is required.', - } - ) - ); - } if (!c.threshold || !c.threshold.length) { errors[id].critical.threshold0.push( @@ -120,8 +101,30 @@ export function validateCustomThreshold({ ); } - if (c.warningThreshold && !c.warningThreshold.length) { - errors[id].warning.threshold0.push( + // The Threshold component returns an empty array with a length ([empty]) because it's using delete newThreshold[i]. + // We need to use [...c.threshold] to convert it to an array with an undefined value ([undefined]) so we can test each element. + const { comparator, threshold } = { comparator: c.comparator, threshold: c.threshold } as { + comparator?: Comparator; + threshold?: number[]; + }; + if (threshold && threshold.length && ![...threshold].every(isNumber)) { + [...threshold].forEach((v, i) => { + if (!isNumber(v)) { + const key = i === 0 ? 'threshold0' : 'threshold1'; + errors[id].critical[key].push( + i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdTypeRequired', + { + defaultMessage: 'Thresholds must contain a valid number.', + } + ) + ); + } + }); + } + + if (comparator === Comparator.BETWEEN && (!threshold || threshold.length < 2)) { + errors[id].critical.threshold1.push( i18n.translate( 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdRequired', { @@ -131,45 +134,6 @@ export function validateCustomThreshold({ ); } - for (const props of [ - { comparator: c.comparator, threshold: c.threshold, type: 'critical' }, - { comparator: c.warningComparator, threshold: c.warningThreshold, type: 'warning' }, - ]) { - // The Threshold component returns an empty array with a length ([empty]) because it's using delete newThreshold[i]. - // We need to use [...c.threshold] to convert it to an array with an undefined value ([undefined]) so we can test each element. - const { comparator, threshold, type } = props as { - comparator?: Comparator; - threshold?: number[]; - type: 'critical' | 'warning'; - }; - if (threshold && threshold.length && ![...threshold].every(isNumber)) { - [...threshold].forEach((v, i) => { - if (!isNumber(v)) { - const key = i === 0 ? 'threshold0' : 'threshold1'; - errors[id][type][key].push( - i18n.translate( - 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdTypeRequired', - { - defaultMessage: 'Thresholds must contain a valid number.', - } - ) - ); - } - }); - } - - if (comparator === Comparator.BETWEEN && (!threshold || threshold.length < 2)) { - errors[id][type].threshold1.push( - i18n.translate( - 'xpack.observability.customThreshold.rule.alertFlyout.error.thresholdRequired', - { - defaultMessage: 'Threshold is required.', - } - ) - ); - } - } - if (!c.timeSize) { errors[id].timeWindowSize.push( i18n.translate('xpack.observability.customThreshold.rule.alertFlyout.error.timeRequred', { diff --git a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx index 78fa6c3244427..0f1742469c312 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.test.tsx @@ -92,10 +92,9 @@ describe('Expression', () => { }, ], comparator: Comparator.GT, - threshold: [1000], + threshold: [100], timeSize: 1, timeUnit: 'm', - aggType: 'custom', }, ]); }); diff --git a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx index 2c5f7438b048f..539f8fbf4f58d 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx +++ b/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx @@ -14,6 +14,7 @@ import { EuiEmptyPrompt, EuiFormErrorText, EuiFormRow, + EuiHorizontalRule, EuiIcon, EuiLink, EuiLoadingSpinner, @@ -36,7 +37,6 @@ import { } from '@kbn/triggers-actions-ui-plugin/public'; import { useKibana } from '../../utils/kibana_react'; -import { CUSTOM_AGGREGATOR } from '../../../common/custom_threshold_rule/constants'; import { Aggregators, Comparator } from '../../../common/custom_threshold_rule/types'; import { TimeUnitChar } from '../../../common/utils/formatters/duration'; import { AlertContextMeta, AlertParams, MetricExpression } from './types'; @@ -52,7 +52,6 @@ type Props = Omit< >; export const defaultExpression: MetricExpression = { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { @@ -60,7 +59,7 @@ export const defaultExpression: MetricExpression = { aggType: Aggregators.COUNT, }, ], - threshold: [1000], + threshold: [100], timeSize: 1, timeUnit: 'm', }; @@ -202,11 +201,8 @@ export default function Expressions(props: Props) { const removeExpression = useCallback( (id: number) => { - const ruleCriteria = ruleParams.criteria?.slice() || []; - if (ruleCriteria.length > 1) { - ruleCriteria.splice(id, 1); - setRuleParams('criteria', ruleCriteria); - } + const ruleCriteria = ruleParams.criteria?.filter((_, index) => index !== id) || []; + setRuleParams('criteria', ruleCriteria); }, [setRuleParams, ruleParams.criteria] ); @@ -375,30 +371,11 @@ export default function Expressions(props: Props) { )} - -
    - -
    -
    {ruleParams.criteria && ruleParams.criteria.map((e, idx) => { return (
    - {/* index has semantic meaning, we show the condition title starting from the 2nd one */} - {idx >= 1 && ( - -
    - -
    -
    - )} + {idx > 0 && } 1) || false} fields={derivedIndexPattern.fields} @@ -410,6 +387,20 @@ export default function Expressions(props: Props) { errors={(errors[idx] as IErrorObject) || emptyError} expression={e || {}} dataView={derivedIndexPattern} + title={ + ruleParams.criteria.length === 1 ? ( + + ) : ( + + ) + } > { + test('previous: nonPercent, next: percent -> threshold / 100', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const threshold: number[] = [100]; + const expectedThreshold: number[] = [1]; + + expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(expectedThreshold); + }); + + test('previous: percent, next: nonPercent -> threshold * 100', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + ]; + const threshold: number[] = [1]; + const expectedThreshold: number[] = [100]; + + expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(expectedThreshold); + }); + + test('previous: percent, next: percent -> no threshold change', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.total.norm.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const threshold: number[] = [1]; + + expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(threshold); + }); + + test('previous: nonPercent, next: nonPercent -> threshold * 100', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'host.disk.read.bytes', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + ]; + const threshold: number[] = [100]; + + expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(threshold); + }); +}); diff --git a/x-pack/plugins/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.ts b/x-pack/plugins/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.ts new file mode 100644 index 0000000000000..ba4976684e386 --- /dev/null +++ b/x-pack/plugins/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CustomThresholdExpressionMetric } from '../../../../common/custom_threshold_rule/types'; +import { decimalToPct, pctToDecimal } from './corrected_percent_convert'; + +export const adjustThresholdBasedOnFormat = ( + previous: CustomThresholdExpressionMetric[], + next: CustomThresholdExpressionMetric[], + threshold: number[] +) => { + const isPreviousPercent = Boolean(previous.length === 1 && previous[0].field?.endsWith('.pct')); + const isPercent = Boolean(next.length === 1 && next[0].field?.endsWith('.pct')); + return isPercent === isPreviousPercent + ? threshold + : isPercent + ? threshold.map((v: number) => pctToDecimal(v)) + : isPreviousPercent + ? threshold.map((v: number) => decimalToPct(v)) + : threshold; +}; diff --git a/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_expression_chart_data.ts b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_expression_chart_data.ts index 1f135473c0866..65bb84defa03e 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_expression_chart_data.ts +++ b/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_expression_chart_data.ts @@ -52,11 +52,10 @@ export const useExpressionChartData = ( equation: expression.equation, }, ], - aggregation: expression.aggType || 'custom', + aggregation: 'custom', }), // eslint-disable-next-line react-hooks/exhaustive-deps [ - expression.aggType, expression.equation, // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify(expression.metrics), diff --git a/x-pack/plugins/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts b/x-pack/plugins/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts index f93bac2b0f104..4cae955ce9801 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts +++ b/x-pack/plugins/observability/public/components/custom_threshold/mocks/custom_threshold_rule.ts @@ -6,7 +6,6 @@ */ import { v4 as uuidv4 } from 'uuid'; -import { CUSTOM_AGGREGATOR } from '../../../../common/custom_threshold_rule/constants'; import { Aggregators, Comparator } from '../../../../common/custom_threshold_rule/types'; import { CustomThresholdAlert, CustomThresholdRule } from '../components/alert_details_app_section'; @@ -60,7 +59,6 @@ export const buildCustomThresholdRule = ( params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { @@ -73,7 +71,6 @@ export const buildCustomThresholdRule = ( timeUnit: 'm', }, { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { @@ -89,7 +86,6 @@ export const buildCustomThresholdRule = ( warningThreshold: [2.2], }, { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { @@ -155,7 +151,6 @@ export const buildCustomThresholdAlert = ( 'kibana.alert.rule.parameters': { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { @@ -169,7 +164,6 @@ export const buildCustomThresholdAlert = ( timeUnit: 'm', }, { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { diff --git a/x-pack/plugins/observability/public/components/custom_threshold/types.ts b/x-pack/plugins/observability/public/components/custom_threshold/types.ts index e726a8fd01327..dc0ad4eb71627 100644 --- a/x-pack/plugins/observability/public/components/custom_threshold/types.ts +++ b/x-pack/plugins/observability/public/components/custom_threshold/types.ts @@ -74,8 +74,6 @@ export interface InfraClientStartDeps { uiActions: UiActionsStart; unifiedSearch: UnifiedSearchPublicPluginStart; usageCollection: UsageCollectionStart; - // TODO:: check if needed => https://github.com/elastic/kibana/issues/159340 - // telemetry: ITelemetryClient; } export type RendererResult = React.ReactElement | null; diff --git a/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx b/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx index 485355a278721..76a1a0efef112 100644 --- a/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx +++ b/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_active_alerts_badge.tsx @@ -14,11 +14,12 @@ import { paths } from '../../../../common/locators/paths'; import { useKibana } from '../../../utils/kibana_react'; export interface Props { + viewMode?: 'compact' | 'default'; activeAlerts?: number; slo: SLOWithSummaryResponse; } -export function SloActiveAlertsBadge({ slo, activeAlerts }: Props) { +export function SloActiveAlertsBadge({ slo, activeAlerts, viewMode = 'default' }: Props) { const { application: { navigateToUrl }, http: { basePath }, @@ -50,10 +51,12 @@ export function SloActiveAlertsBadge({ slo, activeAlerts }: Props) { )} data-test-subj="o11ySloActiveAlertsBadge" > - {i18n.translate('xpack.observability.slo.slo.activeAlertsBadge.label', { - defaultMessage: '{count, plural, one {# alert} other {# alerts}}', - values: { count: activeAlerts }, - })} + {viewMode !== 'default' + ? activeAlerts + : i18n.translate('xpack.observability.slo.slo.activeAlertsBadge.label', { + defaultMessage: '{count, plural, one {# alert} other {# alerts}}', + values: { count: activeAlerts }, + })} ); diff --git a/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx b/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx index 455d6d9d24ed3..f79b700ed9be5 100644 --- a/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx +++ b/x-pack/plugins/observability/public/components/slo/slo_status_badge/slo_group_by_badge.tsx @@ -5,24 +5,25 @@ * 2.0. */ -import { EuiBadge, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import { EuiBadge, EuiBadgeProps, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; -import { euiLightVars } from '@kbn/ui-theme'; import React from 'react'; +import { euiLightVars } from '@kbn/ui-theme'; export interface Props { + color?: EuiBadgeProps['color']; slo: SLOWithSummaryResponse; } -export function SloGroupByBadge({ slo }: Props) { +export function SloGroupByBadge({ slo, color }: Props) { if (!slo.groupBy || slo.groupBy === ALL_VALUE) { return null; } return ( - + [...sloKeys.all, 'globalDiagnosis'] as const, burnRates: (sloId: string, instanceId: string | undefined) => [...sloKeys.all, 'burnRates', sloId, instanceId] as const, - preview: (indicator?: Indicator) => [...sloKeys.all, 'preview', indicator] as const, + preview: (indicator: Indicator, range: { start: number; end: number }) => + [...sloKeys.all, 'preview', indicator, range] as const, }; export type SloKeys = typeof sloKeys; diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_active_alerts.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_active_alerts.ts index 2d234b57ab8ed..33ae5ffac2637 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_active_alerts.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_active_alerts.ts @@ -12,6 +12,7 @@ import { ALL_VALUE, SLOResponse } from '@kbn/slo-schema'; import { AlertConsumers } from '@kbn/rule-registry-plugin/common/technical_rule_data_field_names'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; +import { SLO_LONG_REFETCH_INTERVAL } from '../../constants'; type SLO = Pick; @@ -71,7 +72,6 @@ interface FindApiResponse { }; } -const LONG_REFETCH_INTERVAL = 1000 * 60; // 1 minute const EMPTY_ACTIVE_ALERTS_MAP = new ActiveAlerts(); export function useFetchActiveAlerts({ @@ -141,7 +141,7 @@ export function useFetchActiveAlerts({ } }, refetchOnWindowFocus: false, - refetchInterval: shouldRefetch ? LONG_REFETCH_INTERVAL : undefined, + refetchInterval: shouldRefetch ? SLO_LONG_REFETCH_INTERVAL : undefined, enabled: Boolean(sloIdsAndInstanceIds.length), }); diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_historical_summary.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_historical_summary.ts index a20b721f11bbd..63bdc55d7eaf8 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_historical_summary.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_historical_summary.ts @@ -10,6 +10,7 @@ import { FetchHistoricalSummaryResponse } from '@kbn/slo-schema'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; +import { SLO_LONG_REFETCH_INTERVAL } from '../../constants'; export interface UseFetchHistoricalSummaryResponse { data: FetchHistoricalSummaryResponse | undefined; @@ -25,8 +26,6 @@ export interface Params { shouldRefetch?: boolean; } -const LONG_REFETCH_INTERVAL = 1000 * 60; // 1 minute - export function useFetchHistoricalSummary({ list = [], shouldRefetch, @@ -50,7 +49,7 @@ export function useFetchHistoricalSummary({ // ignore error } }, - refetchInterval: shouldRefetch ? LONG_REFETCH_INTERVAL : undefined, + refetchInterval: shouldRefetch ? SLO_LONG_REFETCH_INTERVAL : undefined, refetchOnWindowFocus: false, keepPreviousData: true, }); diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_burn_rates.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_burn_rates.ts index 20092609bdfa8..07ba25e0e5249 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_burn_rates.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_burn_rates.ts @@ -13,6 +13,7 @@ import { import { ALL_VALUE, GetSLOBurnRatesResponse, SLOWithSummaryResponse } from '@kbn/slo-schema'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; +import { SLO_LONG_REFETCH_INTERVAL } from '../../constants'; export interface UseFetchSloBurnRatesResponse { isInitialLoading: boolean; @@ -26,8 +27,6 @@ export interface UseFetchSloBurnRatesResponse { ) => Promise>; } -const LONG_REFETCH_INTERVAL = 1000 * 60; // 1 minute - interface UseFetchSloBurnRatesParams { slo: SLOWithSummaryResponse; windows: Array<{ name: string; duration: string }>; @@ -58,7 +57,7 @@ export function useFetchSloBurnRates({ // ignore error } }, - refetchInterval: shouldRefetch ? LONG_REFETCH_INTERVAL : undefined, + refetchInterval: shouldRefetch ? SLO_LONG_REFETCH_INTERVAL : undefined, refetchOnWindowFocus: false, keepPreviousData: true, } diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_details.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_details.ts index ad5511433522e..76864996168bb 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_details.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_details.ts @@ -12,6 +12,7 @@ import { RefetchQueryFilters, useQuery, } from '@tanstack/react-query'; +import { SLO_LONG_REFETCH_INTERVAL } from '../../constants'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; @@ -27,8 +28,6 @@ export interface UseFetchSloDetailsResponse { ) => Promise>; } -const LONG_REFETCH_INTERVAL = 1000 * 60; // 1 minute - export function useFetchSloDetails({ sloId, instanceId, @@ -59,7 +58,7 @@ export function useFetchSloDetails({ }, keepPreviousData: true, enabled: Boolean(sloId), - refetchInterval: shouldRefetch ? LONG_REFETCH_INTERVAL : undefined, + refetchInterval: shouldRefetch ? SLO_LONG_REFETCH_INTERVAL : undefined, refetchOnWindowFocus: false, } ); 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 8f7a9e21b20cc..a05ec3c616950 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 @@ -9,6 +9,7 @@ import { i18n } from '@kbn/i18n'; import { FindSLOResponse } from '@kbn/slo-schema'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useState } from 'react'; +import { SLO_LONG_REFETCH_INTERVAL, SLO_SHORT_REFETCH_INTERVAL } from '../../constants'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; @@ -30,9 +31,6 @@ export interface UseFetchSloListResponse { data: FindSLOResponse | undefined; } -const SHORT_REFETCH_INTERVAL = 1000 * 5; // 5 seconds -const LONG_REFETCH_INTERVAL = 1000 * 60; // 1 minute - export function useFetchSloList({ kqlQuery = '', page = 1, @@ -45,7 +43,9 @@ export function useFetchSloList({ notifications: { toasts }, } = useKibana().services; const queryClient = useQueryClient(); - const [stateRefetchInterval, setStateRefetchInterval] = useState(SHORT_REFETCH_INTERVAL); + const [stateRefetchInterval, setStateRefetchInterval] = useState( + SLO_SHORT_REFETCH_INTERVAL + ); const { isInitialLoading, isLoading, isError, isSuccess, isRefetching, data } = useQuery({ queryKey: sloKeys.list({ kqlQuery, page, sortBy, sortDirection }), @@ -81,9 +81,9 @@ export function useFetchSloList({ } if (results.find((slo) => slo.summary.status === 'NO_DATA' || !slo.summary)) { - setStateRefetchInterval(SHORT_REFETCH_INTERVAL); + setStateRefetchInterval(SLO_SHORT_REFETCH_INTERVAL); } else { - setStateRefetchInterval(LONG_REFETCH_INTERVAL); + setStateRefetchInterval(SLO_LONG_REFETCH_INTERVAL); } }, onError: (error: Error) => { 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 0dfe9cbebc82d..3a3b5d91871ea 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 @@ -6,57 +6,48 @@ */ import { GetPreviewDataResponse, Indicator } from '@kbn/slo-schema'; -import { - QueryObserverResult, - RefetchOptions, - RefetchQueryFilters, - useQuery, -} from '@tanstack/react-query'; +import { useQuery } from '@tanstack/react-query'; import { useKibana } from '../../utils/kibana_react'; import { sloKeys } from './query_key_factory'; export interface UseGetPreviewData { data: GetPreviewDataResponse | undefined; isInitialLoading: boolean; - isRefetching: boolean; isLoading: boolean; isSuccess: boolean; isError: boolean; - refetch: ( - options?: (RefetchOptions & RefetchQueryFilters) | undefined - ) => Promise>; } -export function useGetPreviewData(isValid: boolean, indicator: Indicator): UseGetPreviewData { +export function useGetPreviewData( + isValid: boolean, + indicator: Indicator, + range: { start: number; end: number } +): UseGetPreviewData { const { http } = useKibana().services; - const { isInitialLoading, isLoading, isError, isSuccess, isRefetching, data, refetch } = useQuery( - { - queryKey: sloKeys.preview(indicator), - queryFn: async ({ signal }) => { - const response = await http.post( - '/internal/observability/slos/_preview', - { - body: JSON.stringify({ indicator }), - signal, - } - ); + const { isInitialLoading, isLoading, isError, isSuccess, data } = useQuery({ + queryKey: sloKeys.preview(indicator, range), + queryFn: async ({ signal }) => { + const response = await http.post( + '/internal/observability/slos/_preview', + { + body: JSON.stringify({ indicator, range }), + signal, + } + ); - return Array.isArray(response) ? response : []; - }, - retry: false, - refetchOnWindowFocus: false, - enabled: isValid, - } - ); + return Array.isArray(response) ? response : []; + }, + retry: false, + refetchOnWindowFocus: false, + enabled: isValid, + }); return { data, isLoading, - isRefetching, isInitialLoading, isSuccess, isError, - refetch, }; } diff --git a/x-pack/plugins/observability/public/locators/slo_list.test.ts b/x-pack/plugins/observability/public/locators/slo_list.test.ts index f12bab21f6dd4..68bf2c2589fea 100644 --- a/x-pack/plugins/observability/public/locators/slo_list.test.ts +++ b/x-pack/plugins/observability/public/locators/slo_list.test.ts @@ -14,7 +14,7 @@ describe('SloListLocator', () => { const location = await locator.getLocation({}); expect(location.app).toEqual('observability'); expect(location.path).toEqual( - "/slos?search=(kqlQuery:'',page:0,sort:(by:status,direction:desc))" + "/slos?search=(kqlQuery:'',page:0,sort:(by:status,direction:desc),viewMode:compact)" ); }); @@ -24,7 +24,7 @@ describe('SloListLocator', () => { }); expect(location.app).toEqual('observability'); expect(location.path).toEqual( - "/slos?search=(kqlQuery:'slo.name:%20%22Service%20Availability%22%20and%20slo.indicator.type%20:%20%22sli.kql.custom%22',page:0,sort:(by:status,direction:desc))" + "/slos?search=(kqlQuery:'slo.name:%20%22Service%20Availability%22%20and%20slo.indicator.type%20:%20%22sli.kql.custom%22',page:0,sort:(by:status,direction:desc),viewMode:compact)" ); }); }); 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 new file mode 100644 index 0000000000000..10655cd98b121 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slo_details/components/events_chart_panel.tsx @@ -0,0 +1,167 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + Axis, + BarSeries, + Chart, + Position, + ScaleType, + Settings, + Tooltip, + TooltipType, +} from '@elastic/charts'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLoadingChart, + EuiPanel, + EuiText, + EuiTitle, + useEuiTheme, +} from '@elastic/eui'; +import numeral from '@elastic/numeral'; +import { useActiveCursor } from '@kbn/charts-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import moment from 'moment'; +import React, { useRef } from 'react'; +import { useGetPreviewData } from '../../../hooks/slo/use_get_preview_data'; +import { useKibana } from '../../../utils/kibana_react'; + +export interface Props { + slo: SLOWithSummaryResponse; + range: { + start: number; + end: number; + }; +} + +export function EventsChartPanel({ slo, range }: Props) { + const { charts, uiSettings } = useKibana().services; + const { euiTheme } = useEuiTheme(); + const { isLoading, data } = useGetPreviewData(true, slo.indicator, range); + const theme = charts.theme.useChartsTheme(); + const baseTheme = charts.theme.useChartsBaseTheme(); + const chartRef = useRef(null); + const handleCursorUpdate = useActiveCursor(charts.activeCursor, chartRef, { + isDateHistogram: true, + }); + + const dateFormat = uiSettings.get('dateFormat'); + + return ( + + + + + +

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

    +
    +
    + + + {i18n.translate('xpack.observability.slo.sloDetails.eventsChartPanel.duration', { + defaultMessage: 'Last 24h', + })} + + +
    + + + {isLoading && } + + {!isLoading && ( + + + + } + onPointerUpdate={handleCursorUpdate} + externalPointerEvents={{ + tooltip: { visible: true }, + }} + pointerUpdateDebounce={0} + pointerUpdateTrigger={'x'} + locale={i18n.getLocale()} + /> + + moment(d).format(dateFormat)} + /> + numeral(d).format('0,0')} + /> + + ({ + key: new Date(datum.date).getTime(), + value: datum.events?.good, + })) ?? [] + } + /> + + ({ + key: new Date(datum.date).getTime(), + value: datum.events?.bad, + })) ?? [] + } + /> + + )} + +
    +
    + ); +} 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 e05c9c7403dd6..3bb1ea99ad0cb 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 @@ -15,7 +15,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; -import React, { Fragment, useState } from 'react'; +import React, { Fragment, useEffect, useState } from 'react'; import { useLocation } from 'react-router-dom'; import { useFetchActiveAlerts } from '../../../hooks/slo/use_fetch_active_alerts'; @@ -23,6 +23,7 @@ import { useFetchHistoricalSummary } from '../../../hooks/slo/use_fetch_historic import { formatHistoricalData } from '../../../utils/slo/chart_data_formatter'; import { BurnRates } from './burn_rates'; import { ErrorBudgetChartPanel } from './error_budget_chart_panel'; +import { EventsChartPanel } from './events_chart_panel'; import { Overview } from './overview/overview'; import { SliChartPanel } from './sli_chart_panel'; import { SloDetailsAlerts } from './slo_detail_alerts'; @@ -35,6 +36,7 @@ export interface Props { const TAB_ID_URL_PARAM = 'tabId'; const OVERVIEW_TAB_ID = 'overview'; const ALERTS_TAB_ID = 'alerts'; +const DAY_IN_MILLISECONDS = 24 * 60 * 60 * 1000; type TabId = typeof OVERVIEW_TAB_ID | typeof ALERTS_TAB_ID; @@ -56,6 +58,22 @@ export function SloDetails({ slo, isAutoRefreshing }: Props) { historicalSummary.instanceId === (slo.instanceId ?? ALL_VALUE) ); + const [range, setRange] = useState({ + start: new Date().getTime() - DAY_IN_MILLISECONDS, + end: new Date().getTime(), + }); + + useEffect(() => { + let intervalId: any; + if (isAutoRefreshing) { + intervalId = setInterval(() => { + setRange({ start: new Date().getTime() - DAY_IN_MILLISECONDS, end: new Date().getTime() }); + }, 60 * 1000); + } + + return () => clearInterval(intervalId); + }, [isAutoRefreshing]); + const errorBudgetBurnDownData = formatHistoricalData( sloHistoricalSummary?.data, 'error_budget_remaining' @@ -94,6 +112,11 @@ 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_edit/components/common/data_preview_chart.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/common/data_preview_chart.tsx index 7dc2e00f60829..dfa52e6e572a0 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 @@ -29,11 +29,11 @@ import { } from '@elastic/eui'; import numeral from '@elastic/numeral'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { max, min } from 'lodash'; import moment from 'moment'; -import React from 'react'; +import React, { useState } from 'react'; import { useFormContext } from 'react-hook-form'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { min, max } from 'lodash'; import { useKibana } from '../../../../utils/kibana_react'; import { useDebouncedGetPreviewData } from '../../hooks/use_preview'; import { useSectionFormValidation } from '../../hooks/use_section_form_validation'; @@ -47,6 +47,8 @@ interface DataPreviewChartProps { thresholdMessage?: string; } +const ONE_HOUR_IN_MILLISECONDS = 1 * 60 * 60 * 1000; + export function DataPreviewChart({ formatPattern, threshold, @@ -63,12 +65,17 @@ export function DataPreviewChart({ watch, }); + const [range, _] = useState({ + start: new Date().getTime() - ONE_HOUR_IN_MILLISECONDS, + end: new Date().getTime(), + }); + const { data: previewData, isLoading: isPreviewLoading, isSuccess, isError, - } = useDebouncedGetPreviewData(isIndicatorSectionValid, watch('indicator')); + } = useDebouncedGetPreviewData(isIndicatorSectionValid, watch('indicator'), range); const theme = charts.theme.useChartsTheme(); const baseTheme = charts.theme.useChartsBaseTheme(); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_preview.ts b/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_preview.ts index 72cad2455525f..0aa79a391433f 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_preview.ts +++ b/x-pack/plugins/observability/public/pages/slo_edit/hooks/use_preview.ts @@ -10,7 +10,11 @@ import { debounce } from 'lodash'; import { useCallback, useEffect, useState } from 'react'; import { useGetPreviewData } from '../../../hooks/slo/use_get_preview_data'; -export function useDebouncedGetPreviewData(isIndicatorValid: boolean, indicator: Indicator) { +export function useDebouncedGetPreviewData( + isIndicatorValid: boolean, + indicator: Indicator, + range: { start: number; end: number } +) { const serializedIndicator = JSON.stringify(indicator); const [indicatorState, setIndicatorState] = useState(serializedIndicator); @@ -25,5 +29,5 @@ export function useDebouncedGetPreviewData(isIndicatorValid: boolean, indicator: } }, [indicatorState, serializedIndicator, store]); - return useGetPreviewData(isIndicatorValid, JSON.parse(indicatorState)); + return useGetPreviewData(isIndicatorValid, JSON.parse(indicatorState), range); } diff --git a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.stories.tsx b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.stories.tsx index 267ebac0ce9b4..67869e7f0e76e 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.stories.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.stories.tsx @@ -11,7 +11,7 @@ import { ComponentStory } from '@storybook/react'; import { EuiFlexGroup } from '@elastic/eui'; import { buildForecastedSlo } from '../../../../data/slo/slo'; import { KibanaReactStorybookDecorator } from '../../../../utils/kibana_react.storybook_decorator'; -import { SloBadges as Component, Props } from './slo_badges'; +import { SloBadges as Component, SloBadgesProps } from './slo_badges'; export default { component: Component, @@ -19,7 +19,7 @@ export default { decorators: [KibanaReactStorybookDecorator], }; -const Template: ComponentStory = (props: Props) => ( +const Template: ComponentStory = (props: SloBadgesProps) => ( diff --git a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx index deccd010205a0..9ff1e3c14a2b2 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx @@ -17,8 +17,9 @@ import { SloTimeWindowBadge } from './slo_time_window_badge'; import { SloRulesBadge } from './slo_rules_badge'; import type { SloRule } from '../../../../hooks/slo/use_fetch_rules_for_slo'; import { SloGroupByBadge } from '../../../../components/slo/slo_status_badge/slo_group_by_badge'; +export type ViewMode = 'default' | 'compact'; -export interface Props { +export interface SloBadgesProps { activeAlerts?: number; isLoading: boolean; rules: Array> | undefined; @@ -26,33 +27,17 @@ export interface Props { onClickRuleBadge: () => void; } -export function SloBadges({ activeAlerts, isLoading, rules, slo, onClickRuleBadge }: Props) { +export function SloBadges({ + activeAlerts, + isLoading, + rules, + slo, + onClickRuleBadge, +}: SloBadgesProps) { return ( {isLoading ? ( - <> - - - - + ) : ( <> @@ -66,3 +51,31 @@ export function SloBadges({ activeAlerts, isLoading, rules, slo, onClickRuleBadg ); } + +export function LoadingBadges() { + return ( + <> + + + + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_indicator_type_badge.tsx b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_indicator_type_badge.tsx index ad73af3d73bfa..c85eb6776680b 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_indicator_type_badge.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_indicator_type_badge.tsx @@ -6,21 +6,22 @@ */ import React from 'react'; -import { EuiBadge, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import { EuiBadge, EuiFlexItem, EuiToolTip, EuiBadgeProps } from '@elastic/eui'; import { SLOWithSummaryResponse } from '@kbn/slo-schema'; -import { euiLightVars } from '@kbn/ui-theme'; import { i18n } from '@kbn/i18n'; +import { euiLightVars } from '@kbn/ui-theme'; import { useKibana } from '../../../../utils/kibana_react'; import { convertSliApmParamsToApmAppDeeplinkUrl } from '../../../../utils/slo/convert_sli_apm_params_to_apm_app_deeplink_url'; import { isApmIndicatorType } from '../../../../utils/slo/indicator'; import { toIndicatorTypeLabel } from '../../../../utils/slo/labels'; export interface Props { + color?: EuiBadgeProps['color']; slo: SLOWithSummaryResponse; } -export function SloIndicatorTypeBadge({ slo }: Props) { +export function SloIndicatorTypeBadge({ slo, color }: Props) { const { application: { navigateToUrl }, http: { basePath }, @@ -54,7 +55,7 @@ export function SloIndicatorTypeBadge({ slo }: Props) { return ( <> - + {toIndicatorTypeLabel(slo.indicator.type)} @@ -68,7 +69,7 @@ export function SloIndicatorTypeBadge({ slo }: Props) { })} > - + ); diff --git a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_time_window_badge.tsx b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_time_window_badge.tsx index d218eeda7f0ed..b5d4ecd0224fe 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_time_window_badge.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_time_window_badge.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiBadge, EuiFlexItem } from '@elastic/eui'; +import { EuiBadge, EuiBadgeProps, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { rollingTimeWindowTypeSchema, SLOWithSummaryResponse } from '@kbn/slo-schema'; import { euiLightVars } from '@kbn/ui-theme'; @@ -15,16 +15,17 @@ import { toCalendarAlignedMomentUnitOfTime } from '../../../../utils/slo/duratio import { toDurationLabel } from '../../../../utils/slo/labels'; export interface Props { + color?: EuiBadgeProps['color']; slo: SLOWithSummaryResponse; } -export function SloTimeWindowBadge({ slo }: Props) { +export function SloTimeWindowBadge({ slo, color }: Props) { const unit = slo.timeWindow.duration.slice(-1); if (rollingTimeWindowTypeSchema.is(slo.timeWindow.type)) { return ( @@ -45,7 +46,7 @@ export function SloTimeWindowBadge({ slo }: Props) { return ( - + {i18n.translate('xpack.observability.slo.slo.timeWindow.calendar', { defaultMessage: '{elapsed}/{total} days', values: { diff --git a/x-pack/plugins/observability/public/pages/slos/components/card_view/cards_per_row.tsx b/x-pack/plugins/observability/public/pages/slos/components/card_view/cards_per_row.tsx new file mode 100644 index 0000000000000..04e787d7b3536 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/card_view/cards_per_row.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 React, { useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiFormRow, EuiSelect } from '@elastic/eui'; +import useLocalStorage from 'react-use/lib/useLocalStorage'; + +export const SLO_CARD_VIEW_PER_ROW_SIZE = 'slo-card-view-per-row-size'; + +export function CardsPerRow({ + setCardsPerRow, +}: { + setCardsPerRow: (cardsPerRow?: string) => void; +}) { + const [value, setValue] = useLocalStorage(SLO_CARD_VIEW_PER_ROW_SIZE, '3'); + + useEffect(() => { + setCardsPerRow(value); + }, [setCardsPerRow, value]); + + const options = [ + { value: '3', text: '3' }, + { value: '4', text: '4' }, + ]; + + return ( + + } + > + setValue(e.target.value)} + /> + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item.tsx b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item.tsx new file mode 100644 index 0000000000000..07ad3caf1fd00 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item.tsx @@ -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 React, { useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + Chart, + isMetricElementEvent, + Metric, + Settings, + DARK_THEME, + MetricTrendShape, +} from '@elastic/charts'; +import { EuiIcon, EuiPanel, useEuiBackgroundColor } from '@elastic/eui'; +import { SLOWithSummaryResponse, HistoricalSummaryResponse, ALL_VALUE } from '@kbn/slo-schema'; +import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { useSloListActions } from '../../hooks/use_slo_list_actions'; +import { BurnRateRuleFlyout } from '../common/burn_rate_rule_flyout'; +import { formatHistoricalData } from '../../../../utils/slo/chart_data_formatter'; +import { useKibana } from '../../../../utils/kibana_react'; +import { useSloFormattedSummary } from '../../hooks/use_slo_summary'; +import { SloCardItemActions } from './slo_card_item_actions'; +import { SloRule } from '../../../../hooks/slo/use_fetch_rules_for_slo'; +import { SloDeleteConfirmationModal } from '../../../../components/slo/delete_confirmation_modal/slo_delete_confirmation_modal'; +import { SloCardItemBadges } from './slo_card_item_badges'; + +export interface Props { + slo: SLOWithSummaryResponse; + rules: Array> | undefined; + historicalSummary?: HistoricalSummaryResponse[]; + historicalSummaryLoading: boolean; + activeAlerts?: number; + loading: boolean; + error: boolean; + cardsPerRow: number; +} + +const useCardColor = (status?: SLOWithSummaryResponse['summary']['status']) => { + const colors = { + DEGRADING: useEuiBackgroundColor('warning'), + VIOLATED: useEuiBackgroundColor('danger'), + HEALTHY: useEuiBackgroundColor('success'), + NO_DATA: useEuiBackgroundColor('subdued'), + }; + + return colors[status ?? 'NO_DATA']; +}; + +const getSubTitle = (slo: SLOWithSummaryResponse, cardsPerRow: number) => { + const subTitle = + slo.groupBy && slo.groupBy !== ALL_VALUE ? `${slo.groupBy}: ${slo.instanceId}` : ''; + if (cardsPerRow === 4) { + return subTitle.substring(0, 30) + (subTitle.length > 30 ? '..' : ''); + } + return subTitle.substring(0, 40) + (subTitle.length > 40 ? '..' : ''); +}; + +export function SloCardItem({ slo, rules, activeAlerts, historicalSummary, cardsPerRow }: Props) { + const { + application: { navigateToUrl }, + } = useKibana().services; + + const [isMouseOver, setIsMouseOver] = useState(false); + const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false); + const [isAddRuleFlyoutOpen, setIsAddRuleFlyoutOpen] = useState(false); + const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false); + + const { sliValue, sloTarget, sloDetailsUrl } = useSloFormattedSummary(slo); + + const cardColor = useCardColor(slo.summary.status); + + const subTitle = getSubTitle(slo, cardsPerRow); + + const historicalSliData = formatHistoricalData(historicalSummary, 'sli_value'); + + const { handleCreateRule, handleDeleteCancel, handleDeleteConfirm } = useSloListActions({ + slo, + setDeleteConfirmationModalOpen, + setIsActionsPopoverOpen, + setIsAddRuleFlyoutOpen, + }); + + return ( + <> + { + if (!isMouseOver) { + setIsMouseOver(true); + } + }} + onMouseLeave={() => { + if (isMouseOver) { + setIsMouseOver(false); + } + }} + paddingSize="none" + style={{ + height: '182px', + overflow: 'hidden', + position: 'relative', + }} + title={slo.summary.status} + > + + { + if (isMetricElementEvent(d)) { + navigateToUrl(sloDetailsUrl); + } + }} + locale={i18n.getLocale()} + /> + ({ + x: d.key as number, + y: d.value as number, + })), + extra: ( + + ), + icon: () => , + color: cardColor, + }, + ], + ]} + /> + + + {(isMouseOver || isActionsPopoverOpen) && ( + + )} + + + + + {isDeleteConfirmationModalOpen ? ( + + ) : null} + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item_actions.tsx b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item_actions.tsx new file mode 100644 index 0000000000000..51d1887d433fb --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item_actions.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import styled from 'styled-components'; +import { useEuiShadow } from '@elastic/eui'; +import { SloItemActions } from '../slo_item_actions'; + +type PopoverPosition = 'relative' | 'default'; + +interface ActionContainerProps { + boxShadow: string; + position: PopoverPosition; +} + +const Container = styled.div` + ${({ position }) => + position === 'relative' + ? // custom styles used to overlay the popover button on `MetricItem` + ` + display: inline-block; + position: relative; + bottom: 42px; + left: 12px; + z-index: 1; +` + : // otherwise, no custom position needed + ''} + + border-radius: ${({ theme }) => theme.eui.euiBorderRadius}; + ${({ boxShadow, position }) => (position === 'relative' ? boxShadow : '')} +`; + +interface Props { + slo: SLOWithSummaryResponse; + isActionsPopoverOpen: boolean; + setIsActionsPopoverOpen: (value: boolean) => void; + setDeleteConfirmationModalOpen: (value: boolean) => void; + setIsAddRuleFlyoutOpen: (value: boolean) => void; +} + +export function SloCardItemActions(props: Props) { + const euiShadow = useEuiShadow('l'); + + return ( + + + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item_badges.tsx b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item_badges.tsx new file mode 100644 index 0000000000000..06bc6cf19e0c9 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/card_view/slo_card_item_badges.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import React from 'react'; +import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; +import styled from 'styled-components'; +import { EuiFlexGroup } from '@elastic/eui'; +import { LoadingBadges } from '../badges/slo_badges'; +import { SloIndicatorTypeBadge } from '../badges/slo_indicator_type_badge'; +import { SloTimeWindowBadge } from '../badges/slo_time_window_badge'; +import { SloActiveAlertsBadge } from '../../../../components/slo/slo_status_badge/slo_active_alerts_badge'; +import { SloRulesBadge } from '../badges/slo_rules_badge'; +import { SloRule } from '../../../../hooks/slo/use_fetch_rules_for_slo'; + +interface Props { + hasGroupBy: boolean; + activeAlerts?: number; + slo: SLOWithSummaryResponse; + rules: Array> | undefined; + handleCreateRule: () => void; +} + +const Container = styled.div<{ hasGroupBy: boolean }>` + position: absolute; + display: inline-block; + top: ${({ hasGroupBy }) => (hasGroupBy ? '55px' : '35px')}; + left: 7px; + z-index: 1; + border-radius: ${({ theme }) => theme.eui.euiBorderRadius}; +`; + +export function SloCardItemBadges({ + slo, + activeAlerts, + rules, + handleCreateRule, + hasGroupBy, +}: Props) { + return ( + + + {!slo.summary ? ( + + ) : ( + <> + + + + + + )} + + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/card_view/slos_card_view.tsx b/x-pack/plugins/observability/public/pages/slos/components/card_view/slos_card_view.tsx new file mode 100644 index 0000000000000..3768bdbb7dac3 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/card_view/slos_card_view.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiFlexGrid, EuiFlexItem, EuiPanel, EuiSkeletonText } from '@elastic/eui'; +import { SLOWithSummaryResponse, ALL_VALUE } from '@kbn/slo-schema'; +import { EuiFlexGridProps } from '@elastic/eui/src/components/flex/flex_grid'; +import { ActiveAlerts } from '../../../../hooks/slo/use_fetch_active_alerts'; +import type { UseFetchRulesForSloResponse } from '../../../../hooks/slo/use_fetch_rules_for_slo'; +import { useFetchHistoricalSummary } from '../../../../hooks/slo/use_fetch_historical_summary'; +import { SloCardItem } from './slo_card_item'; + +export interface Props { + sloList: SLOWithSummaryResponse[]; + loading: boolean; + error: boolean; + cardsPerRow?: string; + activeAlertsBySlo: ActiveAlerts; + rulesBySlo?: UseFetchRulesForSloResponse['data']; +} + +export function SloListCardView({ + sloList, + loading, + error, + cardsPerRow, + rulesBySlo, + activeAlertsBySlo, +}: Props) { + const { isLoading: historicalSummaryLoading, data: historicalSummaries = [] } = + useFetchHistoricalSummary({ + list: sloList.map((slo) => ({ sloId: slo.id, instanceId: slo.instanceId ?? ALL_VALUE })), + }); + + if (loading && sloList.length === 0) { + return ; + } + + return ( + + {sloList.map((slo) => ( + + + historicalSummary.sloId === slo.id && + historicalSummary.instanceId === (slo.instanceId ?? ALL_VALUE) + )?.data + } + historicalSummaryLoading={historicalSummaryLoading} + cardsPerRow={Number(cardsPerRow)} + /> + + ))} + + ); +} + +function LoadingSloGrid({ gridSize }: { gridSize: number }) { + const ROWS = 4; + const COLUMNS = gridSize; + const loaders = Array(ROWS * COLUMNS).fill(null); + return ( + <> + + {loaders.map((_, i) => ( + + + + {' '} + + ))} + + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/common/burn_rate_rule_flyout.tsx b/x-pack/plugins/observability/public/pages/slos/components/common/burn_rate_rule_flyout.tsx new file mode 100644 index 0000000000000..a02730231ae5f --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/common/burn_rate_rule_flyout.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import { useQueryClient } from '@tanstack/react-query'; +import { useGetFilteredRuleTypes } from '../../../../hooks/use_get_filtered_rule_types'; +import { sloKeys } from '../../../../hooks/slo/query_key_factory'; +import { useKibana } from '../../../../utils/kibana_react'; +import { SLO_BURN_RATE_RULE_TYPE_ID } from '../../../../../common/constants'; +import { sloFeatureId } from '../../../../../common'; + +export function BurnRateRuleFlyout({ + slo, + isAddRuleFlyoutOpen, + setIsAddRuleFlyoutOpen, +}: { + slo: SLOWithSummaryResponse; + isAddRuleFlyoutOpen: boolean; + setIsAddRuleFlyoutOpen: (value: boolean) => void; +}) { + const { + triggersActionsUi: { getAddRuleFlyout: AddRuleFlyout }, + } = useKibana().services; + + const filteredRuleTypes = useGetFilteredRuleTypes(); + + const queryClient = useQueryClient(); + + const handleSavedRule = async () => { + queryClient.invalidateQueries({ queryKey: sloKeys.rules(), exact: false }); + }; + + return isAddRuleFlyoutOpen ? ( + { + setIsAddRuleFlyoutOpen(false); + }} + useRuleProducer + /> + ) : null; +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_item_actions.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_item_actions.tsx new file mode 100644 index 0000000000000..4fb03968d40a0 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_item_actions.tsx @@ -0,0 +1,217 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + EuiButtonIcon, + EuiContextMenuItem, + EuiContextMenuPanel, + EuiPopover, + EuiButtonIconProps, + useEuiShadow, + EuiPanel, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; +import styled from 'styled-components'; +import { useCapabilities } from '../../../hooks/slo/use_capabilities'; +import { useCloneSlo } from '../../../hooks/slo/use_clone_slo'; +import { useKibana } from '../../../utils/kibana_react'; +import { paths } from '../../../../common/locators/paths'; +import { RulesParams } from '../../../locators/rules'; +import { rulesLocatorID } from '../../../../common'; +import { + transformCreateSLOFormToCreateSLOInput, + transformSloResponseToCreateSloForm, +} from '../../slo_edit/helpers/process_slo_form_values'; + +interface Props { + slo: SLOWithSummaryResponse; + isActionsPopoverOpen: boolean; + setIsActionsPopoverOpen: (value: boolean) => void; + setDeleteConfirmationModalOpen: (value: boolean) => void; + setIsAddRuleFlyoutOpen: (value: boolean) => void; + btnProps?: Partial; +} +const CustomShadowPanel = styled(EuiPanel)<{ shadow: string }>` + ${(props) => props.shadow} +`; + +function IconPanel({ children, hasPanel }: { children: JSX.Element; hasPanel: boolean }) { + const shadow = useEuiShadow('s'); + if (!hasPanel) return children; + return ( + + {children} + + ); +} + +export function SloItemActions({ + slo, + isActionsPopoverOpen, + setIsActionsPopoverOpen, + setIsAddRuleFlyoutOpen, + setDeleteConfirmationModalOpen, + btnProps, +}: Props) { + const { + application: { navigateToUrl }, + http: { basePath }, + share: { + url: { locators }, + }, + } = useKibana().services; + const { hasWriteCapabilities } = useCapabilities(); + const { mutate: cloneSlo } = useCloneSlo(); + + const sloDetailsUrl = basePath.prepend( + paths.observability.sloDetails( + slo.id, + slo.groupBy !== ALL_VALUE && slo.instanceId ? slo.instanceId : undefined + ) + ); + + const handleClickActions = () => { + setIsActionsPopoverOpen(!isActionsPopoverOpen); + }; + + const handleViewDetails = () => { + navigateToUrl(sloDetailsUrl); + }; + + const handleEdit = () => { + navigateToUrl(basePath.prepend(paths.observability.sloEdit(slo.id))); + }; + + const handleNavigateToRules = async () => { + const locator = locators.get(rulesLocatorID); + locator?.navigate({ params: { sloId: slo.id } }, { replace: false }); + }; + + const handleClone = () => { + const newSlo = transformCreateSLOFormToCreateSLOInput( + transformSloResponseToCreateSloForm({ ...slo, name: `[Copy] ${slo.name}` })! + ); + + cloneSlo({ slo: newSlo, originalSloId: slo.id }); + setIsActionsPopoverOpen(false); + }; + + const handleDelete = () => { + setDeleteConfirmationModalOpen(true); + setIsActionsPopoverOpen(false); + }; + + const handleCreateRule = () => { + setIsActionsPopoverOpen(false); + setIsAddRuleFlyoutOpen(true); + }; + + const btn = ( + + ); + + return ( + {btn} : btn} + panelPaddingSize="m" + closePopover={handleClickActions} + isOpen={isActionsPopoverOpen} + > + + {i18n.translate('xpack.observability.slo.item.actions.details', { + defaultMessage: 'Details', + })} + , + + {i18n.translate('xpack.observability.slo.item.actions.edit', { + defaultMessage: 'Edit', + })} + , + + {i18n.translate('xpack.observability.slo.item.actions.createRule', { + defaultMessage: 'Create new alert rule', + })} + , + + {i18n.translate('xpack.observability.slo.item.actions.manageRules', { + defaultMessage: 'Manage rules', + })} + , + + {i18n.translate('xpack.observability.slo.item.actions.clone', { + defaultMessage: 'Clone', + })} + , + + {i18n.translate('xpack.observability.slo.item.actions.delete', { + defaultMessage: 'Delete', + })} + , + ]} + /> + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx index 380d0100db1a1..ee1fff8e17c1d 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx @@ -8,9 +8,12 @@ import { EuiFlexGroup, EuiFlexItem, EuiPagination } from '@elastic/eui'; import { useIsMutating } from '@tanstack/react-query'; import React, { useState } from 'react'; +import useLocalStorage from 'react-use/lib/useLocalStorage'; +import { SlosView } from './slos_view'; +import { SLO_CARD_VIEW_PER_ROW_SIZE } from './card_view/cards_per_row'; +import { SLOViewType, ToggleSLOView } from './toggle_slo_view'; import { useFetchSloList } from '../../../hooks/slo/use_fetch_slo_list'; import { useUrlSearchState } from '../hooks/use_url_search_state'; -import { SloListItems } from './slo_list_items'; import { SloListSearchBar, SortField } from './slo_list_search_bar'; export interface Props { @@ -24,6 +27,8 @@ export function SloList({ autoRefresh }: Props) { const [sort, setSort] = useState(state.sort.by); const [direction] = useState<'asc' | 'desc'>(state.sort.direction); + const [sloView, setSLOView] = useState('cardView'); + const { isLoading, isRefetching, @@ -43,6 +48,7 @@ export function SloList({ autoRefresh }: Props) { const isCloningSlo = Boolean(useIsMutating(['cloningSlo'])); const isUpdatingSlo = Boolean(useIsMutating(['updatingSlo'])); const isDeletingSlo = Boolean(useIsMutating(['deleteSlo'])); + const [cardsPerRow, setCardsPerRow] = useLocalStorage(SLO_CARD_VIEW_PER_ROW_SIZE, '4'); const handlePageClick = (pageNumber: number) => { setPage(pageNumber); @@ -71,9 +77,16 @@ export function SloList({ autoRefresh }: Props) { initialState={state} /> - - + + + {total > 0 ? ( diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx index ae843977a0ee7..90757be5dc7a9 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx @@ -5,37 +5,16 @@ * 2.0. */ -import { - EuiButtonIcon, - EuiContextMenuItem, - EuiContextMenuPanel, - EuiFlexGroup, - EuiFlexItem, - EuiPanel, - EuiPopover, - EuiText, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { ALL_VALUE, HistoricalSummaryResponse, SLOWithSummaryResponse } from '@kbn/slo-schema'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiText } from '@elastic/eui'; +import { HistoricalSummaryResponse, SLOWithSummaryResponse } from '@kbn/slo-schema'; import type { Rule } from '@kbn/triggers-actions-ui-plugin/public'; -import { useQueryClient } from '@tanstack/react-query'; import React, { useState } from 'react'; +import { useSloFormattedSummary } from '../hooks/use_slo_summary'; +import { BurnRateRuleFlyout } from './common/burn_rate_rule_flyout'; +import { useSloListActions } from '../hooks/use_slo_list_actions'; +import { SloItemActions } from './slo_item_actions'; import { SloDeleteConfirmationModal } from '../../../components/slo/delete_confirmation_modal/slo_delete_confirmation_modal'; -import { rulesLocatorID, sloFeatureId } from '../../../../common'; -import { SLO_BURN_RATE_RULE_TYPE_ID } from '../../../../common/constants'; -import { paths } from '../../../../common/locators/paths'; -import { sloKeys } from '../../../hooks/slo/query_key_factory'; -import { useCapabilities } from '../../../hooks/slo/use_capabilities'; -import { useCloneSlo } from '../../../hooks/slo/use_clone_slo'; -import { useDeleteSlo } from '../../../hooks/slo/use_delete_slo'; import type { SloRule } from '../../../hooks/slo/use_fetch_rules_for_slo'; -import { useGetFilteredRuleTypes } from '../../../hooks/use_get_filtered_rule_types'; -import type { RulesParams } from '../../../locators/rules'; -import { useKibana } from '../../../utils/kibana_react'; -import { - transformCreateSLOFormToCreateSLOInput, - transformSloResponseToCreateSloForm, -} from '../../slo_edit/helpers/process_slo_form_values'; import { SloBadges } from './badges/slo_badges'; import { SloSummary } from './slo_summary'; @@ -54,80 +33,18 @@ export function SloListItem({ historicalSummaryLoading, activeAlerts, }: SloListItemProps) { - const { - application: { navigateToUrl }, - http: { basePath }, - share: { - url: { locators }, - }, - triggersActionsUi: { getAddRuleFlyout: AddRuleFlyout }, - } = useKibana().services; - const { hasWriteCapabilities } = useCapabilities(); - const queryClient = useQueryClient(); - - const filteredRuleTypes = useGetFilteredRuleTypes(); - - const { mutate: cloneSlo } = useCloneSlo(); - const { mutate: deleteSlo } = useDeleteSlo(); - const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false); const [isAddRuleFlyoutOpen, setIsAddRuleFlyoutOpen] = useState(false); const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false); - const handleClickActions = () => { - setIsActionsPopoverOpen(!isActionsPopoverOpen); - }; - - const sloDetailsUrl = basePath.prepend( - paths.observability.sloDetails( - slo.id, - slo.groupBy !== ALL_VALUE && slo.instanceId ? slo.instanceId : undefined - ) - ); - const handleViewDetails = () => { - navigateToUrl(sloDetailsUrl); - }; - - const handleEdit = () => { - navigateToUrl(basePath.prepend(paths.observability.sloEdit(slo.id))); - }; - - const handleCreateRule = () => { - setIsActionsPopoverOpen(false); - setIsAddRuleFlyoutOpen(true); - }; - - const handleSavedRule = async () => { - queryClient.invalidateQueries({ queryKey: sloKeys.rules(), exact: false }); - }; + const { sloDetailsUrl } = useSloFormattedSummary(slo); - const handleNavigateToRules = async () => { - const locator = locators.get(rulesLocatorID); - locator?.navigate({ params: { sloId: slo.id } }, { replace: false }); - }; - - const handleClone = () => { - const newSlo = transformCreateSLOFormToCreateSLOInput( - transformSloResponseToCreateSloForm({ ...slo, name: `[Copy] ${slo.name}` })! - ); - - cloneSlo({ slo: newSlo, originalSloId: slo.id }); - setIsActionsPopoverOpen(false); - }; - - const handleDelete = () => { - setDeleteConfirmationModalOpen(true); - setIsActionsPopoverOpen(false); - }; - - const handleDeleteConfirm = () => { - setDeleteConfirmationModalOpen(false); - deleteSlo({ id: slo.id, name: slo.name }); - }; - - const handleDeleteCancel = () => { - setDeleteConfirmationModalOpen(false); - }; + const { handleCreateRule, handleDeleteCancel, handleDeleteConfirm } = useSloListActions({ + slo, + setDeleteConfirmationModalOpen, + setIsActionsPopoverOpen, + setIsAddRuleFlyoutOpen, + }); return ( @@ -172,113 +89,21 @@ export function SloListItem({ {/* ACTIONS */} - - } - panelPaddingSize="m" - closePopover={handleClickActions} - isOpen={isActionsPopoverOpen} - > - - {i18n.translate('xpack.observability.slo.item.actions.details', { - defaultMessage: 'Details', - })} - , - - {i18n.translate('xpack.observability.slo.item.actions.edit', { - defaultMessage: 'Edit', - })} - , - - {i18n.translate('xpack.observability.slo.item.actions.createRule', { - defaultMessage: 'Create new alert rule', - })} - , - - {i18n.translate('xpack.observability.slo.item.actions.manageRules', { - defaultMessage: 'Manage rules', - })} - , - - {i18n.translate('xpack.observability.slo.item.actions.clone', { - defaultMessage: 'Clone', - })} - , - - {i18n.translate('xpack.observability.slo.item.actions.delete', { - defaultMessage: 'Delete', - })} - , - ]} - /> - + - {isAddRuleFlyoutOpen ? ( - { - setIsAddRuleFlyoutOpen(false); - }} - useRuleProducer - /> - ) : null} + {isDeleteConfirmationModalOpen ? ( = (props: Props) => [slo.id, slo.instanceId ?? ALL_VALUE] as [string, string] - ); - - const { data: activeAlertsBySlo } = useFetchActiveAlerts({ sloIdsAndInstanceIds }); - const { data: rulesBySlo } = useFetchRulesForSlo({ - sloIds: sloIdsAndInstanceIds.map((item) => item[0]), - }); +export function SloListItems({ sloList, activeAlertsBySlo, rulesBySlo }: Props) { const { isLoading: historicalSummaryLoading, data: historicalSummaries = [] } = useFetchHistoricalSummary({ list: sloList.map((slo) => ({ sloId: slo.id, instanceId: slo.instanceId ?? ALL_VALUE })), }); - if (!loading && !error && sloList.length === 0) { - return ; - } - if (!loading && error) { - return ; - } - return ( {sloList.map((slo) => ( diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_summary.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_summary.tsx index 401118e3c8dfc..77d23d6301aed 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_summary.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_summary.tsx @@ -6,13 +6,11 @@ */ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiStat } from '@elastic/eui'; -import numeral from '@elastic/numeral'; import { i18n } from '@kbn/i18n'; import { HistoricalSummaryResponse, SLOWithSummaryResponse } from '@kbn/slo-schema'; -import { useKibana } from '../../../utils/kibana_react'; +import { useSloFormattedSummary } from '../hooks/use_slo_summary'; import { formatHistoricalData } from '../../../utils/slo/chart_data_formatter'; -import { NOT_AVAILABLE_LABEL } from '../../../../common/i18n'; import { SloSparkline } from './slo_sparkline'; export interface Props { @@ -22,18 +20,12 @@ export interface Props { } export function SloSummary({ slo, historicalSummary = [], historicalSummaryLoading }: Props) { - const { uiSettings } = useKibana().services; - const percentFormat = uiSettings.get('format:percent:defaultPattern'); + const { sliValue, sloTarget, errorBudgetRemaining } = useSloFormattedSummary(slo); const isSloFailed = slo.summary.status === 'VIOLATED' || slo.summary.status === 'DEGRADING'; const titleColor = isSloFailed ? 'danger' : ''; const errorBudgetBurnDownData = formatHistoricalData(historicalSummary, 'error_budget_remaining'); const historicalSliData = formatHistoricalData(historicalSummary, 'sli_value'); - const errorBudgetRemaining = - slo.summary.errorBudget.remaining <= 0 - ? Math.trunc(slo.summary.errorBudget.remaining * 100) / 100 - : slo.summary.errorBudget.remaining; - return ( @@ -48,13 +40,9 @@ export function SloSummary({ slo, historicalSummary = [], historicalSummaryLoadi [slo.id, slo.instanceId ?? ALL_VALUE] as [string, string] + ); + + const { data: activeAlertsBySlo } = useFetchActiveAlerts({ sloIdsAndInstanceIds }); + const { data: rulesBySlo } = useFetchRulesForSlo({ + sloIds: sloIdsAndInstanceIds.map((item) => item[0]), + }); + + if (!loading && !error && sloList.length === 0) { + return ; + } + if (!loading && error) { + return ; + } + + return sloView === 'cardView' ? ( + + + + ) : ( + + + + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/toggle_slo_view.tsx b/x-pack/plugins/observability/public/pages/slos/components/toggle_slo_view.tsx new file mode 100644 index 0000000000000..43b5d849b2e0b --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/components/toggle_slo_view.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { + EuiButtonGroup, + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiPopover, + EuiPopoverTitle, +} from '@elastic/eui'; +import { CardsPerRow } from './card_view/cards_per_row'; + +export type SLOViewType = 'cardView' | 'listView'; + +interface Props { + setCardsPerRow: (gridSize?: string) => void; + setSLOView: (view: SLOViewType) => void; + sloView: SLOViewType; +} +const toggleButtonsIcons = [ + { + id: `cardView`, + label: 'Card View', + iconType: 'visGauge', + 'data-test-subj': 'sloCardViewButton', + }, + { + id: `listView`, + label: 'List View', + iconType: 'list', + 'data-test-subj': 'sloListViewButton', + }, +]; + +export function ToggleSLOView({ sloView, setSLOView, setCardsPerRow }: Props) { + return ( + + + setSLOView(id as SLOViewType)} + isIconOnly + /> + + {sloView === 'cardView' && ( + + + + )} + + ); +} + +function ViewSettings({ setCardsPerRow }: { setCardsPerRow: (cardsPerRow?: string) => void }) { + const [isPopoverOpen, setIsPopoverOpen] = React.useState(false); + + return ( + setIsPopoverOpen(!isPopoverOpen)} + /> + } + isOpen={isPopoverOpen} + closePopover={() => setIsPopoverOpen(false)} + anchorPosition="downCenter" + > + + + +
    + +
    +
    + ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/hooks/use_slo_list_actions.ts b/x-pack/plugins/observability/public/pages/slos/hooks/use_slo_list_actions.ts new file mode 100644 index 0000000000000..169e1e54c5222 --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/hooks/use_slo_list_actions.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 { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import { useDeleteSlo } from '../../../hooks/slo/use_delete_slo'; + +export function useSloListActions({ + slo, + setIsAddRuleFlyoutOpen, + setIsActionsPopoverOpen, + setDeleteConfirmationModalOpen, +}: { + slo: SLOWithSummaryResponse; + setIsActionsPopoverOpen: (val: boolean) => void; + setIsAddRuleFlyoutOpen: (val: boolean) => void; + setDeleteConfirmationModalOpen: (val: boolean) => void; +}) { + const { mutate: deleteSlo } = useDeleteSlo(); + + const handleDeleteConfirm = () => { + setDeleteConfirmationModalOpen(false); + deleteSlo({ id: slo.id, name: slo.name }); + }; + + const handleDeleteCancel = () => { + setDeleteConfirmationModalOpen(false); + }; + const handleCreateRule = () => { + setIsActionsPopoverOpen(false); + setIsAddRuleFlyoutOpen(true); + }; + + return { + handleDeleteConfirm, + handleDeleteCancel, + handleCreateRule, + }; +} diff --git a/x-pack/plugins/observability/public/pages/slos/hooks/use_slo_summary.ts b/x-pack/plugins/observability/public/pages/slos/hooks/use_slo_summary.ts new file mode 100644 index 0000000000000..547bd41b4f5db --- /dev/null +++ b/x-pack/plugins/observability/public/pages/slos/hooks/use_slo_summary.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import numeral from '@elastic/numeral'; +import { ALL_VALUE, SLOWithSummaryResponse } from '@kbn/slo-schema'; +import { paths } from '../../../../common/locators/paths'; +import { useKibana } from '../../../utils/kibana_react'; +import { NOT_AVAILABLE_LABEL } from '../../../../common/i18n'; + +export const useSloFormattedSummary = (slo: SLOWithSummaryResponse) => { + const { + http: { basePath }, + } = useKibana().services; + const { uiSettings } = useKibana().services; + const percentFormat = uiSettings.get('format:percent:defaultPattern'); + + const sliValue = + slo.summary.status === 'NO_DATA' + ? NOT_AVAILABLE_LABEL + : numeral(slo.summary.sliValue).format(percentFormat); + + const sloTarget = numeral(slo.objective.target).format(percentFormat); + const errorBudgetRemaining = + slo.summary.errorBudget.remaining <= 0 + ? Math.trunc(slo.summary.errorBudget.remaining * 100) / 100 + : slo.summary.errorBudget.remaining; + + const errorBudgetRemainingTitle = + slo.summary.status === 'NO_DATA' + ? NOT_AVAILABLE_LABEL + : numeral(errorBudgetRemaining).format(percentFormat); + + const sloDetailsUrl = basePath.prepend( + paths.observability.sloDetails( + slo.id, + slo.groupBy !== ALL_VALUE && slo.instanceId ? slo.instanceId : undefined + ) + ); + + return { + sloDetailsUrl, + sliValue, + sloTarget, + errorBudgetRemaining: errorBudgetRemainingTitle, + }; +}; diff --git a/x-pack/plugins/observability/public/pages/slos/hooks/use_url_search_state.ts b/x-pack/plugins/observability/public/pages/slos/hooks/use_url_search_state.ts index 7a0c03215fb91..aaa87cb921ae6 100644 --- a/x-pack/plugins/observability/public/pages/slos/hooks/use_url_search_state.ts +++ b/x-pack/plugins/observability/public/pages/slos/hooks/use_url_search_state.ts @@ -8,6 +8,7 @@ import { useHistory } from 'react-router-dom'; import { createKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; import deepmerge from 'deepmerge'; +import { ViewMode } from '../components/badges/slo_badges'; import type { SortField } from '../components/slo_list_search_bar'; export const SLO_LIST_SEARCH_URL_STORAGE_KEY = 'search'; @@ -19,12 +20,14 @@ export interface SearchState { by: SortField; direction: 'asc' | 'desc'; }; + viewMode: ViewMode; } export const DEFAULT_STATE = { kqlQuery: '', page: 0, sort: { by: 'status' as const, direction: 'desc' as const }, + viewMode: 'compact' as const, }; export function useUrlSearchState(): { 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 3e19b7a466be5..6c63d270ef8e8 100644 --- a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { act, screen, waitFor } from '@testing-library/react'; +import { act, fireEvent, screen, waitFor } from '@testing-library/react'; import React from 'react'; import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; @@ -211,6 +211,9 @@ describe('SLOs Page', () => { await act(async () => { render(); }); + expect(await screen.findByTestId('sloListViewButton')).toBeTruthy(); + + fireEvent.click(screen.getByTestId('sloListViewButton')); expect(screen.queryByTestId('slosPage')).toBeTruthy(); expect(screen.queryByTestId('sloList')).toBeTruthy(); @@ -229,6 +232,8 @@ describe('SLOs Page', () => { await act(async () => { render(); }); + expect(await screen.findByTestId('sloListViewButton')).toBeTruthy(); + fireEvent.click(screen.getByTestId('sloListViewButton')); screen.getAllByLabelText('Actions').at(0)?.click(); @@ -256,7 +261,8 @@ describe('SLOs Page', () => { await act(async () => { render(); }); - + expect(await screen.findByTestId('sloListViewButton')).toBeTruthy(); + fireEvent.click(screen.getByTestId('sloListViewButton')); screen.getAllByLabelText('Actions').at(0)?.click(); await waitForEuiPopoverOpen(); @@ -281,7 +287,8 @@ describe('SLOs Page', () => { await act(async () => { render(); }); - + expect(await screen.findByTestId('sloListViewButton')).toBeTruthy(); + fireEvent.click(screen.getByTestId('sloListViewButton')); screen.getAllByLabelText('Actions').at(0)?.click(); await waitForEuiPopoverOpen(); @@ -307,6 +314,8 @@ describe('SLOs Page', () => { render(); }); + expect(await screen.findByTestId('sloListViewButton')).toBeTruthy(); + fireEvent.click(screen.getByTestId('sloListViewButton')); screen.getAllByLabelText('Actions').at(0)?.click(); await waitForEuiPopoverOpen(); @@ -337,6 +346,8 @@ describe('SLOs Page', () => { render(); }); + expect(await screen.findByTestId('sloListViewButton')).toBeTruthy(); + fireEvent.click(screen.getByTestId('sloListViewButton')); screen.getAllByLabelText('Actions').at(0)?.click(); await waitForEuiPopoverOpen(); diff --git a/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts index e5301b8ac8da1..c2340fbc046fb 100644 --- a/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts +++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/custom_threshold_executor.test.ts @@ -21,7 +21,6 @@ import { CustomThresholdAlertContext } from './types'; import { Evaluation } from './lib/evaluate_rule'; import type { LogMeta, Logger } from '@kbn/logging'; import { DEFAULT_FLAPPING_SETTINGS } from '@kbn/alerting-plugin/common'; -import { CUSTOM_AGGREGATOR } from '../../../../common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -1883,7 +1882,6 @@ declare global { } const customThresholdNonCountCriterion: CustomMetricExpressionParams = { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { @@ -1898,7 +1896,6 @@ const customThresholdNonCountCriterion: CustomMetricExpressionParams = { }; const customThresholdCountCriterion: CustomMetricExpressionParams = { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, metrics: [ { diff --git a/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.test.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.test.ts index 53a89303fa171..01d94dd5f7d67 100644 --- a/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.test.ts +++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/lib/metric_query.test.ts @@ -6,7 +6,6 @@ */ import moment from 'moment'; -import { CUSTOM_AGGREGATOR } from '../../../../../common/custom_threshold_rule/constants'; import { Comparator, Aggregators, @@ -23,7 +22,6 @@ describe("The Metric Threshold Alert's getElasticsearchMetricQuery", () => { field: 'system.is.a.good.puppy.dog', }, ], - aggType: CUSTOM_AGGREGATOR, timeUnit: 'm', timeSize: 1, threshold: [1], diff --git a/x-pack/plugins/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts b/x-pack/plugins/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts index 2166c21db8609..db4402dca7e88 100644 --- a/x-pack/plugins/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts +++ b/x-pack/plugins/observability/server/lib/rules/custom_threshold/register_custom_threshold_rule_type.ts @@ -43,7 +43,6 @@ import { oneOfLiterals, validateKQLStringFilter } from './utils'; import { createCustomThresholdExecutor } from './custom_threshold_executor'; import { FIRED_ACTION, NO_DATA_ACTION } from './constants'; import { ObservabilityConfig } from '../../..'; -import { METRIC_EXPLORER_AGGREGATIONS } from '../../../../common/custom_threshold_rule/constants'; export const MetricsRulesTypeAlertDefinition: IRuleTypeAlerts = { context: THRESHOLD_RULE_REGISTRATION_CONTEXT, @@ -79,27 +78,9 @@ export function thresholdRuleType( timeSize: schema.number(), }; - const nonCountCriterion = schema.object({ - ...baseCriterion, - metric: schema.string(), - aggType: oneOfLiterals(METRIC_EXPLORER_AGGREGATIONS), - metrics: schema.never(), - equation: schema.never(), - label: schema.never(), - }); - - const countCriterion = schema.object({ - ...baseCriterion, - aggType: schema.literal('count'), - metric: schema.never(), - metrics: schema.never(), - equation: schema.never(), - label: schema.never(), - }); - const customCriterion = schema.object({ ...baseCriterion, - aggType: schema.literal('custom'), + aggType: schema.maybe(schema.literal('custom')), metric: schema.never(), metrics: schema.arrayOf( schema.oneOf([ @@ -133,9 +114,7 @@ export function thresholdRuleType( validate: { params: schema.object( { - criteria: schema.arrayOf( - schema.oneOf([countCriterion, nonCountCriterion, customCriterion]) - ), + criteria: schema.arrayOf(customCriterion), groupBy: schema.maybe(schema.oneOf([schema.string(), schema.arrayOf(schema.string())])), alertOnNoData: schema.maybe(schema.boolean()), alertOnGroupDisappear: schema.maybe(schema.boolean()), 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 2fd80c09d3875..ea8be2c3b6ef2 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 @@ -5,6 +5,7 @@ * 2.0. */ +import { calculateAuto } from '@kbn/calculate-auto'; import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; import { @@ -18,6 +19,7 @@ import { TimesliceMetricIndicator, } from '@kbn/slo-schema'; import { assertNever } from '@kbn/std'; +import moment from 'moment'; import { APMTransactionDurationIndicator } from '../../domain/models'; import { computeSLI } from '../../domain/services'; import { InvalidQueryError } from '../../errors'; @@ -27,11 +29,19 @@ import { GetTimesliceMetricIndicatorAggregation, } from './aggregations'; +interface Options { + range: { + start: number; + end: number; + }; + interval: string; +} export class GetPreviewData { constructor(private esClient: ElasticsearchClient) {} private async getAPMTransactionDurationPreviewData( - indicator: APMTransactionDurationIndicator + indicator: APMTransactionDurationIndicator, + options: Options ): Promise { const filter = []; if (indicator.params.service !== ALL_VALUE) @@ -61,7 +71,7 @@ export class GetPreviewData { query: { bool: { filter: [ - { range: { '@timestamp': { gte: 'now-60m' } } }, + { range: { '@timestamp': { gte: options.range.start, lte: options.range.end } } }, { terms: { 'processor.event': ['metric'] } }, { term: { 'metricset.name': 'transaction' } }, { exists: { field: 'transaction.duration.histogram' } }, @@ -73,7 +83,7 @@ export class GetPreviewData { perMinute: { date_histogram: { field: '@timestamp', - fixed_interval: '1m', + fixed_interval: options.interval, }, aggs: { _good: { @@ -105,11 +115,17 @@ export class GetPreviewData { date: bucket.key_as_string, sliValue: !!bucket.good && !!bucket.total ? computeSLI(bucket.good.value, bucket.total.value) : null, + events: { + good: bucket.good?.value ?? 0, + bad: (bucket.total?.value ?? 0) - (bucket.good?.value ?? 0), + total: bucket.total?.value ?? 0, + }, })); } private async getAPMTransactionErrorPreviewData( - indicator: APMTransactionErrorRateIndicator + indicator: APMTransactionErrorRateIndicator, + options: Options ): Promise { const filter = []; if (indicator.params.service !== ALL_VALUE) @@ -137,7 +153,7 @@ export class GetPreviewData { query: { bool: { filter: [ - { range: { '@timestamp': { gte: 'now-60m' } } }, + { range: { '@timestamp': { gte: options.range.start, lte: options.range.end } } }, { term: { 'metricset.name': 'transaction' } }, { terms: { 'event.outcome': ['success', 'failure'] } }, ...filter, @@ -148,7 +164,7 @@ export class GetPreviewData { perMinute: { date_histogram: { field: '@timestamp', - fixed_interval: '1m', + fixed_interval: options.interval, }, aggs: { good: { @@ -179,28 +195,37 @@ export class GetPreviewData { !!bucket.good && !!bucket.total ? computeSLI(bucket.good.doc_count, bucket.total.doc_count) : null, + events: { + good: bucket.good?.doc_count ?? 0, + bad: (bucket.total?.doc_count ?? 0) - (bucket.good?.doc_count ?? 0), + total: bucket.total?.doc_count ?? 0, + }, })); } private async getHistogramPreviewData( - indicator: HistogramIndicator + indicator: HistogramIndicator, + options: Options ): Promise { const getHistogramIndicatorAggregations = new GetHistogramIndicatorAggregation(indicator); const filterQuery = getElastichsearchQueryOrThrow(indicator.params.filter); const timestampField = indicator.params.timestampField; - const options = { + const result = await this.esClient.search({ index: indicator.params.index, size: 0, query: { bool: { - filter: [{ range: { [timestampField]: { gte: 'now-60m' } } }, filterQuery], + filter: [ + { range: { [timestampField]: { gte: options.range.start, lte: options.range.end } } }, + filterQuery, + ], }, }, aggs: { perMinute: { date_histogram: { field: timestampField, - fixed_interval: '1m', + fixed_interval: options.interval, }, aggs: { ...getHistogramIndicatorAggregations.execute({ @@ -214,19 +239,24 @@ export class GetPreviewData { }, }, }, - }; - const result = await this.esClient.search(options); + }); // @ts-ignore buckets is not improperly typed return result.aggregations?.perMinute.buckets.map((bucket) => ({ date: bucket.key_as_string, sliValue: !!bucket.good && !!bucket.total ? computeSLI(bucket.good.value, bucket.total.value) : null, + events: { + good: bucket.good?.value ?? 0, + bad: (bucket.total?.value ?? 0) - (bucket.good?.value ?? 0), + total: bucket.total?.value ?? 0, + }, })); } private async getCustomMetricPreviewData( - indicator: MetricCustomIndicator + indicator: MetricCustomIndicator, + options: Options ): Promise { const timestampField = indicator.params.timestampField; const filterQuery = getElastichsearchQueryOrThrow(indicator.params.filter); @@ -236,14 +266,17 @@ export class GetPreviewData { size: 0, query: { bool: { - filter: [{ range: { [timestampField]: { gte: 'now-60m' } } }, filterQuery], + filter: [ + { range: { [timestampField]: { gte: options.range.start, lte: options.range.end } } }, + filterQuery, + ], }, }, aggs: { perMinute: { date_histogram: { field: timestampField, - fixed_interval: '1m', + fixed_interval: options.interval, }, aggs: { ...getCustomMetricIndicatorAggregation.execute({ @@ -264,11 +297,17 @@ export class GetPreviewData { date: bucket.key_as_string, sliValue: !!bucket.good && !!bucket.total ? computeSLI(bucket.good.value, bucket.total.value) : null, + events: { + good: bucket.good?.value ?? 0, + bad: (bucket.total?.value ?? 0) - (bucket.good?.value ?? 0), + total: bucket.total?.value ?? 0, + }, })); } private async getTimesliceMetricPreviewData( - indicator: TimesliceMetricIndicator + indicator: TimesliceMetricIndicator, + options: Options ): Promise { const timestampField = indicator.params.timestampField; const filterQuery = getElastichsearchQueryOrThrow(indicator.params.filter); @@ -280,14 +319,17 @@ export class GetPreviewData { size: 0, query: { bool: { - filter: [{ range: { [timestampField]: { gte: 'now-60m' } } }, filterQuery], + filter: [ + { range: { [timestampField]: { gte: options.range.start, lte: options.range.end } } }, + filterQuery, + ], }, }, aggs: { perMinute: { date_histogram: { field: timestampField, - fixed_interval: '1m', + fixed_interval: options.interval, }, aggs: { ...getCustomMetricIndicatorAggregation.execute('metric'), @@ -304,7 +346,8 @@ export class GetPreviewData { } private async getCustomKQLPreviewData( - indicator: KQLCustomIndicator + indicator: KQLCustomIndicator, + options: Options ): Promise { const filterQuery = getElastichsearchQueryOrThrow(indicator.params.filter); const goodQuery = getElastichsearchQueryOrThrow(indicator.params.good); @@ -315,14 +358,17 @@ export class GetPreviewData { size: 0, query: { bool: { - filter: [{ range: { [timestampField]: { gte: 'now-60m' } } }, filterQuery], + filter: [ + { range: { [timestampField]: { gte: options.range.start, lte: options.range.end } } }, + filterQuery, + ], }, }, aggs: { perMinute: { date_histogram: { field: timestampField, - fixed_interval: '1m', + fixed_interval: options.interval, }, aggs: { good: { filter: goodQuery }, @@ -339,25 +385,41 @@ export class GetPreviewData { !!bucket.good && !!bucket.total ? computeSLI(bucket.good.doc_count, bucket.total.doc_count) : null, + events: { + good: bucket.good?.doc_count ?? 0, + bad: (bucket.total?.doc_count ?? 0) - (bucket.good?.doc_count ?? 0), + total: bucket.total?.doc_count ?? 0, + }, })); } 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 + ); + const options: Options = { + range: params.range, + interval: `${bucketSize}m`, + }; + const type = params.indicator.type; switch (type) { case 'sli.apm.transactionDuration': - return this.getAPMTransactionDurationPreviewData(params.indicator); + return this.getAPMTransactionDurationPreviewData(params.indicator, options); case 'sli.apm.transactionErrorRate': - return this.getAPMTransactionErrorPreviewData(params.indicator); + return this.getAPMTransactionErrorPreviewData(params.indicator, options); case 'sli.kql.custom': - return this.getCustomKQLPreviewData(params.indicator); + return this.getCustomKQLPreviewData(params.indicator, options); case 'sli.histogram.custom': - return this.getHistogramPreviewData(params.indicator); + return this.getHistogramPreviewData(params.indicator, options); case 'sli.metric.custom': - return this.getCustomMetricPreviewData(params.indicator); + return this.getCustomMetricPreviewData(params.indicator, options); case 'sli.metric.timeslice': - return this.getTimesliceMetricPreviewData(params.indicator); + return this.getTimesliceMetricPreviewData(params.indicator, options); default: assertNever(type); } diff --git a/x-pack/plugins/observability/tsconfig.json b/x-pack/plugins/observability/tsconfig.json index 57a1deb071337..f2bd514a4c4ef 100644 --- a/x-pack/plugins/observability/tsconfig.json +++ b/x-pack/plugins/observability/tsconfig.json @@ -94,7 +94,8 @@ "@kbn/core-chrome-browser", "@kbn/lens-embeddable-utils", "@kbn/serverless", - "@kbn/dashboard-plugin" + "@kbn/dashboard-plugin", + "@kbn/calculate-auto" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx b/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx index 8c6463ca9318c..8f9c477c5d4ef 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/insight/insight.tsx @@ -280,7 +280,15 @@ function ChatContent({ ); } -export function Insight({ messages, title }: { messages: Message[]; title: string }) { +export function Insight({ + messages, + title, + dataTestSubj, +}: { + messages: Message[]; + title: string; + dataTestSubj?: string; +}) { const [hasOpened, setHasOpened] = useState(false); const connectors = useGenAIConnectors(); @@ -322,6 +330,7 @@ export function Insight({ messages, title }: { messages: Message[]; title: strin }} controls={} loading={connectors.loading || chatService.loading} + dataTestSubj={dataTestSubj} > {chatService.value ? ( diff --git a/x-pack/plugins/observability_ai_assistant/public/components/insight/insight_base.tsx b/x-pack/plugins/observability_ai_assistant/public/components/insight/insight_base.tsx index b6c0b4db906b7..f288129c7ba9f 100644 --- a/x-pack/plugins/observability_ai_assistant/public/components/insight/insight_base.tsx +++ b/x-pack/plugins/observability_ai_assistant/public/components/insight/insight_base.tsx @@ -32,6 +32,7 @@ export interface InsightBaseProps { onToggle: (isOpen: boolean) => void; children: React.ReactNode; loading?: boolean; + dataTestSubj?: string; } export function InsightBase({ @@ -44,6 +45,7 @@ export function InsightBase({ actions, onToggle, loading, + dataTestSubj = 'obsAiAssistantInsightButton', }: InsightBaseProps) { const { euiTheme } = useEuiTheme(); @@ -59,7 +61,7 @@ export function InsightBase({ id="obsAiAssistantInsight" arrowProps={{ css: { alignSelf: 'flex-start' } }} buttonContent={ - + diff --git a/x-pack/plugins/observability_log_explorer/kibana.jsonc b/x-pack/plugins/observability_log_explorer/kibana.jsonc index 72d03b82d3386..92d2ad70c3175 100644 --- a/x-pack/plugins/observability_log_explorer/kibana.jsonc +++ b/x-pack/plugins/observability_log_explorer/kibana.jsonc @@ -19,6 +19,7 @@ "observabilityShared", "share", "kibanaUtils", + "datasetQuality" ], "optionalPlugins": [ "serverless" diff --git a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx index a8c6602f9d49f..8a49db7536350 100644 --- a/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx +++ b/x-pack/plugins/observability_log_explorer/public/applications/observability_log_explorer.tsx @@ -10,7 +10,7 @@ import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; import React from 'react'; import ReactDOM from 'react-dom'; -import { ObservablityLogExplorerMainRoute } from '../routes/main'; +import { DatasetQualityRoute, ObservablityLogExplorerMainRoute } from '../routes/main'; import { ObservabilityLogExplorerAppMountParameters, ObservabilityLogExplorerPluginStart, @@ -72,6 +72,11 @@ export const ObservabilityLogExplorerApp = ({ exact={true} render={() => } /> + } + /> diff --git a/x-pack/plugins/observability_log_explorer/public/components/page_template.tsx b/x-pack/plugins/observability_log_explorer/public/components/page_template.tsx index e79b8b1bc6271..d128c6e8a7779 100644 --- a/x-pack/plugins/observability_log_explorer/public/components/page_template.tsx +++ b/x-pack/plugins/observability_log_explorer/public/components/page_template.tsx @@ -13,10 +13,14 @@ import React from 'react'; export const ObservabilityLogExplorerPageTemplate = ({ children, observabilityShared, + pageProps, }: React.PropsWithChildren<{ observabilityShared: ObservabilitySharedPluginStart; + pageProps?: EuiPageSectionProps; }>) => ( - + {children} ); diff --git a/x-pack/plugins/observability_log_explorer/public/routes/main/dataset_quality_route.tsx b/x-pack/plugins/observability_log_explorer/public/routes/main/dataset_quality_route.tsx new file mode 100644 index 0000000000000..b76a462eba25d --- /dev/null +++ b/x-pack/plugins/observability_log_explorer/public/routes/main/dataset_quality_route.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from '@kbn/core/public'; +import React from 'react'; +import { EuiBreadcrumb } from '@elastic/eui'; +import { datasetQualityAppTitle } from '@kbn/dataset-quality-plugin/public'; +import { ObservabilityLogExplorerPageTemplate } from '../../components/page_template'; +import { useBreadcrumbs } from '../../utils/breadcrumbs'; +import { useKibanaContextForPlugin } from '../../utils/use_kibana'; + +export interface DatasetQualityRouteProps { + core: CoreStart; +} + +export const DatasetQualityRoute = ({ core }: DatasetQualityRouteProps) => { + const { services } = useKibanaContextForPlugin(); + const { observabilityShared, serverless, datasetQuality: DatasetQuality } = services; + const breadcrumb: EuiBreadcrumb[] = [ + { + text: datasetQualityAppTitle, + }, + ]; + + useBreadcrumbs(breadcrumb, core.chrome, serverless); + + return ( + <> + + + + + ); +}; diff --git a/x-pack/plugins/observability_log_explorer/public/routes/main/index.tsx b/x-pack/plugins/observability_log_explorer/public/routes/main/index.tsx index 889e340497cf9..9d755f302d162 100644 --- a/x-pack/plugins/observability_log_explorer/public/routes/main/index.tsx +++ b/x-pack/plugins/observability_log_explorer/public/routes/main/index.tsx @@ -6,3 +6,4 @@ */ export * from './main_route'; +export * from './dataset_quality_route'; diff --git a/x-pack/plugins/observability_log_explorer/public/types.ts b/x-pack/plugins/observability_log_explorer/public/types.ts index 8b315ad206ce4..5f455088b7442 100644 --- a/x-pack/plugins/observability_log_explorer/public/types.ts +++ b/x-pack/plugins/observability_log_explorer/public/types.ts @@ -13,6 +13,7 @@ import { ServerlessPluginStart } from '@kbn/serverless/public'; import { SharePluginSetup, SharePluginStart } from '@kbn/share-plugin/public'; import { AppMountParameters, ScopedHistory } from '@kbn/core/public'; import { LogsSharedClientStartExports } from '@kbn/logs-shared-plugin/public'; +import { DatasetQualityPluginStart } from '@kbn/dataset-quality-plugin/public'; import { ObservabilityLogExplorerLocators, ObservabilityLogExplorerLocationState, @@ -38,6 +39,7 @@ export interface ObservabilityLogExplorerStartDeps { observabilityShared: ObservabilitySharedPluginStart; serverless?: ServerlessPluginStart; share: SharePluginStart; + datasetQuality: DatasetQualityPluginStart; } export type ObservabilityLogExplorerHistory = ScopedHistory; diff --git a/x-pack/plugins/observability_log_explorer/tsconfig.json b/x-pack/plugins/observability_log_explorer/tsconfig.json index 109b54b929ec7..24327c31c26a3 100644 --- a/x-pack/plugins/observability_log_explorer/tsconfig.json +++ b/x-pack/plugins/observability_log_explorer/tsconfig.json @@ -34,7 +34,8 @@ "@kbn/xstate-utils", "@kbn/shared-ux-utility", "@kbn/ui-theme", - "@kbn/logs-shared-plugin" + "@kbn/logs-shared-plugin", + "@kbn/dataset-quality-plugin" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx new file mode 100644 index 0000000000000..02908cdf67a0c --- /dev/null +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/embeddable_profiling_search_bar.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { css } from '@emotion/react'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { default as React, useEffect, useRef, useState } from 'react'; +import { EMBEDDABLE_PROFILING_SEARCH_BAR } from '.'; +import { ObservabilitySharedStart } from '../../../plugin'; + +export interface EmbeddableProfilingSearchBarProps { + kuery: string; + showDatePicker?: boolean; + onQuerySubmit: (params: { + dateRange: { from: string; to: string; mode?: 'absolute' | 'relative' }; + query: string; + }) => void; + onRefresh: () => void; + rangeFrom: string; + rangeTo: string; +} + +export function EmbeddableProfilingSearchBar(props: EmbeddableProfilingSearchBarProps) { + const { embeddable: embeddablePlugin } = useKibana().services; + const [embeddable, setEmbeddable] = useState(); + const embeddableRoot: React.RefObject = useRef(null); + + useEffect(() => { + async function createEmbeddable() { + const factory = embeddablePlugin?.getEmbeddableFactory(EMBEDDABLE_PROFILING_SEARCH_BAR); + const input = { + id: 'embeddable_profiling', + }; + const embeddableObject = await factory?.create(input); + setEmbeddable(embeddableObject); + } + createEmbeddable(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if (embeddableRoot.current && embeddable) { + embeddable.render(embeddableRoot.current); + } + }, [embeddable, embeddableRoot]); + + useEffect(() => { + if (embeddable) { + embeddable.updateInput({ + ...props, + }); + embeddable.reload(); + } + }, [embeddable, props]); + + return ( +
    + ); +} diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts index 2e346d55c835a..05556b839cff4 100644 --- a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/index.ts @@ -14,3 +14,11 @@ export { EmbeddableFlamegraph } from './embeddable_flamegraph'; export const EMBEDDABLE_FUNCTIONS = 'EMBEDDABLE_FUNCTIONS'; /** Profiling functions embeddable */ export { EmbeddableFunctions } from './embeddable_functions'; + +/** Profiling search bar embeddable key */ +export const EMBEDDABLE_PROFILING_SEARCH_BAR = 'EMBEDDABLE_PROFILING_SEARCH_BAR'; +/** Profiling search bar embeddable */ +export { + EmbeddableProfilingSearchBar, + type EmbeddableProfilingSearchBarProps, +} from './embeddable_profiling_search_bar'; diff --git a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx index 1a703d11ed6c9..00f29c10c1593 100644 --- a/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx +++ b/x-pack/plugins/observability_shared/public/components/profiling/embeddables/profiling_embeddable.tsx @@ -31,7 +31,11 @@ export function ProfilingEmbeddable({ useEffect(() => { async function createEmbeddable() { const factory = embeddablePlugin?.getEmbeddableFactory(embeddableFactoryId); - const input = { id: 'embeddable_profiling', data, isLoading }; + const input = { + id: 'embeddable_profiling', + data, + isLoading, + }; const embeddableObject = await factory?.create(input); setEmbeddable(embeddableObject); } @@ -47,7 +51,11 @@ export function ProfilingEmbeddable({ useEffect(() => { if (embeddable) { - embeddable.updateInput({ data, isLoading, ...props }); + embeddable.updateInput({ + data, + isLoading, + ...props, + }); embeddable.reload(); } }, [data, embeddable, isLoading, props]); diff --git a/x-pack/plugins/observability_shared/public/index.ts b/x-pack/plugins/observability_shared/public/index.ts index 66492328e4b89..cbb59c3d2debe 100644 --- a/x-pack/plugins/observability_shared/public/index.ts +++ b/x-pack/plugins/observability_shared/public/index.ts @@ -83,6 +83,9 @@ export { export { EMBEDDABLE_FLAMEGRAPH, EMBEDDABLE_FUNCTIONS, + EMBEDDABLE_PROFILING_SEARCH_BAR, EmbeddableFlamegraph, EmbeddableFunctions, + EmbeddableProfilingSearchBar, + type EmbeddableProfilingSearchBarProps, } from './components/profiling/embeddables'; diff --git a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts index e43dbf4b5d487..fc79d1b9a69bb 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/live_query.cy.ts @@ -58,7 +58,10 @@ describe('ALL - Live Query', { tags: ['@ess', '@serverless'] }, () => { expect(interception.response?.body.data.queries[0]).to.have.property('timeout', 890); }); checkResults(); - cy.get('[data-gridcell-column-index="0"][data-gridcell-row-index="0"]').should('exist').click(); + cy.get('[data-gridcell-column-index="0"][data-gridcell-row-index="0"]').should('exist'); + cy.get( + '[data-gridcell-column-index="0"][data-gridcell-row-index="0"] [data-datagrid-interactable="true"]' + ).click(); cy.url().should('include', 'app/fleet/agents/'); }); diff --git a/x-pack/plugins/osquery/package.json b/x-pack/plugins/osquery/package.json index a708e9a383031..4e9070d780d28 100644 --- a/x-pack/plugins/osquery/package.json +++ b/x-pack/plugins/osquery/package.json @@ -12,7 +12,7 @@ "cypress:run": "yarn cypress run", "cypress:serverless": "NODE_OPTIONS=--openssl-legacy-provider node ../security_solution/scripts/start_cypress_parallel --config-file ../osquery/cypress/serverless_cypress.config.ts --ftr-config-file ../../../x-pack/test/osquery_cypress/serverless_cli_config", "cypress:serverless:open": "yarn cypress:serverless open", - "cypress:serverless:run": "yarn cypress:serverless run --spec ./cypress/e2e/all/packs_integration.cy.ts", + "cypress:serverless:run": "yarn cypress:serverless run", "nyc": "../../../node_modules/.bin/nyc report --reporter=text-summary", "junit:merge": "../../../node_modules/.bin/mochawesome-merge ../../../target/kibana-osquery/cypress/results/mochawesome*.json > ../../../target/kibana-osquery/cypress/results/output.json && ../../../node_modules/.bin/marge ../../../target/kibana-osquery/cypress/results/output.json --reportDir ../../../target/kibana-osquery/cypress/results && yarn junit:transform && mkdir -p ../../../target/junit && cp ../../../target/kibana-osquery/cypress/results/*.xml ../../../target/junit/", "junit:transform": "node ../security_solution/scripts/junit_transformer --pathPattern '../../../target/kibana-osquery/cypress/results/*.xml' --rootDirectory ../../../ --reportName 'Osquery Cypress' --writeInPlace", diff --git a/x-pack/plugins/osquery/public/common/schemas/ecs/v8.11.0.json b/x-pack/plugins/osquery/public/common/schemas/ecs/v8.11.0.json new file mode 100644 index 0000000000000..dc58c07386899 --- /dev/null +++ b/x-pack/plugins/osquery/public/common/schemas/ecs/v8.11.0.json @@ -0,0 +1 @@ +[{"field":"labels","type":"object","normalization":"","example":{"application":"foo-bar","env":"production"},"description":"Custom key/value pairs."},{"field":"message","type":"match_only_text","normalization":"","example":"Hello World","description":"Log message optimized for viewing in a log viewer."},{"field":"tags","type":"keyword","normalization":"array","example":["production","env2"],"description":"List of keywords used to tag each event."},{"field":"agent.build.original","type":"keyword","normalization":"","example":"metricbeat version 7.6.0 (amd64), libbeat 7.6.0 [6a23e8f8f30f5001ba344e4e54d8d9cb82cb107c built 2020-02-05 23:10:10 +0000 UTC]","description":"Extended build information for the agent."},{"field":"client.address","type":"keyword","normalization":"","example":"","description":"Client network address."},{"field":"client.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"client.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"client.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"client.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the client to the server."},{"field":"client.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the client."},{"field":"client.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"client.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"client.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"client.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"client.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"client.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"client.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"client.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"client.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"client.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"client.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"client.ip","type":"ip","normalization":"","example":"","description":"IP address of the client."},{"field":"client.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the client."},{"field":"client.nat.ip","type":"ip","normalization":"","example":"","description":"Client NAT ip address"},{"field":"client.nat.port","type":"long","normalization":"","example":"","description":"Client NAT port"},{"field":"client.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the client to the server."},{"field":"client.port","type":"long","normalization":"","example":"","description":"Port of the client."},{"field":"client.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered client domain, stripped of the subdomain."},{"field":"client.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"client.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"client.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"client.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"client.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"client.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"client.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"client.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"client.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"client.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"client.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"client.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"client.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"client.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"cloud.account.id","type":"keyword","normalization":"","example":666777888999,"description":"The cloud account or organization id."},{"field":"cloud.account.name","type":"keyword","normalization":"","example":"elastic-dev","description":"The cloud account name."},{"field":"cloud.availability_zone","type":"keyword","normalization":"","example":"us-east-1c","description":"Availability zone in which this host, resource, or service is located."},{"field":"cloud.instance.id","type":"keyword","normalization":"","example":"i-1234567890abcdef0","description":"Instance ID of the host machine."},{"field":"cloud.instance.name","type":"keyword","normalization":"","example":"","description":"Instance name of the host machine."},{"field":"cloud.machine.type","type":"keyword","normalization":"","example":"t2.medium","description":"Machine type of the host machine."},{"field":"cloud.origin.account.id","type":"keyword","normalization":"","example":666777888999,"description":"The cloud account or organization id."},{"field":"cloud.origin.account.name","type":"keyword","normalization":"","example":"elastic-dev","description":"The cloud account name."},{"field":"cloud.origin.availability_zone","type":"keyword","normalization":"","example":"us-east-1c","description":"Availability zone in which this host, resource, or service is located."},{"field":"cloud.origin.instance.id","type":"keyword","normalization":"","example":"i-1234567890abcdef0","description":"Instance ID of the host machine."},{"field":"cloud.origin.instance.name","type":"keyword","normalization":"","example":"","description":"Instance name of the host machine."},{"field":"cloud.origin.machine.type","type":"keyword","normalization":"","example":"t2.medium","description":"Machine type of the host machine."},{"field":"cloud.origin.project.id","type":"keyword","normalization":"","example":"my-project","description":"The cloud project id."},{"field":"cloud.origin.project.name","type":"keyword","normalization":"","example":"my project","description":"The cloud project name."},{"field":"cloud.origin.provider","type":"keyword","normalization":"","example":"aws","description":"Name of the cloud provider."},{"field":"cloud.origin.region","type":"keyword","normalization":"","example":"us-east-1","description":"Region in which this host, resource, or service is located."},{"field":"cloud.origin.service.name","type":"keyword","normalization":"","example":"lambda","description":"The cloud service name."},{"field":"cloud.project.id","type":"keyword","normalization":"","example":"my-project","description":"The cloud project id."},{"field":"cloud.project.name","type":"keyword","normalization":"","example":"my project","description":"The cloud project name."},{"field":"cloud.provider","type":"keyword","normalization":"","example":"aws","description":"Name of the cloud provider."},{"field":"cloud.region","type":"keyword","normalization":"","example":"us-east-1","description":"Region in which this host, resource, or service is located."},{"field":"cloud.service.name","type":"keyword","normalization":"","example":"lambda","description":"The cloud service name."},{"field":"cloud.target.account.id","type":"keyword","normalization":"","example":666777888999,"description":"The cloud account or organization id."},{"field":"cloud.target.account.name","type":"keyword","normalization":"","example":"elastic-dev","description":"The cloud account name."},{"field":"cloud.target.availability_zone","type":"keyword","normalization":"","example":"us-east-1c","description":"Availability zone in which this host, resource, or service is located."},{"field":"cloud.target.instance.id","type":"keyword","normalization":"","example":"i-1234567890abcdef0","description":"Instance ID of the host machine."},{"field":"cloud.target.instance.name","type":"keyword","normalization":"","example":"","description":"Instance name of the host machine."},{"field":"cloud.target.machine.type","type":"keyword","normalization":"","example":"t2.medium","description":"Machine type of the host machine."},{"field":"cloud.target.project.id","type":"keyword","normalization":"","example":"my-project","description":"The cloud project id."},{"field":"cloud.target.project.name","type":"keyword","normalization":"","example":"my project","description":"The cloud project name."},{"field":"cloud.target.provider","type":"keyword","normalization":"","example":"aws","description":"Name of the cloud provider."},{"field":"cloud.target.region","type":"keyword","normalization":"","example":"us-east-1","description":"Region in which this host, resource, or service is located."},{"field":"cloud.target.service.name","type":"keyword","normalization":"","example":"lambda","description":"The cloud service name."},{"field":"container.cpu.usage","type":"scaled_float","normalization":"","example":"","description":"Percent CPU used, between 0 and 1."},{"field":"container.disk.read.bytes","type":"long","normalization":"","example":"","description":"The number of bytes read by all disks."},{"field":"container.disk.write.bytes","type":"long","normalization":"","example":"","description":"The number of bytes written on all disks."},{"field":"container.id","type":"keyword","normalization":"","example":"","description":"Unique container id."},{"field":"container.image.hash.all","type":"keyword","normalization":"array","example":"[sha256:f8fefc80e3273dc756f288a63945820d6476ad64883892c771b5e2ece6bf1b26]","description":"An array of digests of the image the container was built on."},{"field":"container.image.name","type":"keyword","normalization":"","example":"","description":"Name of the image the container was built on."},{"field":"container.image.tag","type":"keyword","normalization":"array","example":"","description":"Container image tags."},{"field":"container.labels","type":"object","normalization":"","example":"","description":"Image labels."},{"field":"container.memory.usage","type":"scaled_float","normalization":"","example":"","description":"Percent memory used, between 0 and 1."},{"field":"container.name","type":"keyword","normalization":"","example":"","description":"Container name."},{"field":"container.network.egress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes sent on all network interfaces."},{"field":"container.network.ingress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes received on all network interfaces."},{"field":"container.runtime","type":"keyword","normalization":"","example":"docker","description":"Runtime managing this container."},{"field":"container.security_context.privileged","type":"boolean","normalization":"","example":"","description":"Indicates whether the container is running in privileged mode."},{"field":"data_stream.dataset","type":"constant_keyword","normalization":"","example":"nginx.access","description":"The field can contain anything that makes sense to signify the source of the data."},{"field":"data_stream.namespace","type":"constant_keyword","normalization":"","example":"production","description":"A user defined namespace. Namespaces are useful to allow grouping of data."},{"field":"data_stream.type","type":"constant_keyword","normalization":"","example":"logs","description":"An overarching type for the data stream."},{"field":"destination.address","type":"keyword","normalization":"","example":"","description":"Destination network address."},{"field":"destination.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"destination.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"destination.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"destination.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the destination to the source."},{"field":"destination.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the destination."},{"field":"destination.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"destination.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"destination.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"destination.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"destination.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"destination.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"destination.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"destination.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"destination.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"destination.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"destination.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"destination.ip","type":"ip","normalization":"","example":"","description":"IP address of the destination."},{"field":"destination.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the destination."},{"field":"destination.nat.ip","type":"ip","normalization":"","example":"","description":"Destination NAT ip"},{"field":"destination.nat.port","type":"long","normalization":"","example":"","description":"Destination NAT Port"},{"field":"destination.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the destination to the source."},{"field":"destination.port","type":"long","normalization":"","example":"","description":"Port of the destination."},{"field":"destination.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered destination domain, stripped of the subdomain."},{"field":"destination.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"destination.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"destination.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"destination.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"destination.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"destination.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"destination.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"destination.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"destination.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"destination.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"destination.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"destination.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"destination.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"destination.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"device.id","type":"keyword","normalization":"","example":"00000000-54b3-e7c7-0000-000046bffd97","description":"The unique identifier of a device."},{"field":"device.manufacturer","type":"keyword","normalization":"","example":"Samsung","description":"The vendor name of the device manufacturer."},{"field":"device.model.identifier","type":"keyword","normalization":"","example":"SM-G920F","description":"The machine readable identifier of the device model."},{"field":"device.model.name","type":"keyword","normalization":"","example":"Samsung Galaxy S6","description":"The human readable marketing name of the device model."},{"field":"dll.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"dll.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"dll.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"dll.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"dll.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"dll.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"dll.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"dll.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"dll.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"dll.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"dll.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"dll.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"dll.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"dll.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"dll.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"dll.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"dll.name","type":"keyword","normalization":"","example":"kernel32.dll","description":"Name of the library."},{"field":"dll.path","type":"keyword","normalization":"","example":"C:\\Windows\\System32\\kernel32.dll","description":"Full file path of the library."},{"field":"dll.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"dll.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"dll.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"dll.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"dll.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"dll.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"dll.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"dll.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"dll.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"dll.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"dll.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"dll.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"dll.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"dll.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"dll.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"dll.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"dll.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"dll.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"dll.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"dll.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"dll.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"dll.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"dll.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"dns.answers","type":"object","normalization":"array","example":"","description":"Array of DNS answers."},{"field":"dns.answers.class","type":"keyword","normalization":"","example":"IN","description":"The class of DNS data contained in this resource record."},{"field":"dns.answers.data","type":"keyword","normalization":"","example":"10.10.10.10","description":"The data describing the resource."},{"field":"dns.answers.name","type":"keyword","normalization":"","example":"www.example.com","description":"The domain name to which this resource record pertains."},{"field":"dns.answers.ttl","type":"long","normalization":"","example":180,"description":"The time interval in seconds that this resource record may be cached before it should be discarded."},{"field":"dns.answers.type","type":"keyword","normalization":"","example":"CNAME","description":"The type of data contained in this resource record."},{"field":"dns.header_flags","type":"keyword","normalization":"array","example":["RD","RA"],"description":"Array of DNS header flags."},{"field":"dns.id","type":"keyword","normalization":"","example":62111,"description":"The DNS packet identifier assigned by the program that generated the query. The identifier is copied to the response."},{"field":"dns.op_code","type":"keyword","normalization":"","example":"QUERY","description":"The DNS operation code that specifies the kind of query in the message."},{"field":"dns.question.class","type":"keyword","normalization":"","example":"IN","description":"The class of records being queried."},{"field":"dns.question.name","type":"keyword","normalization":"","example":"www.example.com","description":"The name being queried."},{"field":"dns.question.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered domain, stripped of the subdomain."},{"field":"dns.question.subdomain","type":"keyword","normalization":"","example":"www","description":"The subdomain of the domain."},{"field":"dns.question.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"dns.question.type","type":"keyword","normalization":"","example":"AAAA","description":"The type of record being queried."},{"field":"dns.resolved_ip","type":"ip","normalization":"array","example":["10.10.10.10","10.10.10.11"],"description":"Array containing all IPs seen in answers.data"},{"field":"dns.response_code","type":"keyword","normalization":"","example":"NOERROR","description":"The DNS response code."},{"field":"dns.type","type":"keyword","normalization":"","example":"answer","description":"The type of DNS event captured, query or answer."},{"field":"email.attachments","type":"nested","normalization":"array","example":"","description":"List of objects describing the attachments."},{"field":"email.attachments.file.extension","type":"keyword","normalization":"","example":"txt","description":"Attachment file extension."},{"field":"email.attachments.file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"email.attachments.file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"email.attachments.file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"email.attachments.file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"email.attachments.file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"email.attachments.file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"email.attachments.file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"email.attachments.file.mime_type","type":"keyword","normalization":"","example":"text/plain","description":"MIME type of the attachment file."},{"field":"email.attachments.file.name","type":"keyword","normalization":"","example":"attachment.txt","description":"Name of the attachment file."},{"field":"email.attachments.file.size","type":"long","normalization":"","example":64329,"description":"Attachment file size."},{"field":"email.bcc.address","type":"keyword","normalization":"array","example":"bcc.user1@example.com","description":"Email address of BCC recipient"},{"field":"email.cc.address","type":"keyword","normalization":"array","example":"cc.user1@example.com","description":"Email address of CC recipient"},{"field":"email.content_type","type":"keyword","normalization":"","example":"text/plain","description":"MIME type of the email message."},{"field":"email.delivery_timestamp","type":"date","normalization":"","example":"2020-11-10T22:12:34.8196921Z","description":"Date and time when message was delivered."},{"field":"email.direction","type":"keyword","normalization":"","example":"inbound","description":"Direction of the message."},{"field":"email.from.address","type":"keyword","normalization":"array","example":"sender@example.com","description":"The sender's email address."},{"field":"email.local_id","type":"keyword","normalization":"","example":"c26dbea0-80d5-463b-b93c-4e8b708219ce","description":"Unique identifier given by the source."},{"field":"email.message_id","type":"wildcard","normalization":"","example":"81ce15$8r2j59@mail01.example.com","description":"Value from the Message-ID header."},{"field":"email.origination_timestamp","type":"date","normalization":"","example":"2020-11-10T22:12:34.8196921Z","description":"Date and time the email was composed."},{"field":"email.reply_to.address","type":"keyword","normalization":"array","example":"reply.here@example.com","description":"Address replies should be delivered to."},{"field":"email.sender.address","type":"keyword","normalization":"","example":"","description":"Address of the message sender."},{"field":"email.subject","type":"keyword","normalization":"","example":"Please see this important message.","description":"The subject of the email message."},{"field":"email.subject.text","type":"match_only_text","normalization":"","example":"Please see this important message.","description":"The subject of the email message."},{"field":"email.to.address","type":"keyword","normalization":"array","example":"user1@example.com","description":"Email address of recipient"},{"field":"email.x_mailer","type":"keyword","normalization":"","example":"Spambot v2.5","description":"Application that drafted email."},{"field":"error.code","type":"keyword","normalization":"","example":"","description":"Error code describing the error."},{"field":"error.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the error."},{"field":"error.message","type":"match_only_text","normalization":"","example":"","description":"Error message."},{"field":"error.stack_trace","type":"wildcard","normalization":"","example":"","description":"The stack trace of this error in plain text."},{"field":"error.stack_trace.text","type":"match_only_text","normalization":"","example":"","description":"The stack trace of this error in plain text."},{"field":"error.type","type":"keyword","normalization":"","example":"java.lang.NullPointerException","description":"The type of the error, for example the class name of the exception."},{"field":"event.action","type":"keyword","normalization":"","example":"user-password-change","description":"The action captured by the event."},{"field":"event.category","type":"keyword","normalization":"array","example":"authentication","description":"Event category. The second categorization field in the hierarchy."},{"field":"event.code","type":"keyword","normalization":"","example":4648,"description":"Identification code for this event."},{"field":"event.created","type":"date","normalization":"","example":"2016-05-23T08:05:34.857Z","description":"Time when the event was first read by an agent or by your pipeline."},{"field":"event.dataset","type":"keyword","normalization":"","example":"apache.access","description":"Name of the dataset."},{"field":"event.duration","type":"long","normalization":"","example":"","description":"Duration of the event in nanoseconds."},{"field":"event.end","type":"date","normalization":"","example":"","description":"`event.end` contains the date when the event ended or when the activity was last observed."},{"field":"event.hash","type":"keyword","normalization":"","example":"123456789012345678901234567890ABCD","description":"Hash (perhaps logstash fingerprint) of raw field to be able to demonstrate log integrity."},{"field":"event.id","type":"keyword","normalization":"","example":"8a4f500d","description":"Unique ID to describe the event."},{"field":"event.kind","type":"keyword","normalization":"","example":"alert","description":"The kind of the event. The highest categorization field in the hierarchy."},{"field":"event.original","type":"keyword","normalization":"","example":"Sep 19 08:26:10 host CEF:0|Security| threatmanager|1.0|100| worm successfully stopped|10|src=10.0.0.1 dst=2.1.2.2spt=1232","description":"Raw text message of entire event."},{"field":"event.outcome","type":"keyword","normalization":"","example":"success","description":"The outcome of the event. The lowest level categorization field in the hierarchy."},{"field":"event.provider","type":"keyword","normalization":"","example":"kernel","description":"Source of the event."},{"field":"event.reason","type":"keyword","normalization":"","example":"Terminated an unexpected process","description":"Reason why this event happened, according to the source"},{"field":"event.reference","type":"keyword","normalization":"","example":"https://system.example.com/event/#0001234","description":"Event reference URL"},{"field":"event.risk_score","type":"float","normalization":"","example":"","description":"Risk score or priority of the event (e.g. security solutions). Use your system's original value here."},{"field":"event.risk_score_norm","type":"float","normalization":"","example":"","description":"Normalized risk score or priority of the event (0-100)."},{"field":"event.sequence","type":"long","normalization":"","example":"","description":"Sequence number of the event."},{"field":"event.severity","type":"long","normalization":"","example":7,"description":"Numeric severity of the event."},{"field":"event.start","type":"date","normalization":"","example":"","description":"`event.start` contains the date when the event started or when the activity was first observed."},{"field":"event.timezone","type":"keyword","normalization":"","example":"","description":"Event time zone."},{"field":"event.type","type":"keyword","normalization":"array","example":"","description":"Event type. The third categorization field in the hierarchy."},{"field":"event.url","type":"keyword","normalization":"","example":"https://mysystem.example.com/alert/5271dedb-f5b0-4218-87f0-4ac4870a38fe","description":"Event investigation URL"},{"field":"faas.coldstart","type":"boolean","normalization":"","example":"","description":"Boolean value indicating a cold start of a function."},{"field":"faas.execution","type":"keyword","normalization":"","example":"af9d5aa4-a685-4c5f-a22b-444f80b3cc28","description":"The execution ID of the current function execution."},{"field":"faas.id","type":"keyword","normalization":"","example":"arn:aws:lambda:us-west-2:123456789012:function:my-function","description":"The unique identifier of a serverless function."},{"field":"faas.name","type":"keyword","normalization":"","example":"my-function","description":"The name of a serverless function."},{"field":"faas.trigger.request_id","type":"keyword","normalization":"","example":123456789,"description":"The ID of the trigger request , message, event, etc."},{"field":"faas.trigger.type","type":"keyword","normalization":"","example":"http","description":"The trigger for the function execution."},{"field":"faas.version","type":"keyword","normalization":"","example":123,"description":"The version of a serverless function."},{"field":"file.accessed","type":"date","normalization":"","example":"","description":"Last time the file was accessed."},{"field":"file.attributes","type":"keyword","normalization":"array","example":["readonly","system"],"description":"Array of file attributes."},{"field":"file.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"file.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"file.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"file.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"file.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"file.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"file.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"file.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"file.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"file.created","type":"date","normalization":"","example":"","description":"File creation time."},{"field":"file.ctime","type":"date","normalization":"","example":"","description":"Last time the file attributes or metadata changed."},{"field":"file.device","type":"keyword","normalization":"","example":"sda","description":"Device that is the source of the file."},{"field":"file.directory","type":"keyword","normalization":"","example":"/home/alice","description":"Directory where the file is located."},{"field":"file.drive_letter","type":"keyword","normalization":"","example":"C","description":"Drive letter where the file is located."},{"field":"file.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"file.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"file.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"file.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"file.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"file.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"file.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"file.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"file.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"file.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"file.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"file.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"file.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"file.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"file.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"file.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"file.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"file.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"file.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"file.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"file.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"file.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"file.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"file.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"file.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"file.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"file.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"file.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"file.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"file.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"file.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"file.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"file.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"file.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"file.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"file.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"file.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"file.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"file.extension","type":"keyword","normalization":"","example":"png","description":"File extension, excluding the leading dot."},{"field":"file.fork_name","type":"keyword","normalization":"","example":"Zone.Identifer","description":"A fork is additional data associated with a filesystem object."},{"field":"file.gid","type":"keyword","normalization":"","example":1001,"description":"Primary group ID (GID) of the file."},{"field":"file.group","type":"keyword","normalization":"","example":"alice","description":"Primary group name of the file."},{"field":"file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"file.inode","type":"keyword","normalization":"","example":256383,"description":"Inode representing the file in the filesystem."},{"field":"file.macho.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a Mach-O file."},{"field":"file.macho.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"file.macho.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"file.macho.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"file.macho.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"file.macho.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a Mach-O file."},{"field":"file.macho.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"file.macho.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"file.macho.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"file.macho.sections","type":"nested","normalization":"array","example":"","description":"Section information of the Mach-O file."},{"field":"file.macho.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"file.macho.sections.name","type":"keyword","normalization":"","example":"","description":"Mach-O Section List name."},{"field":"file.macho.sections.physical_size","type":"long","normalization":"","example":"","description":"Mach-O Section List physical size."},{"field":"file.macho.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"file.macho.sections.virtual_size","type":"long","normalization":"","example":"","description":"Mach-O Section List virtual size. This is always the same as `physical_size`."},{"field":"file.macho.symhash","type":"keyword","normalization":"","example":"d3ccf195b62a9279c3c19af1080497ec","description":"A hash of the imports in a Mach-O file."},{"field":"file.mime_type","type":"keyword","normalization":"","example":"","description":"Media type of file, document, or arrangement of bytes."},{"field":"file.mode","type":"keyword","normalization":"","example":"0640","description":"Mode of the file in octal representation."},{"field":"file.mtime","type":"date","normalization":"","example":"","description":"Last time the file content was modified."},{"field":"file.name","type":"keyword","normalization":"","example":"example.png","description":"Name of the file including the extension, without the directory."},{"field":"file.owner","type":"keyword","normalization":"","example":"alice","description":"File owner's username."},{"field":"file.path","type":"keyword","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"file.path.text","type":"match_only_text","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"file.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"file.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"file.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"file.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"file.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"file.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"file.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"file.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"file.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"file.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"file.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"file.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"file.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"file.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"file.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"file.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"file.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"file.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"file.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"file.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"file.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"file.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"file.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"file.size","type":"long","normalization":"","example":16384,"description":"File size in bytes."},{"field":"file.target_path","type":"keyword","normalization":"","example":"","description":"Target path for symlinks."},{"field":"file.target_path.text","type":"match_only_text","normalization":"","example":"","description":"Target path for symlinks."},{"field":"file.type","type":"keyword","normalization":"","example":"file","description":"File type (file, dir, or symlink)."},{"field":"file.uid","type":"keyword","normalization":"","example":1001,"description":"The user ID (UID) or security identifier (SID) of the file owner."},{"field":"file.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"file.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"file.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"file.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"file.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"file.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"file.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"file.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"file.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"file.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"file.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"file.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"file.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"file.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"file.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"file.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"file.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"file.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"file.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"file.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"file.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"file.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"file.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"file.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"host.boot.id","type":"keyword","normalization":"","example":"88a1f0ed-5ae5-41ee-af6b-41921c311872","description":"Linux boot uuid taken from /proc/sys/kernel/random/boot_id"},{"field":"host.cpu.usage","type":"scaled_float","normalization":"","example":"","description":"Percent CPU used, between 0 and 1."},{"field":"host.disk.read.bytes","type":"long","normalization":"","example":"","description":"The number of bytes read by all disks."},{"field":"host.disk.write.bytes","type":"long","normalization":"","example":"","description":"The number of bytes written on all disks."},{"field":"host.domain","type":"keyword","normalization":"","example":"CONTOSO","description":"Name of the directory the group is a member of."},{"field":"host.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"host.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"host.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"host.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"host.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"host.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"host.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"host.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"host.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"host.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"host.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"host.name","type":"keyword","normalization":"","example":"","description":"Name of the host."},{"field":"host.network.egress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes sent on all network interfaces."},{"field":"host.network.egress.packets","type":"long","normalization":"","example":"","description":"The number of packets sent on all network interfaces."},{"field":"host.network.ingress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes received on all network interfaces."},{"field":"host.network.ingress.packets","type":"long","normalization":"","example":"","description":"The number of packets received on all network interfaces."},{"field":"host.os.full","type":"keyword","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"host.os.full.text","type":"match_only_text","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"host.os.name.text","type":"match_only_text","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"host.os.platform","type":"keyword","normalization":"","example":"darwin","description":"Operating system platform (such centos, ubuntu, windows)."},{"field":"host.pid_ns_ino","type":"keyword","normalization":"","example":256383,"description":"Pid namespace inode"},{"field":"host.risk.calculated_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"host.risk.calculated_score","type":"float","normalization":"","example":880.73,"description":"A risk classification score calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"host.risk.calculated_score_norm","type":"float","normalization":"","example":88.73,"description":"A normalized risk score calculated by an internal system."},{"field":"host.risk.static_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"host.risk.static_score","type":"float","normalization":"","example":830,"description":"A risk classification score obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"host.risk.static_score_norm","type":"float","normalization":"","example":83,"description":"A normalized risk score calculated by an external system."},{"field":"host.type","type":"keyword","normalization":"","example":"","description":"Type of host."},{"field":"host.uptime","type":"long","normalization":"","example":1325,"description":"Seconds the host has been up."},{"field":"http.request.body.bytes","type":"long","normalization":"","example":887,"description":"Size in bytes of the request body."},{"field":"http.request.body.content","type":"wildcard","normalization":"","example":"Hello world","description":"The full HTTP request body."},{"field":"http.request.body.content.text","type":"match_only_text","normalization":"","example":"Hello world","description":"The full HTTP request body."},{"field":"http.request.bytes","type":"long","normalization":"","example":1437,"description":"Total size in bytes of the request (body and headers)."},{"field":"http.request.id","type":"keyword","normalization":"","example":"123e4567-e89b-12d3-a456-426614174000","description":"HTTP request ID."},{"field":"http.request.method","type":"keyword","normalization":"","example":"POST","description":"HTTP request method."},{"field":"http.request.mime_type","type":"keyword","normalization":"","example":"image/gif","description":"Mime type of the body of the request."},{"field":"http.request.referrer","type":"keyword","normalization":"","example":"https://blog.example.com/","description":"Referrer for this HTTP request."},{"field":"http.response.body.bytes","type":"long","normalization":"","example":887,"description":"Size in bytes of the response body."},{"field":"http.response.body.content","type":"wildcard","normalization":"","example":"Hello world","description":"The full HTTP response body."},{"field":"http.response.body.content.text","type":"match_only_text","normalization":"","example":"Hello world","description":"The full HTTP response body."},{"field":"http.response.bytes","type":"long","normalization":"","example":1437,"description":"Total size in bytes of the response (body and headers)."},{"field":"http.response.mime_type","type":"keyword","normalization":"","example":"image/gif","description":"Mime type of the body of the response."},{"field":"http.response.status_code","type":"long","normalization":"","example":404,"description":"HTTP response status code."},{"field":"http.version","type":"keyword","normalization":"","example":1.1,"description":"HTTP version."},{"field":"log.file.path","type":"keyword","normalization":"","example":"/var/log/fun-times.log","description":"Full path to the log file this event came from."},{"field":"log.level","type":"keyword","normalization":"","example":"error","description":"Log level of the log event."},{"field":"log.logger","type":"keyword","normalization":"","example":"org.elasticsearch.bootstrap.Bootstrap","description":"Name of the logger."},{"field":"log.origin.file.line","type":"long","normalization":"","example":42,"description":"The line number of the file which originated the log event."},{"field":"log.origin.file.name","type":"keyword","normalization":"","example":"Bootstrap.java","description":"The code file which originated the log event."},{"field":"log.origin.function","type":"keyword","normalization":"","example":"init","description":"The function which originated the log event."},{"field":"log.syslog","type":"object","normalization":"","example":"","description":"Syslog metadata"},{"field":"log.syslog.appname","type":"keyword","normalization":"","example":"sshd","description":"The device or application that originated the Syslog message."},{"field":"log.syslog.facility.code","type":"long","normalization":"","example":23,"description":"Syslog numeric facility of the event."},{"field":"log.syslog.facility.name","type":"keyword","normalization":"","example":"local7","description":"Syslog text-based facility of the event."},{"field":"log.syslog.hostname","type":"keyword","normalization":"","example":"example-host","description":"The host that originated the Syslog message."},{"field":"log.syslog.msgid","type":"keyword","normalization":"","example":"ID47","description":"An identifier for the type of Syslog message."},{"field":"log.syslog.priority","type":"long","normalization":"","example":135,"description":"Syslog priority of the event."},{"field":"log.syslog.procid","type":"keyword","normalization":"","example":12345,"description":"The process name or ID that originated the Syslog message."},{"field":"log.syslog.severity.code","type":"long","normalization":"","example":3,"description":"Syslog numeric severity of the event."},{"field":"log.syslog.severity.name","type":"keyword","normalization":"","example":"Error","description":"Syslog text-based severity of the event."},{"field":"log.syslog.structured_data","type":"flattened","normalization":"","example":"","description":"Structured data expressed in RFC 5424 messages."},{"field":"log.syslog.version","type":"keyword","normalization":"","example":1,"description":"Syslog protocol version."},{"field":"network.application","type":"keyword","normalization":"","example":"aim","description":"Application level protocol name."},{"field":"network.bytes","type":"long","normalization":"","example":368,"description":"Total bytes transferred in both directions."},{"field":"network.community_id","type":"keyword","normalization":"","example":"1:hO+sN4H+MG5MY/8hIrXPqc4ZQz0=","description":"A hash of source and destination IPs and ports."},{"field":"network.direction","type":"keyword","normalization":"","example":"inbound","description":"Direction of the network traffic."},{"field":"network.forwarded_ip","type":"ip","normalization":"","example":"192.1.1.2","description":"Host IP address when the source IP address is the proxy."},{"field":"network.iana_number","type":"keyword","normalization":"","example":6,"description":"IANA Protocol Number."},{"field":"network.inner","type":"object","normalization":"","example":"","description":"Inner VLAN tag information"},{"field":"network.inner.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"network.inner.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"network.name","type":"keyword","normalization":"","example":"Guest Wifi","description":"Name given by operators to sections of their network."},{"field":"network.packets","type":"long","normalization":"","example":24,"description":"Total packets transferred in both directions."},{"field":"network.protocol","type":"keyword","normalization":"","example":"http","description":"Application protocol name."},{"field":"network.transport","type":"keyword","normalization":"","example":"tcp","description":"Protocol Name corresponding to the field `iana_number`."},{"field":"network.type","type":"keyword","normalization":"","example":"ipv4","description":"In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc"},{"field":"network.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"network.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"observer.egress","type":"object","normalization":"","example":"","description":"Object field for egress information"},{"field":"observer.egress.interface.alias","type":"keyword","normalization":"","example":"outside","description":"Interface alias"},{"field":"observer.egress.interface.id","type":"keyword","normalization":"","example":10,"description":"Interface ID"},{"field":"observer.egress.interface.name","type":"keyword","normalization":"","example":"eth0","description":"Interface name"},{"field":"observer.egress.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"observer.egress.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"observer.egress.zone","type":"keyword","normalization":"","example":"Public_Internet","description":"Observer Egress zone"},{"field":"observer.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"observer.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"observer.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"observer.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"observer.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"observer.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"observer.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"observer.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"observer.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"observer.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"observer.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"observer.hostname","type":"keyword","normalization":"","example":"","description":"Hostname of the observer."},{"field":"observer.ingress","type":"object","normalization":"","example":"","description":"Object field for ingress information"},{"field":"observer.ingress.interface.alias","type":"keyword","normalization":"","example":"outside","description":"Interface alias"},{"field":"observer.ingress.interface.id","type":"keyword","normalization":"","example":10,"description":"Interface ID"},{"field":"observer.ingress.interface.name","type":"keyword","normalization":"","example":"eth0","description":"Interface name"},{"field":"observer.ingress.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"observer.ingress.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"observer.ingress.zone","type":"keyword","normalization":"","example":"DMZ","description":"Observer ingress zone"},{"field":"observer.ip","type":"ip","normalization":"array","example":"","description":"IP addresses of the observer."},{"field":"observer.mac","type":"keyword","normalization":"array","example":["00-00-5E-00-53-23","00-00-5E-00-53-24"],"description":"MAC addresses of the observer."},{"field":"observer.name","type":"keyword","normalization":"","example":"1_proxySG","description":"Custom name of the observer."},{"field":"observer.os.family","type":"keyword","normalization":"","example":"debian","description":"OS family (such as redhat, debian, freebsd, windows)."},{"field":"observer.os.full","type":"keyword","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"observer.os.full.text","type":"match_only_text","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"observer.os.kernel","type":"keyword","normalization":"","example":"4.4.0-112-generic","description":"Operating system kernel version as a raw string."},{"field":"observer.os.name","type":"keyword","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"observer.os.name.text","type":"match_only_text","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"observer.os.platform","type":"keyword","normalization":"","example":"darwin","description":"Operating system platform (such centos, ubuntu, windows)."},{"field":"observer.os.type","type":"keyword","normalization":"","example":"macos","description":"Which commercial OS family (one of: linux, macos, unix, windows, ios or android)."},{"field":"observer.os.version","type":"keyword","normalization":"","example":"10.14.1","description":"Operating system version as a raw string."},{"field":"observer.product","type":"keyword","normalization":"","example":"s200","description":"The product name of the observer."},{"field":"observer.serial_number","type":"keyword","normalization":"","example":"","description":"Observer serial number."},{"field":"observer.type","type":"keyword","normalization":"","example":"firewall","description":"The type of the observer the data is coming from."},{"field":"observer.vendor","type":"keyword","normalization":"","example":"Symantec","description":"Vendor name of the observer."},{"field":"observer.version","type":"keyword","normalization":"","example":"","description":"Observer version."},{"field":"orchestrator.api_version","type":"keyword","normalization":"","example":"v1beta1","description":"API version being used to carry out the action"},{"field":"orchestrator.cluster.id","type":"keyword","normalization":"","example":"","description":"Unique ID of the cluster."},{"field":"orchestrator.cluster.name","type":"keyword","normalization":"","example":"","description":"Name of the cluster."},{"field":"orchestrator.cluster.url","type":"keyword","normalization":"","example":"","description":"URL of the API used to manage the cluster."},{"field":"orchestrator.cluster.version","type":"keyword","normalization":"","example":"","description":"The version of the cluster."},{"field":"orchestrator.namespace","type":"keyword","normalization":"","example":"kube-system","description":"Namespace in which the action is taking place."},{"field":"orchestrator.organization","type":"keyword","normalization":"","example":"elastic","description":"Organization affected by the event (for multi-tenant orchestrator setups)."},{"field":"orchestrator.resource.annotation","type":"keyword","normalization":"array","example":"['key1:value1', 'key2:value2', 'key3:value3']","description":"The list of annotations added to the resource."},{"field":"orchestrator.resource.id","type":"keyword","normalization":"","example":"","description":"Unique ID of the resource being acted upon."},{"field":"orchestrator.resource.ip","type":"ip","normalization":"array","example":"","description":"IP address assigned to the resource associated with the event being observed."},{"field":"orchestrator.resource.label","type":"keyword","normalization":"array","example":"['key1:value1', 'key2:value2', 'key3:value3']","description":"The list of labels added to the resource."},{"field":"orchestrator.resource.name","type":"keyword","normalization":"","example":"test-pod-cdcws","description":"Name of the resource being acted upon."},{"field":"orchestrator.resource.parent.type","type":"keyword","normalization":"","example":"DaemonSet","description":"Type or kind of the parent resource associated with the event being observed."},{"field":"orchestrator.resource.type","type":"keyword","normalization":"","example":"service","description":"Type of resource being acted upon."},{"field":"orchestrator.type","type":"keyword","normalization":"","example":"kubernetes","description":"Orchestrator cluster type (e.g. kubernetes, nomad or cloudfoundry)."},{"field":"organization.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the organization."},{"field":"organization.name","type":"keyword","normalization":"","example":"","description":"Organization name."},{"field":"organization.name.text","type":"match_only_text","normalization":"","example":"","description":"Organization name."},{"field":"package.architecture","type":"keyword","normalization":"","example":"x86_64","description":"Package architecture."},{"field":"package.build_version","type":"keyword","normalization":"","example":"36f4f7e89dd61b0988b12ee000b98966867710cd","description":"Build version information"},{"field":"package.checksum","type":"keyword","normalization":"","example":"68b329da9893e34099c7d8ad5cb9c940","description":"Checksum of the installed package for verification."},{"field":"package.description","type":"keyword","normalization":"","example":"Open source programming language to build simple/reliable/efficient software.","description":"Description of the package."},{"field":"package.install_scope","type":"keyword","normalization":"","example":"global","description":"Indicating how the package was installed, e.g. user-local, global."},{"field":"package.installed","type":"date","normalization":"","example":"","description":"Time when package was installed."},{"field":"package.license","type":"keyword","normalization":"","example":"Apache License 2.0","description":"Package license"},{"field":"package.name","type":"keyword","normalization":"","example":"go","description":"Package name"},{"field":"package.path","type":"keyword","normalization":"","example":"/usr/local/Cellar/go/1.12.9/","description":"Path where the package is installed."},{"field":"package.reference","type":"keyword","normalization":"","example":"https://golang.org","description":"Package home page or reference URL"},{"field":"package.size","type":"long","normalization":"","example":62231,"description":"Package size in bytes."},{"field":"package.type","type":"keyword","normalization":"","example":"rpm","description":"Package type"},{"field":"package.version","type":"keyword","normalization":"","example":"1.12.9","description":"Package version"},{"field":"process.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"process.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"process.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"process.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"process.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"process.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"process.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"process.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"process.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"process.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"process.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"process.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"process.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"process.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"process.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"process.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"process.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"process.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"process.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"process.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"process.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"process.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"process.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"process.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"process.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"process.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"process.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"process.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"process.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"process.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"process.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"process.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"process.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"process.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"process.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"process.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"process.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"process.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"process.end","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process ended."},{"field":"process.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.entry_leader.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.entry_leader.attested_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.attested_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.attested_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.attested_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.entry_leader.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.entry_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.entry_meta.source.ip","type":"ip","normalization":"","example":"","description":"IP address of the source."},{"field":"process.entry_leader.entry_meta.type","type":"keyword","normalization":"","example":"","description":"The entry type for the entry session leader."},{"field":"process.entry_leader.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.entry_leader.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.entry_leader.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.entry_leader.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.entry_leader.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.entry_leader.parent.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.parent.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.entry_leader.parent.session_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.parent.session_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.entry_leader.parent.session_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.entry_leader.parent.session_leader.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.entry_leader.parent.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.entry_leader.parent.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.entry_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.entry_leader.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.same_as_process","type":"boolean","normalization":"","example":"True","description":"This boolean is used to identify if a leader process is the same as the top level process."},{"field":"process.entry_leader.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.entry_leader.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.entry_leader.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.entry_leader.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.entry_leader.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.entry_leader.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.entry_leader.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.env_vars","type":"keyword","normalization":"array","example":["PATH=/usr/local/bin:/usr/bin","USER=ubuntu"],"description":"Array of environment variable bindings."},{"field":"process.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.exit_code","type":"long","normalization":"","example":137,"description":"The exit code of the process."},{"field":"process.group_leader.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.group_leader.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.group_leader.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.group_leader.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.group_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.group_leader.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.group_leader.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.group_leader.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.group_leader.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.group_leader.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.group_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.group_leader.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.group_leader.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.same_as_process","type":"boolean","normalization":"","example":"True","description":"This boolean is used to identify if a leader process is the same as the top level process."},{"field":"process.group_leader.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.group_leader.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.group_leader.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.group_leader.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.group_leader.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.group_leader.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.group_leader.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.group_leader.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.group_leader.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"process.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"process.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"process.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"process.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"process.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"process.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"process.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.io","type":"object","normalization":"","example":"","description":"A chunk of input or output (IO) from a single process."},{"field":"process.io.bytes_skipped","type":"object","normalization":"array","example":"","description":"An array of byte offsets and lengths denoting where IO data has been skipped."},{"field":"process.io.bytes_skipped.length","type":"long","normalization":"","example":"","description":"The length of bytes skipped."},{"field":"process.io.bytes_skipped.offset","type":"long","normalization":"","example":"","description":"The byte offset into this event's io.text (or io.bytes in the future) where length bytes were skipped."},{"field":"process.io.max_bytes_per_process_exceeded","type":"boolean","normalization":"","example":"","description":"If true, the process producing the output has exceeded the max_kilobytes_per_process configuration setting."},{"field":"process.io.text","type":"wildcard","normalization":"","example":"","description":"A chunk of output or input sanitized to UTF-8."},{"field":"process.io.total_bytes_captured","type":"long","normalization":"","example":"","description":"The total number of bytes captured in this event."},{"field":"process.io.total_bytes_skipped","type":"long","normalization":"","example":"","description":"The total number of bytes that were not captured due to implementation restrictions such as buffer size limits."},{"field":"process.io.type","type":"keyword","normalization":"","example":"","description":"The type of object on which the IO action (read or write) was taken."},{"field":"process.macho.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a Mach-O file."},{"field":"process.macho.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.macho.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.macho.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.macho.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.macho.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a Mach-O file."},{"field":"process.macho.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.macho.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.macho.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.macho.sections","type":"nested","normalization":"array","example":"","description":"Section information of the Mach-O file."},{"field":"process.macho.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.macho.sections.name","type":"keyword","normalization":"","example":"","description":"Mach-O Section List name."},{"field":"process.macho.sections.physical_size","type":"long","normalization":"","example":"","description":"Mach-O Section List physical size."},{"field":"process.macho.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.macho.sections.virtual_size","type":"long","normalization":"","example":"","description":"Mach-O Section List virtual size. This is always the same as `physical_size`."},{"field":"process.macho.symhash","type":"keyword","normalization":"","example":"d3ccf195b62a9279c3c19af1080497ec","description":"A hash of the imports in a Mach-O file."},{"field":"process.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.parent.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.parent.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.parent.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"process.parent.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"process.parent.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"process.parent.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"process.parent.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"process.parent.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"process.parent.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"process.parent.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"process.parent.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"process.parent.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.parent.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.parent.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"process.parent.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"process.parent.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"process.parent.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"process.parent.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"process.parent.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"process.parent.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.parent.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.parent.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"process.parent.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"process.parent.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"process.parent.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"process.parent.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"process.parent.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"process.parent.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"process.parent.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"process.parent.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"process.parent.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.parent.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"process.parent.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"process.parent.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.parent.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"process.parent.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"process.parent.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"process.parent.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"process.parent.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"process.parent.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.parent.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"process.parent.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"process.parent.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"process.parent.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"process.parent.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"process.parent.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"process.parent.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"process.parent.end","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process ended."},{"field":"process.parent.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.parent.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.parent.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.parent.exit_code","type":"long","normalization":"","example":137,"description":"The exit code of the process."},{"field":"process.parent.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.group_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.parent.group_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.parent.group_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.parent.group_leader.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.parent.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"process.parent.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"process.parent.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"process.parent.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"process.parent.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"process.parent.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"process.parent.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"process.parent.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.parent.macho.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a Mach-O file."},{"field":"process.parent.macho.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.parent.macho.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.macho.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.macho.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.parent.macho.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a Mach-O file."},{"field":"process.parent.macho.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.parent.macho.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.macho.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.macho.sections","type":"nested","normalization":"array","example":"","description":"Section information of the Mach-O file."},{"field":"process.parent.macho.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.parent.macho.sections.name","type":"keyword","normalization":"","example":"","description":"Mach-O Section List name."},{"field":"process.parent.macho.sections.physical_size","type":"long","normalization":"","example":"","description":"Mach-O Section List physical size."},{"field":"process.parent.macho.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.parent.macho.sections.virtual_size","type":"long","normalization":"","example":"","description":"Mach-O Section List virtual size. This is always the same as `physical_size`."},{"field":"process.parent.macho.symhash","type":"keyword","normalization":"","example":"d3ccf195b62a9279c3c19af1080497ec","description":"A hash of the imports in a Mach-O file."},{"field":"process.parent.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.parent.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.parent.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"process.parent.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"process.parent.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"process.parent.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"process.parent.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"process.parent.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.parent.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.parent.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"process.parent.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"process.parent.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.parent.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"process.parent.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"process.parent.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"process.parent.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"process.parent.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.parent.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"process.parent.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"process.parent.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.parent.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"process.parent.pgid","type":"long","normalization":"","example":"","description":"Deprecated identifier of the group of processes the process belongs to."},{"field":"process.parent.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.parent.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.parent.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.parent.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.parent.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.thread.capabilities.effective","type":"keyword","normalization":"array","example":["CAP_BPF","CAP_SYS_ADMIN"],"description":"Array of capabilities used for permission checks."},{"field":"process.parent.thread.capabilities.permitted","type":"keyword","normalization":"array","example":["CAP_BPF","CAP_SYS_ADMIN"],"description":"Array of capabilities a thread could assume."},{"field":"process.parent.thread.id","type":"long","normalization":"","example":4242,"description":"Thread ID."},{"field":"process.parent.thread.name","type":"keyword","normalization":"","example":"thread-0","description":"Thread name."},{"field":"process.parent.title","type":"keyword","normalization":"","example":"","description":"Process title."},{"field":"process.parent.title.text","type":"match_only_text","normalization":"","example":"","description":"Process title."},{"field":"process.parent.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.parent.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.parent.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.parent.uptime","type":"long","normalization":"","example":1325,"description":"Seconds the process has been up."},{"field":"process.parent.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.parent.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.parent.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.parent.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"process.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"process.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"process.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"process.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"process.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"process.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"process.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"process.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"process.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"process.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"process.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"process.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"process.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"process.pgid","type":"long","normalization":"","example":"","description":"Deprecated identifier of the group of processes the process belongs to."},{"field":"process.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.previous.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.previous.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.previous.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.previous.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.session_leader.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.session_leader.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.session_leader.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.session_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.session_leader.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.session_leader.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.session_leader.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.session_leader.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.session_leader.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.session_leader.parent.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.session_leader.parent.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.session_leader.parent.session_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.session_leader.parent.session_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.session_leader.parent.session_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.session_leader.parent.session_leader.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.session_leader.parent.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.session_leader.parent.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.session_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.session_leader.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.session_leader.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.same_as_process","type":"boolean","normalization":"","example":"True","description":"This boolean is used to identify if a leader process is the same as the top level process."},{"field":"process.session_leader.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.session_leader.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.session_leader.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.session_leader.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.session_leader.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.session_leader.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.session_leader.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.session_leader.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.session_leader.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.thread.capabilities.effective","type":"keyword","normalization":"array","example":["CAP_BPF","CAP_SYS_ADMIN"],"description":"Array of capabilities used for permission checks."},{"field":"process.thread.capabilities.permitted","type":"keyword","normalization":"array","example":["CAP_BPF","CAP_SYS_ADMIN"],"description":"Array of capabilities a thread could assume."},{"field":"process.thread.id","type":"long","normalization":"","example":4242,"description":"Thread ID."},{"field":"process.thread.name","type":"keyword","normalization":"","example":"thread-0","description":"Thread name."},{"field":"process.title","type":"keyword","normalization":"","example":"","description":"Process title."},{"field":"process.title.text","type":"match_only_text","normalization":"","example":"","description":"Process title."},{"field":"process.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.tty.columns","type":"long","normalization":"","example":80,"description":"The number of character columns per line. e.g terminal width"},{"field":"process.tty.rows","type":"long","normalization":"","example":24,"description":"The number of character rows in the terminal. e.g terminal height"},{"field":"process.uptime","type":"long","normalization":"","example":1325,"description":"Seconds the process has been up."},{"field":"process.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.vpid","type":"long","normalization":"","example":4242,"description":"Virtual process id."},{"field":"process.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"registry.data.bytes","type":"keyword","normalization":"","example":"ZQBuAC0AVQBTAAAAZQBuAAAAAAA=","description":"Original bytes written with base64 encoding."},{"field":"registry.data.strings","type":"wildcard","normalization":"array","example":"[\"C:\\rta\\red_ttp\\bin\\myapp.exe\"]","description":"List of strings representing what was written to the registry."},{"field":"registry.data.type","type":"keyword","normalization":"","example":"REG_SZ","description":"Standard registry type for encoding contents"},{"field":"registry.hive","type":"keyword","normalization":"","example":"HKLM","description":"Abbreviated name for the hive."},{"field":"registry.key","type":"keyword","normalization":"","example":"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe","description":"Hive-relative path of keys."},{"field":"registry.path","type":"keyword","normalization":"","example":"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe\\Debugger","description":"Full path, including hive, key and value"},{"field":"registry.value","type":"keyword","normalization":"","example":"Debugger","description":"Name of the value written."},{"field":"related.hash","type":"keyword","normalization":"array","example":"","description":"All the hashes seen on your event."},{"field":"related.hosts","type":"keyword","normalization":"array","example":"","description":"All the host identifiers seen on your event."},{"field":"related.ip","type":"ip","normalization":"array","example":"","description":"All of the IPs seen on your event."},{"field":"related.user","type":"keyword","normalization":"array","example":"","description":"All the user names or other user identifiers seen on the event."},{"field":"rule.author","type":"keyword","normalization":"array","example":["Star-Lord"],"description":"Rule author"},{"field":"rule.category","type":"keyword","normalization":"","example":"Attempted Information Leak","description":"Rule category"},{"field":"rule.description","type":"keyword","normalization":"","example":"Block requests to public DNS over HTTPS / TLS protocols","description":"Rule description"},{"field":"rule.id","type":"keyword","normalization":"","example":101,"description":"Rule ID"},{"field":"rule.license","type":"keyword","normalization":"","example":"Apache 2.0","description":"Rule license"},{"field":"rule.name","type":"keyword","normalization":"","example":"BLOCK_DNS_over_TLS","description":"Rule name"},{"field":"rule.reference","type":"keyword","normalization":"","example":"https://en.wikipedia.org/wiki/DNS_over_TLS","description":"Rule reference URL"},{"field":"rule.ruleset","type":"keyword","normalization":"","example":"Standard_Protocol_Filters","description":"Rule ruleset"},{"field":"rule.uuid","type":"keyword","normalization":"","example":1100110011,"description":"Rule UUID"},{"field":"rule.version","type":"keyword","normalization":"","example":1.1,"description":"Rule version"},{"field":"server.address","type":"keyword","normalization":"","example":"","description":"Server network address."},{"field":"server.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"server.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"server.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"server.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the server to the client."},{"field":"server.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the server."},{"field":"server.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"server.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"server.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"server.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"server.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"server.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"server.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"server.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"server.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"server.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"server.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"server.ip","type":"ip","normalization":"","example":"","description":"IP address of the server."},{"field":"server.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the server."},{"field":"server.nat.ip","type":"ip","normalization":"","example":"","description":"Server NAT ip"},{"field":"server.nat.port","type":"long","normalization":"","example":"","description":"Server NAT port"},{"field":"server.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the server to the client."},{"field":"server.port","type":"long","normalization":"","example":"","description":"Port of the server."},{"field":"server.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered server domain, stripped of the subdomain."},{"field":"server.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"server.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"server.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"server.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"server.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"server.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"server.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"server.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"server.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"server.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"server.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"server.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"server.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"server.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"service.address","type":"keyword","normalization":"","example":"172.26.0.2:5432","description":"Address of this service."},{"field":"service.environment","type":"keyword","normalization":"","example":"production","description":"Environment of the service."},{"field":"service.ephemeral_id","type":"keyword","normalization":"","example":"8a4f500f","description":"Ephemeral identifier of this service."},{"field":"service.id","type":"keyword","normalization":"","example":"d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6","description":"Unique identifier of the running service."},{"field":"service.name","type":"keyword","normalization":"","example":"elasticsearch-metrics","description":"Name of the service."},{"field":"service.node.name","type":"keyword","normalization":"","example":"instance-0000000016","description":"Name of the service node."},{"field":"service.node.role","type":"keyword","normalization":"","example":"background_tasks","description":"Deprecated role (singular) of the service node."},{"field":"service.node.roles","type":"keyword","normalization":"array","example":["ui","background_tasks"],"description":"Roles of the service node."},{"field":"service.origin.address","type":"keyword","normalization":"","example":"172.26.0.2:5432","description":"Address of this service."},{"field":"service.origin.environment","type":"keyword","normalization":"","example":"production","description":"Environment of the service."},{"field":"service.origin.ephemeral_id","type":"keyword","normalization":"","example":"8a4f500f","description":"Ephemeral identifier of this service."},{"field":"service.origin.id","type":"keyword","normalization":"","example":"d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6","description":"Unique identifier of the running service."},{"field":"service.origin.name","type":"keyword","normalization":"","example":"elasticsearch-metrics","description":"Name of the service."},{"field":"service.origin.node.name","type":"keyword","normalization":"","example":"instance-0000000016","description":"Name of the service node."},{"field":"service.origin.node.role","type":"keyword","normalization":"","example":"background_tasks","description":"Deprecated role (singular) of the service node."},{"field":"service.origin.node.roles","type":"keyword","normalization":"array","example":["ui","background_tasks"],"description":"Roles of the service node."},{"field":"service.origin.state","type":"keyword","normalization":"","example":"","description":"Current state of the service."},{"field":"service.origin.type","type":"keyword","normalization":"","example":"elasticsearch","description":"The type of the service."},{"field":"service.origin.version","type":"keyword","normalization":"","example":"3.2.4","description":"Version of the service."},{"field":"service.state","type":"keyword","normalization":"","example":"","description":"Current state of the service."},{"field":"service.target.address","type":"keyword","normalization":"","example":"172.26.0.2:5432","description":"Address of this service."},{"field":"service.target.environment","type":"keyword","normalization":"","example":"production","description":"Environment of the service."},{"field":"service.target.ephemeral_id","type":"keyword","normalization":"","example":"8a4f500f","description":"Ephemeral identifier of this service."},{"field":"service.target.id","type":"keyword","normalization":"","example":"d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6","description":"Unique identifier of the running service."},{"field":"service.target.name","type":"keyword","normalization":"","example":"elasticsearch-metrics","description":"Name of the service."},{"field":"service.target.node.name","type":"keyword","normalization":"","example":"instance-0000000016","description":"Name of the service node."},{"field":"service.target.node.role","type":"keyword","normalization":"","example":"background_tasks","description":"Deprecated role (singular) of the service node."},{"field":"service.target.node.roles","type":"keyword","normalization":"array","example":["ui","background_tasks"],"description":"Roles of the service node."},{"field":"service.target.state","type":"keyword","normalization":"","example":"","description":"Current state of the service."},{"field":"service.target.type","type":"keyword","normalization":"","example":"elasticsearch","description":"The type of the service."},{"field":"service.target.version","type":"keyword","normalization":"","example":"3.2.4","description":"Version of the service."},{"field":"service.type","type":"keyword","normalization":"","example":"elasticsearch","description":"The type of the service."},{"field":"service.version","type":"keyword","normalization":"","example":"3.2.4","description":"Version of the service."},{"field":"source.address","type":"keyword","normalization":"","example":"","description":"Source network address."},{"field":"source.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"source.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"source.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"source.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the source to the destination."},{"field":"source.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the source."},{"field":"source.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"source.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"source.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"source.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"source.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"source.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"source.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"source.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"source.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"source.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"source.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"source.ip","type":"ip","normalization":"","example":"","description":"IP address of the source."},{"field":"source.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the source."},{"field":"source.nat.ip","type":"ip","normalization":"","example":"","description":"Source NAT ip"},{"field":"source.nat.port","type":"long","normalization":"","example":"","description":"Source NAT port"},{"field":"source.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the source to the destination."},{"field":"source.port","type":"long","normalization":"","example":"","description":"Port of the source."},{"field":"source.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered source domain, stripped of the subdomain."},{"field":"source.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"source.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"source.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"source.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"source.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"source.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"source.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"source.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"source.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"source.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"source.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"source.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"source.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"source.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"span.id","type":"keyword","normalization":"","example":"3ff9a8981b7ccd5a","description":"Unique identifier of the span within the scope of its trace."},{"field":"threat.enrichments","type":"nested","normalization":"array","example":"","description":"List of objects containing indicators enriching the event."},{"field":"threat.enrichments.indicator","type":"object","normalization":"","example":"","description":"Object containing indicators enriching the event."},{"field":"threat.enrichments.indicator.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"threat.enrichments.indicator.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.enrichments.indicator.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.enrichments.indicator.confidence","type":"keyword","normalization":"","example":"Medium","description":"Indicator confidence rating"},{"field":"threat.enrichments.indicator.description","type":"keyword","normalization":"","example":"IP x.x.x.x was observed delivering the Angler EK.","description":"Indicator description"},{"field":"threat.enrichments.indicator.email.address","type":"keyword","normalization":"","example":"phish@example.com","description":"Indicator email address"},{"field":"threat.enrichments.indicator.file.accessed","type":"date","normalization":"","example":"","description":"Last time the file was accessed."},{"field":"threat.enrichments.indicator.file.attributes","type":"keyword","normalization":"array","example":["readonly","system"],"description":"Array of file attributes."},{"field":"threat.enrichments.indicator.file.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"threat.enrichments.indicator.file.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"threat.enrichments.indicator.file.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"threat.enrichments.indicator.file.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"threat.enrichments.indicator.file.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"threat.enrichments.indicator.file.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"threat.enrichments.indicator.file.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"threat.enrichments.indicator.file.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"threat.enrichments.indicator.file.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"threat.enrichments.indicator.file.created","type":"date","normalization":"","example":"","description":"File creation time."},{"field":"threat.enrichments.indicator.file.ctime","type":"date","normalization":"","example":"","description":"Last time the file attributes or metadata changed."},{"field":"threat.enrichments.indicator.file.device","type":"keyword","normalization":"","example":"sda","description":"Device that is the source of the file."},{"field":"threat.enrichments.indicator.file.directory","type":"keyword","normalization":"","example":"/home/alice","description":"Directory where the file is located."},{"field":"threat.enrichments.indicator.file.drive_letter","type":"keyword","normalization":"","example":"C","description":"Drive letter where the file is located."},{"field":"threat.enrichments.indicator.file.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"threat.enrichments.indicator.file.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"threat.enrichments.indicator.file.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"threat.enrichments.indicator.file.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"threat.enrichments.indicator.file.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.enrichments.indicator.file.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.enrichments.indicator.file.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"threat.enrichments.indicator.file.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"threat.enrichments.indicator.file.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"threat.enrichments.indicator.file.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"threat.enrichments.indicator.file.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"threat.enrichments.indicator.file.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"threat.enrichments.indicator.file.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.enrichments.indicator.file.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"threat.enrichments.indicator.file.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"threat.enrichments.indicator.file.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"threat.enrichments.indicator.file.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"threat.enrichments.indicator.file.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"threat.enrichments.indicator.file.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"threat.enrichments.indicator.file.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"threat.enrichments.indicator.file.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"threat.enrichments.indicator.file.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"threat.enrichments.indicator.file.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"threat.enrichments.indicator.file.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"threat.enrichments.indicator.file.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"threat.enrichments.indicator.file.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"threat.enrichments.indicator.file.extension","type":"keyword","normalization":"","example":"png","description":"File extension, excluding the leading dot."},{"field":"threat.enrichments.indicator.file.fork_name","type":"keyword","normalization":"","example":"Zone.Identifer","description":"A fork is additional data associated with a filesystem object."},{"field":"threat.enrichments.indicator.file.gid","type":"keyword","normalization":"","example":1001,"description":"Primary group ID (GID) of the file."},{"field":"threat.enrichments.indicator.file.group","type":"keyword","normalization":"","example":"alice","description":"Primary group name of the file."},{"field":"threat.enrichments.indicator.file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"threat.enrichments.indicator.file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"threat.enrichments.indicator.file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"threat.enrichments.indicator.file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"threat.enrichments.indicator.file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"threat.enrichments.indicator.file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"threat.enrichments.indicator.file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"threat.enrichments.indicator.file.inode","type":"keyword","normalization":"","example":256383,"description":"Inode representing the file in the filesystem."},{"field":"threat.enrichments.indicator.file.mime_type","type":"keyword","normalization":"","example":"","description":"Media type of file, document, or arrangement of bytes."},{"field":"threat.enrichments.indicator.file.mode","type":"keyword","normalization":"","example":"0640","description":"Mode of the file in octal representation."},{"field":"threat.enrichments.indicator.file.mtime","type":"date","normalization":"","example":"","description":"Last time the file content was modified."},{"field":"threat.enrichments.indicator.file.name","type":"keyword","normalization":"","example":"example.png","description":"Name of the file including the extension, without the directory."},{"field":"threat.enrichments.indicator.file.owner","type":"keyword","normalization":"","example":"alice","description":"File owner's username."},{"field":"threat.enrichments.indicator.file.path","type":"keyword","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.enrichments.indicator.file.path.text","type":"match_only_text","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.enrichments.indicator.file.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"threat.enrichments.indicator.file.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"threat.enrichments.indicator.file.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"threat.enrichments.indicator.file.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.enrichments.indicator.file.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.enrichments.indicator.file.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"threat.enrichments.indicator.file.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"threat.enrichments.indicator.file.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.enrichments.indicator.file.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"threat.enrichments.indicator.file.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"threat.enrichments.indicator.file.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"threat.enrichments.indicator.file.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"threat.enrichments.indicator.file.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"threat.enrichments.indicator.file.size","type":"long","normalization":"","example":16384,"description":"File size in bytes."},{"field":"threat.enrichments.indicator.file.target_path","type":"keyword","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.enrichments.indicator.file.target_path.text","type":"match_only_text","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.enrichments.indicator.file.type","type":"keyword","normalization":"","example":"file","description":"File type (file, dir, or symlink)."},{"field":"threat.enrichments.indicator.file.uid","type":"keyword","normalization":"","example":1001,"description":"The user ID (UID) or security identifier (SID) of the file owner."},{"field":"threat.enrichments.indicator.file.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.enrichments.indicator.file.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.enrichments.indicator.file.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.file.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.file.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.enrichments.indicator.file.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.enrichments.indicator.file.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.enrichments.indicator.file.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.enrichments.indicator.file.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.enrichments.indicator.file.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.enrichments.indicator.file.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.enrichments.indicator.file.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.enrichments.indicator.file.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.enrichments.indicator.file.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.enrichments.indicator.file.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.enrichments.indicator.file.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.file.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.enrichments.indicator.file.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.enrichments.indicator.file.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.file.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.enrichments.indicator.first_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was first reported."},{"field":"threat.enrichments.indicator.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"threat.enrichments.indicator.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"threat.enrichments.indicator.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"threat.enrichments.indicator.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"threat.enrichments.indicator.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"threat.enrichments.indicator.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"threat.enrichments.indicator.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"threat.enrichments.indicator.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"threat.enrichments.indicator.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"threat.enrichments.indicator.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"threat.enrichments.indicator.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"threat.enrichments.indicator.ip","type":"ip","normalization":"","example":"1.2.3.4","description":"Indicator IP address"},{"field":"threat.enrichments.indicator.last_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last reported."},{"field":"threat.enrichments.indicator.marking.tlp","type":"keyword","normalization":"","example":"CLEAR","description":"Indicator TLP marking"},{"field":"threat.enrichments.indicator.marking.tlp_version","type":"keyword","normalization":"","example":2,"description":"Indicator TLP version"},{"field":"threat.enrichments.indicator.modified_at","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last updated."},{"field":"threat.enrichments.indicator.name","type":"keyword","normalization":"","example":"5.2.75.227","description":"Indicator display name"},{"field":"threat.enrichments.indicator.port","type":"long","normalization":"","example":443,"description":"Indicator port"},{"field":"threat.enrichments.indicator.provider","type":"keyword","normalization":"","example":"lrz_urlhaus","description":"Indicator provider"},{"field":"threat.enrichments.indicator.reference","type":"keyword","normalization":"","example":"https://system.example.com/indicator/0001234","description":"Indicator reference URL"},{"field":"threat.enrichments.indicator.registry.data.bytes","type":"keyword","normalization":"","example":"ZQBuAC0AVQBTAAAAZQBuAAAAAAA=","description":"Original bytes written with base64 encoding."},{"field":"threat.enrichments.indicator.registry.data.strings","type":"wildcard","normalization":"array","example":"[\"C:\\rta\\red_ttp\\bin\\myapp.exe\"]","description":"List of strings representing what was written to the registry."},{"field":"threat.enrichments.indicator.registry.data.type","type":"keyword","normalization":"","example":"REG_SZ","description":"Standard registry type for encoding contents"},{"field":"threat.enrichments.indicator.registry.hive","type":"keyword","normalization":"","example":"HKLM","description":"Abbreviated name for the hive."},{"field":"threat.enrichments.indicator.registry.key","type":"keyword","normalization":"","example":"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe","description":"Hive-relative path of keys."},{"field":"threat.enrichments.indicator.registry.path","type":"keyword","normalization":"","example":"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe\\Debugger","description":"Full path, including hive, key and value"},{"field":"threat.enrichments.indicator.registry.value","type":"keyword","normalization":"","example":"Debugger","description":"Name of the value written."},{"field":"threat.enrichments.indicator.scanner_stats","type":"long","normalization":"","example":4,"description":"Scanner statistics"},{"field":"threat.enrichments.indicator.sightings","type":"long","normalization":"","example":20,"description":"Number of times indicator observed"},{"field":"threat.enrichments.indicator.type","type":"keyword","normalization":"","example":"ipv4-addr","description":"Type of indicator"},{"field":"threat.enrichments.indicator.url.domain","type":"keyword","normalization":"","example":"www.elastic.co","description":"Domain of the url."},{"field":"threat.enrichments.indicator.url.extension","type":"keyword","normalization":"","example":"png","description":"File extension from the request url, excluding the leading dot."},{"field":"threat.enrichments.indicator.url.fragment","type":"keyword","normalization":"","example":"","description":"Portion of the url after the `#`."},{"field":"threat.enrichments.indicator.url.full","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.enrichments.indicator.url.full.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.enrichments.indicator.url.original","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.enrichments.indicator.url.original.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.enrichments.indicator.url.password","type":"keyword","normalization":"","example":"","description":"Password of the request."},{"field":"threat.enrichments.indicator.url.path","type":"wildcard","normalization":"","example":"","description":"Path of the request, such as \"/search\"."},{"field":"threat.enrichments.indicator.url.port","type":"long","normalization":"","example":443,"description":"Port of the request, such as 443."},{"field":"threat.enrichments.indicator.url.query","type":"keyword","normalization":"","example":"","description":"Query string of the request."},{"field":"threat.enrichments.indicator.url.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered url domain, stripped of the subdomain."},{"field":"threat.enrichments.indicator.url.scheme","type":"keyword","normalization":"","example":"https","description":"Scheme of the url."},{"field":"threat.enrichments.indicator.url.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"threat.enrichments.indicator.url.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"threat.enrichments.indicator.url.username","type":"keyword","normalization":"","example":"","description":"Username of the request."},{"field":"threat.enrichments.indicator.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.enrichments.indicator.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.enrichments.indicator.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.enrichments.indicator.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.enrichments.indicator.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.enrichments.indicator.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.enrichments.indicator.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.enrichments.indicator.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.enrichments.indicator.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.enrichments.indicator.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.enrichments.indicator.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.enrichments.indicator.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.enrichments.indicator.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.enrichments.indicator.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.enrichments.indicator.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.enrichments.indicator.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.enrichments.matched.atomic","type":"keyword","normalization":"","example":"bad-domain.com","description":"Matched indicator value"},{"field":"threat.enrichments.matched.field","type":"keyword","normalization":"","example":"file.hash.sha256","description":"Matched indicator field"},{"field":"threat.enrichments.matched.id","type":"keyword","normalization":"","example":"ff93aee5-86a1-4a61-b0e6-0cdc313d01b5","description":"Matched indicator identifier"},{"field":"threat.enrichments.matched.index","type":"keyword","normalization":"","example":"filebeat-8.0.0-2021.05.23-000011","description":"Matched indicator index"},{"field":"threat.enrichments.matched.occurred","type":"date","normalization":"","example":"2021-10-05T17:00:58.326Z","description":"Date of match"},{"field":"threat.enrichments.matched.type","type":"keyword","normalization":"","example":"indicator_match_rule","description":"Type of indicator match"},{"field":"threat.feed.dashboard_id","type":"keyword","normalization":"","example":"5ba16340-72e6-11eb-a3e3-b3cc7c78a70f","description":"Feed dashboard ID."},{"field":"threat.feed.description","type":"keyword","normalization":"","example":"Threat feed from the AlienVault Open Threat eXchange network.","description":"Description of the threat feed."},{"field":"threat.feed.name","type":"keyword","normalization":"","example":"AlienVault OTX","description":"Name of the threat feed."},{"field":"threat.feed.reference","type":"keyword","normalization":"","example":"https://otx.alienvault.com","description":"Reference for the threat feed."},{"field":"threat.framework","type":"keyword","normalization":"","example":"MITRE ATT&CK","description":"Threat classification framework."},{"field":"threat.group.alias","type":"keyword","normalization":"array","example":["Magecart Group 6"],"description":"Alias of the group."},{"field":"threat.group.id","type":"keyword","normalization":"","example":"G0037","description":"ID of the group."},{"field":"threat.group.name","type":"keyword","normalization":"","example":"FIN6","description":"Name of the group."},{"field":"threat.group.reference","type":"keyword","normalization":"","example":"https://attack.mitre.org/groups/G0037/","description":"Reference URL of the group."},{"field":"threat.indicator.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"threat.indicator.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.indicator.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.indicator.confidence","type":"keyword","normalization":"","example":"Medium","description":"Indicator confidence rating"},{"field":"threat.indicator.description","type":"keyword","normalization":"","example":"IP x.x.x.x was observed delivering the Angler EK.","description":"Indicator description"},{"field":"threat.indicator.email.address","type":"keyword","normalization":"","example":"phish@example.com","description":"Indicator email address"},{"field":"threat.indicator.file.accessed","type":"date","normalization":"","example":"","description":"Last time the file was accessed."},{"field":"threat.indicator.file.attributes","type":"keyword","normalization":"array","example":["readonly","system"],"description":"Array of file attributes."},{"field":"threat.indicator.file.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"threat.indicator.file.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"threat.indicator.file.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"threat.indicator.file.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"threat.indicator.file.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"threat.indicator.file.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"threat.indicator.file.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"threat.indicator.file.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"threat.indicator.file.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"threat.indicator.file.created","type":"date","normalization":"","example":"","description":"File creation time."},{"field":"threat.indicator.file.ctime","type":"date","normalization":"","example":"","description":"Last time the file attributes or metadata changed."},{"field":"threat.indicator.file.device","type":"keyword","normalization":"","example":"sda","description":"Device that is the source of the file."},{"field":"threat.indicator.file.directory","type":"keyword","normalization":"","example":"/home/alice","description":"Directory where the file is located."},{"field":"threat.indicator.file.drive_letter","type":"keyword","normalization":"","example":"C","description":"Drive letter where the file is located."},{"field":"threat.indicator.file.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"threat.indicator.file.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"threat.indicator.file.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"threat.indicator.file.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"threat.indicator.file.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"threat.indicator.file.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"threat.indicator.file.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.indicator.file.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.indicator.file.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"threat.indicator.file.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"threat.indicator.file.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"threat.indicator.file.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"threat.indicator.file.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"threat.indicator.file.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"threat.indicator.file.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"threat.indicator.file.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"threat.indicator.file.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"threat.indicator.file.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.indicator.file.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"threat.indicator.file.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"threat.indicator.file.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.indicator.file.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"threat.indicator.file.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"threat.indicator.file.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"threat.indicator.file.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"threat.indicator.file.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"threat.indicator.file.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.indicator.file.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"threat.indicator.file.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"threat.indicator.file.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"threat.indicator.file.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"threat.indicator.file.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"threat.indicator.file.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"threat.indicator.file.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"threat.indicator.file.extension","type":"keyword","normalization":"","example":"png","description":"File extension, excluding the leading dot."},{"field":"threat.indicator.file.fork_name","type":"keyword","normalization":"","example":"Zone.Identifer","description":"A fork is additional data associated with a filesystem object."},{"field":"threat.indicator.file.gid","type":"keyword","normalization":"","example":1001,"description":"Primary group ID (GID) of the file."},{"field":"threat.indicator.file.group","type":"keyword","normalization":"","example":"alice","description":"Primary group name of the file."},{"field":"threat.indicator.file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"threat.indicator.file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"threat.indicator.file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"threat.indicator.file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"threat.indicator.file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"threat.indicator.file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"threat.indicator.file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"threat.indicator.file.inode","type":"keyword","normalization":"","example":256383,"description":"Inode representing the file in the filesystem."},{"field":"threat.indicator.file.mime_type","type":"keyword","normalization":"","example":"","description":"Media type of file, document, or arrangement of bytes."},{"field":"threat.indicator.file.mode","type":"keyword","normalization":"","example":"0640","description":"Mode of the file in octal representation."},{"field":"threat.indicator.file.mtime","type":"date","normalization":"","example":"","description":"Last time the file content was modified."},{"field":"threat.indicator.file.name","type":"keyword","normalization":"","example":"example.png","description":"Name of the file including the extension, without the directory."},{"field":"threat.indicator.file.owner","type":"keyword","normalization":"","example":"alice","description":"File owner's username."},{"field":"threat.indicator.file.path","type":"keyword","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.indicator.file.path.text","type":"match_only_text","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.indicator.file.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"threat.indicator.file.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"threat.indicator.file.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"threat.indicator.file.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.indicator.file.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.indicator.file.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"threat.indicator.file.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"threat.indicator.file.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.indicator.file.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"threat.indicator.file.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"threat.indicator.file.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.indicator.file.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"threat.indicator.file.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"threat.indicator.file.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.indicator.file.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"threat.indicator.file.size","type":"long","normalization":"","example":16384,"description":"File size in bytes."},{"field":"threat.indicator.file.target_path","type":"keyword","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.indicator.file.target_path.text","type":"match_only_text","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.indicator.file.type","type":"keyword","normalization":"","example":"file","description":"File type (file, dir, or symlink)."},{"field":"threat.indicator.file.uid","type":"keyword","normalization":"","example":1001,"description":"The user ID (UID) or security identifier (SID) of the file owner."},{"field":"threat.indicator.file.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.indicator.file.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.indicator.file.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.indicator.file.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.file.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.indicator.file.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.indicator.file.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.indicator.file.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.indicator.file.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.indicator.file.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.indicator.file.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.indicator.file.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.indicator.file.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.indicator.file.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.indicator.file.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.indicator.file.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.indicator.file.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.indicator.file.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.indicator.file.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.file.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.indicator.first_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was first reported."},{"field":"threat.indicator.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"threat.indicator.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"threat.indicator.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"threat.indicator.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"threat.indicator.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"threat.indicator.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"threat.indicator.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"threat.indicator.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"threat.indicator.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"threat.indicator.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"threat.indicator.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"threat.indicator.ip","type":"ip","normalization":"","example":"1.2.3.4","description":"Indicator IP address"},{"field":"threat.indicator.last_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last reported."},{"field":"threat.indicator.marking.tlp","type":"keyword","normalization":"","example":"CLEAR","description":"Indicator TLP marking"},{"field":"threat.indicator.marking.tlp_version","type":"keyword","normalization":"","example":2,"description":"Indicator TLP version"},{"field":"threat.indicator.modified_at","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last updated."},{"field":"threat.indicator.name","type":"keyword","normalization":"","example":"5.2.75.227","description":"Indicator display name"},{"field":"threat.indicator.port","type":"long","normalization":"","example":443,"description":"Indicator port"},{"field":"threat.indicator.provider","type":"keyword","normalization":"","example":"lrz_urlhaus","description":"Indicator provider"},{"field":"threat.indicator.reference","type":"keyword","normalization":"","example":"https://system.example.com/indicator/0001234","description":"Indicator reference URL"},{"field":"threat.indicator.registry.data.bytes","type":"keyword","normalization":"","example":"ZQBuAC0AVQBTAAAAZQBuAAAAAAA=","description":"Original bytes written with base64 encoding."},{"field":"threat.indicator.registry.data.strings","type":"wildcard","normalization":"array","example":"[\"C:\\rta\\red_ttp\\bin\\myapp.exe\"]","description":"List of strings representing what was written to the registry."},{"field":"threat.indicator.registry.data.type","type":"keyword","normalization":"","example":"REG_SZ","description":"Standard registry type for encoding contents"},{"field":"threat.indicator.registry.hive","type":"keyword","normalization":"","example":"HKLM","description":"Abbreviated name for the hive."},{"field":"threat.indicator.registry.key","type":"keyword","normalization":"","example":"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe","description":"Hive-relative path of keys."},{"field":"threat.indicator.registry.path","type":"keyword","normalization":"","example":"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe\\Debugger","description":"Full path, including hive, key and value"},{"field":"threat.indicator.registry.value","type":"keyword","normalization":"","example":"Debugger","description":"Name of the value written."},{"field":"threat.indicator.scanner_stats","type":"long","normalization":"","example":4,"description":"Scanner statistics"},{"field":"threat.indicator.sightings","type":"long","normalization":"","example":20,"description":"Number of times indicator observed"},{"field":"threat.indicator.type","type":"keyword","normalization":"","example":"ipv4-addr","description":"Type of indicator"},{"field":"threat.indicator.url.domain","type":"keyword","normalization":"","example":"www.elastic.co","description":"Domain of the url."},{"field":"threat.indicator.url.extension","type":"keyword","normalization":"","example":"png","description":"File extension from the request url, excluding the leading dot."},{"field":"threat.indicator.url.fragment","type":"keyword","normalization":"","example":"","description":"Portion of the url after the `#`."},{"field":"threat.indicator.url.full","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.indicator.url.full.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.indicator.url.original","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.indicator.url.original.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.indicator.url.password","type":"keyword","normalization":"","example":"","description":"Password of the request."},{"field":"threat.indicator.url.path","type":"wildcard","normalization":"","example":"","description":"Path of the request, such as \"/search\"."},{"field":"threat.indicator.url.port","type":"long","normalization":"","example":443,"description":"Port of the request, such as 443."},{"field":"threat.indicator.url.query","type":"keyword","normalization":"","example":"","description":"Query string of the request."},{"field":"threat.indicator.url.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered url domain, stripped of the subdomain."},{"field":"threat.indicator.url.scheme","type":"keyword","normalization":"","example":"https","description":"Scheme of the url."},{"field":"threat.indicator.url.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"threat.indicator.url.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"threat.indicator.url.username","type":"keyword","normalization":"","example":"","description":"Username of the request."},{"field":"threat.indicator.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.indicator.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.indicator.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.indicator.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.indicator.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.indicator.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.indicator.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.indicator.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.indicator.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.indicator.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.indicator.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.indicator.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.indicator.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.indicator.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.indicator.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.indicator.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.indicator.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.indicator.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.software.alias","type":"keyword","normalization":"array","example":["X-Agent"],"description":"Alias of the software"},{"field":"threat.software.id","type":"keyword","normalization":"","example":"S0552","description":"ID of the software"},{"field":"threat.software.name","type":"keyword","normalization":"","example":"AdFind","description":"Name of the software."},{"field":"threat.software.platforms","type":"keyword","normalization":"array","example":["Windows"],"description":"Platforms of the software."},{"field":"threat.software.reference","type":"keyword","normalization":"","example":"https://attack.mitre.org/software/S0552/","description":"Software reference URL."},{"field":"threat.software.type","type":"keyword","normalization":"","example":"Tool","description":"Software type."},{"field":"threat.tactic.id","type":"keyword","normalization":"array","example":"TA0002","description":"Threat tactic id."},{"field":"threat.tactic.name","type":"keyword","normalization":"array","example":"Execution","description":"Threat tactic."},{"field":"threat.tactic.reference","type":"keyword","normalization":"array","example":"https://attack.mitre.org/tactics/TA0002/","description":"Threat tactic URL reference."},{"field":"threat.technique.id","type":"keyword","normalization":"array","example":"T1059","description":"Threat technique id."},{"field":"threat.technique.name","type":"keyword","normalization":"array","example":"Command and Scripting Interpreter","description":"Threat technique name."},{"field":"threat.technique.name.text","type":"match_only_text","normalization":"","example":"Command and Scripting Interpreter","description":"Threat technique name."},{"field":"threat.technique.reference","type":"keyword","normalization":"array","example":"https://attack.mitre.org/techniques/T1059/","description":"Threat technique URL reference."},{"field":"threat.technique.subtechnique.id","type":"keyword","normalization":"array","example":"T1059.001","description":"Threat subtechnique id."},{"field":"threat.technique.subtechnique.name","type":"keyword","normalization":"array","example":"PowerShell","description":"Threat subtechnique name."},{"field":"threat.technique.subtechnique.name.text","type":"match_only_text","normalization":"","example":"PowerShell","description":"Threat subtechnique name."},{"field":"threat.technique.subtechnique.reference","type":"keyword","normalization":"array","example":"https://attack.mitre.org/techniques/T1059/001/","description":"Threat subtechnique URL reference."},{"field":"tls.cipher","type":"keyword","normalization":"","example":"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256","description":"String indicating the cipher used during the current connection."},{"field":"tls.client.certificate","type":"keyword","normalization":"","example":"MII...","description":"PEM-encoded stand-alone certificate offered by the client."},{"field":"tls.client.certificate_chain","type":"keyword","normalization":"array","example":["MII...","MII..."],"description":"Array of PEM-encoded certificates that make up the certificate chain offered by the client."},{"field":"tls.client.hash.md5","type":"keyword","normalization":"","example":"0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC","description":"Certificate fingerprint using the MD5 digest of DER-encoded version of certificate offered by the client."},{"field":"tls.client.hash.sha1","type":"keyword","normalization":"","example":"9E393D93138888D288266C2D915214D1D1CCEB2A","description":"Certificate fingerprint using the SHA1 digest of DER-encoded version of certificate offered by the client."},{"field":"tls.client.hash.sha256","type":"keyword","normalization":"","example":"0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0","description":"Certificate fingerprint using the SHA256 digest of DER-encoded version of certificate offered by the client."},{"field":"tls.client.issuer","type":"keyword","normalization":"","example":"CN=Example Root CA, OU=Infrastructure Team, DC=example, DC=com","description":"Distinguished name of subject of the issuer of the x.509 certificate presented by the client."},{"field":"tls.client.ja3","type":"keyword","normalization":"","example":"d4e5b18d6b55c71272893221c96ba240","description":"A hash that identifies clients based on how they perform an SSL/TLS handshake."},{"field":"tls.client.not_after","type":"date","normalization":"","example":"2021-01-01T00:00:00.000Z","description":"Date/Time indicating when client certificate is no longer considered valid."},{"field":"tls.client.not_before","type":"date","normalization":"","example":"1970-01-01T00:00:00.000Z","description":"Date/Time indicating when client certificate is first considered valid."},{"field":"tls.client.server_name","type":"keyword","normalization":"","example":"www.elastic.co","description":"Hostname the client is trying to connect to. Also called the SNI."},{"field":"tls.client.subject","type":"keyword","normalization":"","example":"CN=myclient, OU=Documentation Team, DC=example, DC=com","description":"Distinguished name of subject of the x.509 certificate presented by the client."},{"field":"tls.client.supported_ciphers","type":"keyword","normalization":"array","example":["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","..."],"description":"Array of ciphers offered by the client during the client hello."},{"field":"tls.client.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"tls.client.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"tls.client.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"tls.client.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"tls.client.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"tls.client.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"tls.client.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"tls.client.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.client.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"tls.client.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"tls.client.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"tls.client.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"tls.client.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"tls.client.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"tls.client.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"tls.client.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"tls.client.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"tls.client.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"tls.client.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"tls.client.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"tls.client.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"tls.client.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"tls.client.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.client.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"tls.curve","type":"keyword","normalization":"","example":"secp256r1","description":"String indicating the curve used for the given cipher, when applicable."},{"field":"tls.established","type":"boolean","normalization":"","example":"","description":"Boolean flag indicating if the TLS negotiation was successful and transitioned to an encrypted tunnel."},{"field":"tls.next_protocol","type":"keyword","normalization":"","example":"http/1.1","description":"String indicating the protocol being tunneled."},{"field":"tls.resumed","type":"boolean","normalization":"","example":"","description":"Boolean flag indicating if this TLS connection was resumed from an existing TLS negotiation."},{"field":"tls.server.certificate","type":"keyword","normalization":"","example":"MII...","description":"PEM-encoded stand-alone certificate offered by the server."},{"field":"tls.server.certificate_chain","type":"keyword","normalization":"array","example":["MII...","MII..."],"description":"Array of PEM-encoded certificates that make up the certificate chain offered by the server."},{"field":"tls.server.hash.md5","type":"keyword","normalization":"","example":"0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC","description":"Certificate fingerprint using the MD5 digest of DER-encoded version of certificate offered by the server."},{"field":"tls.server.hash.sha1","type":"keyword","normalization":"","example":"9E393D93138888D288266C2D915214D1D1CCEB2A","description":"Certificate fingerprint using the SHA1 digest of DER-encoded version of certificate offered by the server."},{"field":"tls.server.hash.sha256","type":"keyword","normalization":"","example":"0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0","description":"Certificate fingerprint using the SHA256 digest of DER-encoded version of certificate offered by the server."},{"field":"tls.server.issuer","type":"keyword","normalization":"","example":"CN=Example Root CA, OU=Infrastructure Team, DC=example, DC=com","description":"Subject of the issuer of the x.509 certificate presented by the server."},{"field":"tls.server.ja3s","type":"keyword","normalization":"","example":"394441ab65754e2207b1e1b457b3641d","description":"A hash that identifies servers based on how they perform an SSL/TLS handshake."},{"field":"tls.server.not_after","type":"date","normalization":"","example":"2021-01-01T00:00:00.000Z","description":"Timestamp indicating when server certificate is no longer considered valid."},{"field":"tls.server.not_before","type":"date","normalization":"","example":"1970-01-01T00:00:00.000Z","description":"Timestamp indicating when server certificate is first considered valid."},{"field":"tls.server.subject","type":"keyword","normalization":"","example":"CN=www.example.com, OU=Infrastructure Team, DC=example, DC=com","description":"Subject of the x.509 certificate presented by the server."},{"field":"tls.server.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"tls.server.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"tls.server.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"tls.server.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"tls.server.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"tls.server.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"tls.server.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"tls.server.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.server.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"tls.server.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"tls.server.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"tls.server.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"tls.server.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"tls.server.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"tls.server.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"tls.server.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"tls.server.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"tls.server.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"tls.server.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"tls.server.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"tls.server.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"tls.server.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"tls.server.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.server.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"tls.version","type":"keyword","normalization":"","example":1.2,"description":"Numeric part of the version parsed from the original string."},{"field":"tls.version_protocol","type":"keyword","normalization":"","example":"tls","description":"Normalized lowercase protocol name parsed from original string."},{"field":"trace.id","type":"keyword","normalization":"","example":"4bf92f3577b34da6a3ce929d0e0e4736","description":"Unique identifier of the trace."},{"field":"transaction.id","type":"keyword","normalization":"","example":"00f067aa0ba902b7","description":"Unique identifier of the transaction within the scope of its trace."},{"field":"url.domain","type":"keyword","normalization":"","example":"www.elastic.co","description":"Domain of the url."},{"field":"url.extension","type":"keyword","normalization":"","example":"png","description":"File extension from the request url, excluding the leading dot."},{"field":"url.fragment","type":"keyword","normalization":"","example":"","description":"Portion of the url after the `#`."},{"field":"url.full","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"url.full.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"url.original","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"url.original.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"url.password","type":"keyword","normalization":"","example":"","description":"Password of the request."},{"field":"url.path","type":"wildcard","normalization":"","example":"","description":"Path of the request, such as \"/search\"."},{"field":"url.port","type":"long","normalization":"","example":443,"description":"Port of the request, such as 443."},{"field":"url.query","type":"keyword","normalization":"","example":"","description":"Query string of the request."},{"field":"url.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered url domain, stripped of the subdomain."},{"field":"url.scheme","type":"keyword","normalization":"","example":"https","description":"Scheme of the url."},{"field":"url.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"url.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"url.username","type":"keyword","normalization":"","example":"","description":"Username of the request."},{"field":"user.changes.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.changes.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.changes.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.changes.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.changes.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.changes.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.changes.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.changes.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.changes.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.changes.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.changes.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.changes.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.effective.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.effective.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.effective.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.effective.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.effective.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.effective.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.effective.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.effective.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.effective.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.effective.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.effective.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.effective.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.risk.calculated_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"user.risk.calculated_score","type":"float","normalization":"","example":880.73,"description":"A risk classification score calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"user.risk.calculated_score_norm","type":"float","normalization":"","example":88.73,"description":"A normalized risk score calculated by an internal system."},{"field":"user.risk.static_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"user.risk.static_score","type":"float","normalization":"","example":830,"description":"A risk classification score obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"user.risk.static_score_norm","type":"float","normalization":"","example":83,"description":"A normalized risk score calculated by an external system."},{"field":"user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user.target.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.target.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.target.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.target.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.target.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.target.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.target.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.target.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.target.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.target.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.target.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.target.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user_agent.device.name","type":"keyword","normalization":"","example":"iPhone","description":"Name of the device."},{"field":"user_agent.name","type":"keyword","normalization":"","example":"Safari","description":"Name of the user agent."},{"field":"user_agent.original","type":"keyword","normalization":"","example":"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1","description":"Unparsed user_agent string."},{"field":"user_agent.original.text","type":"match_only_text","normalization":"","example":"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1","description":"Unparsed user_agent string."},{"field":"user_agent.os.family","type":"keyword","normalization":"","example":"debian","description":"OS family (such as redhat, debian, freebsd, windows)."},{"field":"user_agent.os.full","type":"keyword","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"user_agent.os.full.text","type":"match_only_text","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"user_agent.os.kernel","type":"keyword","normalization":"","example":"4.4.0-112-generic","description":"Operating system kernel version as a raw string."},{"field":"user_agent.os.name","type":"keyword","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"user_agent.os.name.text","type":"match_only_text","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"user_agent.os.platform","type":"keyword","normalization":"","example":"darwin","description":"Operating system platform (such centos, ubuntu, windows)."},{"field":"user_agent.os.type","type":"keyword","normalization":"","example":"macos","description":"Which commercial OS family (one of: linux, macos, unix, windows, ios or android)."},{"field":"user_agent.os.version","type":"keyword","normalization":"","example":"10.14.1","description":"Operating system version as a raw string."},{"field":"user_agent.version","type":"keyword","normalization":"","example":12,"description":"Version of the user agent."},{"field":"vulnerability.category","type":"keyword","normalization":"array","example":["Firewall"],"description":"Category of a vulnerability."},{"field":"vulnerability.classification","type":"keyword","normalization":"","example":"CVSS","description":"Classification of the vulnerability."},{"field":"vulnerability.description","type":"keyword","normalization":"","example":"In macOS before 2.12.6, there is a vulnerability in the RPC...","description":"Description of the vulnerability."},{"field":"vulnerability.description.text","type":"match_only_text","normalization":"","example":"In macOS before 2.12.6, there is a vulnerability in the RPC...","description":"Description of the vulnerability."},{"field":"vulnerability.enumeration","type":"keyword","normalization":"","example":"CVE","description":"Identifier of the vulnerability."},{"field":"vulnerability.id","type":"keyword","normalization":"","example":"CVE-2019-00001","description":"ID of the vulnerability."},{"field":"vulnerability.reference","type":"keyword","normalization":"","example":"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-6111","description":"Reference of the vulnerability."},{"field":"vulnerability.report_id","type":"keyword","normalization":"","example":20191018.0001,"description":"Scan identification number."},{"field":"vulnerability.scanner.vendor","type":"keyword","normalization":"","example":"Tenable","description":"Name of the scanner vendor."},{"field":"vulnerability.score.base","type":"float","normalization":"","example":5.5,"description":"Vulnerability Base score."},{"field":"vulnerability.score.environmental","type":"float","normalization":"","example":5.5,"description":"Vulnerability Environmental score."},{"field":"vulnerability.score.temporal","type":"float","normalization":"","example":"","description":"Vulnerability Temporal score."},{"field":"vulnerability.score.version","type":"keyword","normalization":"","example":2,"description":"CVSS version."},{"field":"vulnerability.severity","type":"keyword","normalization":"","example":"Critical","description":"Severity of the vulnerability."}] diff --git a/x-pack/plugins/osquery/public/common/schemas/ecs/v8.7.0.json b/x-pack/plugins/osquery/public/common/schemas/ecs/v8.7.0.json deleted file mode 100644 index 0961ad25572a4..0000000000000 --- a/x-pack/plugins/osquery/public/common/schemas/ecs/v8.7.0.json +++ /dev/null @@ -1 +0,0 @@ -[{"field":"labels","type":"object","normalization":"","example":{"application":"foo-bar","env":"production"},"description":"Custom key/value pairs."},{"field":"message","type":"match_only_text","normalization":"","example":"Hello World","description":"Log message optimized for viewing in a log viewer."},{"field":"tags","type":"keyword","normalization":"array","example":["production","env2"],"description":"List of keywords used to tag each event."},{"field":"agent.build.original","type":"keyword","normalization":"","example":"metricbeat version 7.6.0 (amd64), libbeat 7.6.0 [6a23e8f8f30f5001ba344e4e54d8d9cb82cb107c built 2020-02-05 23:10:10 +0000 UTC]","description":"Extended build information for the agent."},{"field":"client.address","type":"keyword","normalization":"","example":"","description":"Client network address."},{"field":"client.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"client.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"client.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"client.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the client to the server."},{"field":"client.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the client."},{"field":"client.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"client.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"client.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"client.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"client.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"client.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"client.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"client.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"client.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"client.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"client.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"client.ip","type":"ip","normalization":"","example":"","description":"IP address of the client."},{"field":"client.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the client."},{"field":"client.nat.ip","type":"ip","normalization":"","example":"","description":"Client NAT ip address"},{"field":"client.nat.port","type":"long","normalization":"","example":"","description":"Client NAT port"},{"field":"client.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the client to the server."},{"field":"client.port","type":"long","normalization":"","example":"","description":"Port of the client."},{"field":"client.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered client domain, stripped of the subdomain."},{"field":"client.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"client.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"client.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"client.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"client.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"client.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"client.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"client.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"client.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"client.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"client.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"client.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"client.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"client.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"cloud.account.id","type":"keyword","normalization":"","example":666777888999,"description":"The cloud account or organization id."},{"field":"cloud.account.name","type":"keyword","normalization":"","example":"elastic-dev","description":"The cloud account name."},{"field":"cloud.availability_zone","type":"keyword","normalization":"","example":"us-east-1c","description":"Availability zone in which this host, resource, or service is located."},{"field":"cloud.instance.id","type":"keyword","normalization":"","example":"i-1234567890abcdef0","description":"Instance ID of the host machine."},{"field":"cloud.instance.name","type":"keyword","normalization":"","example":"","description":"Instance name of the host machine."},{"field":"cloud.machine.type","type":"keyword","normalization":"","example":"t2.medium","description":"Machine type of the host machine."},{"field":"cloud.origin.account.id","type":"keyword","normalization":"","example":666777888999,"description":"The cloud account or organization id."},{"field":"cloud.origin.account.name","type":"keyword","normalization":"","example":"elastic-dev","description":"The cloud account name."},{"field":"cloud.origin.availability_zone","type":"keyword","normalization":"","example":"us-east-1c","description":"Availability zone in which this host, resource, or service is located."},{"field":"cloud.origin.instance.id","type":"keyword","normalization":"","example":"i-1234567890abcdef0","description":"Instance ID of the host machine."},{"field":"cloud.origin.instance.name","type":"keyword","normalization":"","example":"","description":"Instance name of the host machine."},{"field":"cloud.origin.machine.type","type":"keyword","normalization":"","example":"t2.medium","description":"Machine type of the host machine."},{"field":"cloud.origin.project.id","type":"keyword","normalization":"","example":"my-project","description":"The cloud project id."},{"field":"cloud.origin.project.name","type":"keyword","normalization":"","example":"my project","description":"The cloud project name."},{"field":"cloud.origin.provider","type":"keyword","normalization":"","example":"aws","description":"Name of the cloud provider."},{"field":"cloud.origin.region","type":"keyword","normalization":"","example":"us-east-1","description":"Region in which this host, resource, or service is located."},{"field":"cloud.origin.service.name","type":"keyword","normalization":"","example":"lambda","description":"The cloud service name."},{"field":"cloud.project.id","type":"keyword","normalization":"","example":"my-project","description":"The cloud project id."},{"field":"cloud.project.name","type":"keyword","normalization":"","example":"my project","description":"The cloud project name."},{"field":"cloud.provider","type":"keyword","normalization":"","example":"aws","description":"Name of the cloud provider."},{"field":"cloud.region","type":"keyword","normalization":"","example":"us-east-1","description":"Region in which this host, resource, or service is located."},{"field":"cloud.service.name","type":"keyword","normalization":"","example":"lambda","description":"The cloud service name."},{"field":"cloud.target.account.id","type":"keyword","normalization":"","example":666777888999,"description":"The cloud account or organization id."},{"field":"cloud.target.account.name","type":"keyword","normalization":"","example":"elastic-dev","description":"The cloud account name."},{"field":"cloud.target.availability_zone","type":"keyword","normalization":"","example":"us-east-1c","description":"Availability zone in which this host, resource, or service is located."},{"field":"cloud.target.instance.id","type":"keyword","normalization":"","example":"i-1234567890abcdef0","description":"Instance ID of the host machine."},{"field":"cloud.target.instance.name","type":"keyword","normalization":"","example":"","description":"Instance name of the host machine."},{"field":"cloud.target.machine.type","type":"keyword","normalization":"","example":"t2.medium","description":"Machine type of the host machine."},{"field":"cloud.target.project.id","type":"keyword","normalization":"","example":"my-project","description":"The cloud project id."},{"field":"cloud.target.project.name","type":"keyword","normalization":"","example":"my project","description":"The cloud project name."},{"field":"cloud.target.provider","type":"keyword","normalization":"","example":"aws","description":"Name of the cloud provider."},{"field":"cloud.target.region","type":"keyword","normalization":"","example":"us-east-1","description":"Region in which this host, resource, or service is located."},{"field":"cloud.target.service.name","type":"keyword","normalization":"","example":"lambda","description":"The cloud service name."},{"field":"container.cpu.usage","type":"scaled_float","normalization":"","example":"","description":"Percent CPU used, between 0 and 1."},{"field":"container.disk.read.bytes","type":"long","normalization":"","example":"","description":"The number of bytes read by all disks."},{"field":"container.disk.write.bytes","type":"long","normalization":"","example":"","description":"The number of bytes written on all disks."},{"field":"container.id","type":"keyword","normalization":"","example":"","description":"Unique container id."},{"field":"container.image.hash.all","type":"keyword","normalization":"array","example":"[sha256:f8fefc80e3273dc756f288a63945820d6476ad64883892c771b5e2ece6bf1b26]","description":"An array of digests of the image the container was built on."},{"field":"container.image.name","type":"keyword","normalization":"","example":"","description":"Name of the image the container was built on."},{"field":"container.image.tag","type":"keyword","normalization":"array","example":"","description":"Container image tags."},{"field":"container.labels","type":"object","normalization":"","example":"","description":"Image labels."},{"field":"container.memory.usage","type":"scaled_float","normalization":"","example":"","description":"Percent memory used, between 0 and 1."},{"field":"container.name","type":"keyword","normalization":"","example":"","description":"Container name."},{"field":"container.network.egress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes sent on all network interfaces."},{"field":"container.network.ingress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes received on all network interfaces."},{"field":"container.runtime","type":"keyword","normalization":"","example":"docker","description":"Runtime managing this container."},{"field":"data_stream.dataset","type":"constant_keyword","normalization":"","example":"nginx.access","description":"The field can contain anything that makes sense to signify the source of the data."},{"field":"data_stream.namespace","type":"constant_keyword","normalization":"","example":"production","description":"A user defined namespace. Namespaces are useful to allow grouping of data."},{"field":"data_stream.type","type":"constant_keyword","normalization":"","example":"logs","description":"An overarching type for the data stream."},{"field":"destination.address","type":"keyword","normalization":"","example":"","description":"Destination network address."},{"field":"destination.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"destination.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"destination.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"destination.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the destination to the source."},{"field":"destination.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the destination."},{"field":"destination.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"destination.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"destination.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"destination.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"destination.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"destination.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"destination.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"destination.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"destination.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"destination.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"destination.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"destination.ip","type":"ip","normalization":"","example":"","description":"IP address of the destination."},{"field":"destination.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the destination."},{"field":"destination.nat.ip","type":"ip","normalization":"","example":"","description":"Destination NAT ip"},{"field":"destination.nat.port","type":"long","normalization":"","example":"","description":"Destination NAT Port"},{"field":"destination.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the destination to the source."},{"field":"destination.port","type":"long","normalization":"","example":"","description":"Port of the destination."},{"field":"destination.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered destination domain, stripped of the subdomain."},{"field":"destination.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"destination.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"destination.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"destination.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"destination.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"destination.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"destination.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"destination.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"destination.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"destination.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"destination.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"destination.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"destination.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"destination.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"device.id","type":"keyword","normalization":"","example":"00000000-54b3-e7c7-0000-000046bffd97","description":"The unique identifier of a device."},{"field":"device.manufacturer","type":"keyword","normalization":"","example":"Samsung","description":"The vendor name of the device manufacturer."},{"field":"device.model.identifier","type":"keyword","normalization":"","example":"SM-G920F","description":"The machine readable identifier of the device model."},{"field":"device.model.name","type":"keyword","normalization":"","example":"Samsung Galaxy S6","description":"The human readable marketing name of the device model."},{"field":"dll.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"dll.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"dll.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"dll.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"dll.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"dll.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"dll.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"dll.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"dll.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"dll.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"dll.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"dll.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"dll.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"dll.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"dll.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"dll.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"dll.name","type":"keyword","normalization":"","example":"kernel32.dll","description":"Name of the library."},{"field":"dll.path","type":"keyword","normalization":"","example":"C:\\Windows\\System32\\kernel32.dll","description":"Full file path of the library."},{"field":"dll.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"dll.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"dll.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"dll.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"dll.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"dll.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"dll.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"dll.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"dll.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"dll.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"dll.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"dll.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"dll.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"dll.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"dll.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"dll.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"dll.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"dll.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"dll.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"dll.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"dll.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"dll.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"dll.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"dns.answers","type":"object","normalization":"array","example":"","description":"Array of DNS answers."},{"field":"dns.answers.class","type":"keyword","normalization":"","example":"IN","description":"The class of DNS data contained in this resource record."},{"field":"dns.answers.data","type":"keyword","normalization":"","example":"10.10.10.10","description":"The data describing the resource."},{"field":"dns.answers.name","type":"keyword","normalization":"","example":"www.example.com","description":"The domain name to which this resource record pertains."},{"field":"dns.answers.ttl","type":"long","normalization":"","example":180,"description":"The time interval in seconds that this resource record may be cached before it should be discarded."},{"field":"dns.answers.type","type":"keyword","normalization":"","example":"CNAME","description":"The type of data contained in this resource record."},{"field":"dns.header_flags","type":"keyword","normalization":"array","example":["RD","RA"],"description":"Array of DNS header flags."},{"field":"dns.id","type":"keyword","normalization":"","example":62111,"description":"The DNS packet identifier assigned by the program that generated the query. The identifier is copied to the response."},{"field":"dns.op_code","type":"keyword","normalization":"","example":"QUERY","description":"The DNS operation code that specifies the kind of query in the message."},{"field":"dns.question.class","type":"keyword","normalization":"","example":"IN","description":"The class of records being queried."},{"field":"dns.question.name","type":"keyword","normalization":"","example":"www.example.com","description":"The name being queried."},{"field":"dns.question.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered domain, stripped of the subdomain."},{"field":"dns.question.subdomain","type":"keyword","normalization":"","example":"www","description":"The subdomain of the domain."},{"field":"dns.question.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"dns.question.type","type":"keyword","normalization":"","example":"AAAA","description":"The type of record being queried."},{"field":"dns.resolved_ip","type":"ip","normalization":"array","example":["10.10.10.10","10.10.10.11"],"description":"Array containing all IPs seen in answers.data"},{"field":"dns.response_code","type":"keyword","normalization":"","example":"NOERROR","description":"The DNS response code."},{"field":"dns.type","type":"keyword","normalization":"","example":"answer","description":"The type of DNS event captured, query or answer."},{"field":"email.attachments","type":"nested","normalization":"array","example":"","description":"List of objects describing the attachments."},{"field":"email.attachments.file.extension","type":"keyword","normalization":"","example":"txt","description":"Attachment file extension."},{"field":"email.attachments.file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"email.attachments.file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"email.attachments.file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"email.attachments.file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"email.attachments.file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"email.attachments.file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"email.attachments.file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"email.attachments.file.mime_type","type":"keyword","normalization":"","example":"text/plain","description":"MIME type of the attachment file."},{"field":"email.attachments.file.name","type":"keyword","normalization":"","example":"attachment.txt","description":"Name of the attachment file."},{"field":"email.attachments.file.size","type":"long","normalization":"","example":64329,"description":"Attachment file size."},{"field":"email.bcc.address","type":"keyword","normalization":"array","example":"bcc.user1@example.com","description":"Email address of BCC recipient"},{"field":"email.cc.address","type":"keyword","normalization":"array","example":"cc.user1@example.com","description":"Email address of CC recipient"},{"field":"email.content_type","type":"keyword","normalization":"","example":"text/plain","description":"MIME type of the email message."},{"field":"email.delivery_timestamp","type":"date","normalization":"","example":"2020-11-10T22:12:34.8196921Z","description":"Date and time when message was delivered."},{"field":"email.direction","type":"keyword","normalization":"","example":"inbound","description":"Direction of the message."},{"field":"email.from.address","type":"keyword","normalization":"array","example":"sender@example.com","description":"The sender's email address."},{"field":"email.local_id","type":"keyword","normalization":"","example":"c26dbea0-80d5-463b-b93c-4e8b708219ce","description":"Unique identifier given by the source."},{"field":"email.message_id","type":"wildcard","normalization":"","example":"81ce15$8r2j59@mail01.example.com","description":"Value from the Message-ID header."},{"field":"email.origination_timestamp","type":"date","normalization":"","example":"2020-11-10T22:12:34.8196921Z","description":"Date and time the email was composed."},{"field":"email.reply_to.address","type":"keyword","normalization":"array","example":"reply.here@example.com","description":"Address replies should be delivered to."},{"field":"email.sender.address","type":"keyword","normalization":"","example":"","description":"Address of the message sender."},{"field":"email.subject","type":"keyword","normalization":"","example":"Please see this important message.","description":"The subject of the email message."},{"field":"email.subject.text","type":"match_only_text","normalization":"","example":"Please see this important message.","description":"The subject of the email message."},{"field":"email.to.address","type":"keyword","normalization":"array","example":"user1@example.com","description":"Email address of recipient"},{"field":"email.x_mailer","type":"keyword","normalization":"","example":"Spambot v2.5","description":"Application that drafted email."},{"field":"error.code","type":"keyword","normalization":"","example":"","description":"Error code describing the error."},{"field":"error.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the error."},{"field":"error.message","type":"match_only_text","normalization":"","example":"","description":"Error message."},{"field":"error.stack_trace","type":"wildcard","normalization":"","example":"","description":"The stack trace of this error in plain text."},{"field":"error.stack_trace.text","type":"match_only_text","normalization":"","example":"","description":"The stack trace of this error in plain text."},{"field":"error.type","type":"keyword","normalization":"","example":"java.lang.NullPointerException","description":"The type of the error, for example the class name of the exception."},{"field":"event.action","type":"keyword","normalization":"","example":"user-password-change","description":"The action captured by the event."},{"field":"event.category","type":"keyword","normalization":"array","example":"authentication","description":"Event category. The second categorization field in the hierarchy."},{"field":"event.code","type":"keyword","normalization":"","example":4648,"description":"Identification code for this event."},{"field":"event.created","type":"date","normalization":"","example":"2016-05-23T08:05:34.857Z","description":"Time when the event was first read by an agent or by your pipeline."},{"field":"event.dataset","type":"keyword","normalization":"","example":"apache.access","description":"Name of the dataset."},{"field":"event.duration","type":"long","normalization":"","example":"","description":"Duration of the event in nanoseconds."},{"field":"event.end","type":"date","normalization":"","example":"","description":"event.end contains the date when the event ended or when the activity was last observed."},{"field":"event.hash","type":"keyword","normalization":"","example":"123456789012345678901234567890ABCD","description":"Hash (perhaps logstash fingerprint) of raw field to be able to demonstrate log integrity."},{"field":"event.id","type":"keyword","normalization":"","example":"8a4f500d","description":"Unique ID to describe the event."},{"field":"event.kind","type":"keyword","normalization":"","example":"alert","description":"The kind of the event. The highest categorization field in the hierarchy."},{"field":"event.original","type":"keyword","normalization":"","example":"Sep 19 08:26:10 host CEF:0|Security| threatmanager|1.0|100| worm successfully stopped|10|src=10.0.0.1 dst=2.1.2.2spt=1232","description":"Raw text message of entire event."},{"field":"event.outcome","type":"keyword","normalization":"","example":"success","description":"The outcome of the event. The lowest level categorization field in the hierarchy."},{"field":"event.provider","type":"keyword","normalization":"","example":"kernel","description":"Source of the event."},{"field":"event.reason","type":"keyword","normalization":"","example":"Terminated an unexpected process","description":"Reason why this event happened, according to the source"},{"field":"event.reference","type":"keyword","normalization":"","example":"https://system.example.com/event/#0001234","description":"Event reference URL"},{"field":"event.risk_score","type":"float","normalization":"","example":"","description":"Risk score or priority of the event (e.g. security solutions). Use your system's original value here."},{"field":"event.risk_score_norm","type":"float","normalization":"","example":"","description":"Normalized risk score or priority of the event (0-100)."},{"field":"event.sequence","type":"long","normalization":"","example":"","description":"Sequence number of the event."},{"field":"event.severity","type":"long","normalization":"","example":7,"description":"Numeric severity of the event."},{"field":"event.start","type":"date","normalization":"","example":"","description":"event.start contains the date when the event started or when the activity was first observed."},{"field":"event.timezone","type":"keyword","normalization":"","example":"","description":"Event time zone."},{"field":"event.type","type":"keyword","normalization":"array","example":"","description":"Event type. The third categorization field in the hierarchy."},{"field":"event.url","type":"keyword","normalization":"","example":"https://mysystem.example.com/alert/5271dedb-f5b0-4218-87f0-4ac4870a38fe","description":"Event investigation URL"},{"field":"faas.coldstart","type":"boolean","normalization":"","example":"","description":"Boolean value indicating a cold start of a function."},{"field":"faas.execution","type":"keyword","normalization":"","example":"af9d5aa4-a685-4c5f-a22b-444f80b3cc28","description":"The execution ID of the current function execution."},{"field":"faas.id","type":"keyword","normalization":"","example":"arn:aws:lambda:us-west-2:123456789012:function:my-function","description":"The unique identifier of a serverless function."},{"field":"faas.name","type":"keyword","normalization":"","example":"my-function","description":"The name of a serverless function."},{"field":"faas.trigger","type":"nested","normalization":"","example":"","description":"Details about the function trigger."},{"field":"faas.trigger.request_id","type":"keyword","normalization":"","example":123456789,"description":"The ID of the trigger request , message, event, etc."},{"field":"faas.trigger.type","type":"keyword","normalization":"","example":"http","description":"The trigger for the function execution."},{"field":"faas.version","type":"keyword","normalization":"","example":123,"description":"The version of a serverless function."},{"field":"file.accessed","type":"date","normalization":"","example":"","description":"Last time the file was accessed."},{"field":"file.attributes","type":"keyword","normalization":"array","example":["readonly","system"],"description":"Array of file attributes."},{"field":"file.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"file.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"file.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"file.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"file.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"file.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"file.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"file.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"file.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"file.created","type":"date","normalization":"","example":"","description":"File creation time."},{"field":"file.ctime","type":"date","normalization":"","example":"","description":"Last time the file attributes or metadata changed."},{"field":"file.device","type":"keyword","normalization":"","example":"sda","description":"Device that is the source of the file."},{"field":"file.directory","type":"keyword","normalization":"","example":"/home/alice","description":"Directory where the file is located."},{"field":"file.drive_letter","type":"keyword","normalization":"","example":"C","description":"Drive letter where the file is located."},{"field":"file.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"file.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"file.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"file.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"file.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"file.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"file.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"file.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"file.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"file.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"file.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"file.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"file.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"file.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"file.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"file.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"file.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"file.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"file.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"file.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"file.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"file.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"file.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"file.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"file.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"file.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"file.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"file.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"file.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"file.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"file.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"file.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"file.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"file.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"file.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"file.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"file.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"file.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"file.extension","type":"keyword","normalization":"","example":"png","description":"File extension, excluding the leading dot."},{"field":"file.fork_name","type":"keyword","normalization":"","example":"Zone.Identifer","description":"A fork is additional data associated with a filesystem object."},{"field":"file.gid","type":"keyword","normalization":"","example":1001,"description":"Primary group ID (GID) of the file."},{"field":"file.group","type":"keyword","normalization":"","example":"alice","description":"Primary group name of the file."},{"field":"file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"file.inode","type":"keyword","normalization":"","example":256383,"description":"Inode representing the file in the filesystem."},{"field":"file.macho.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a Mach-O file."},{"field":"file.macho.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"file.macho.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"file.macho.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"file.macho.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"file.macho.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a Mach-O file."},{"field":"file.macho.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"file.macho.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"file.macho.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"file.macho.sections","type":"nested","normalization":"array","example":"","description":"Section information of the Mach-O file."},{"field":"file.macho.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"file.macho.sections.name","type":"keyword","normalization":"","example":"","description":"Mach-O Section List name."},{"field":"file.macho.sections.physical_size","type":"long","normalization":"","example":"","description":"Mach-O Section List physical size."},{"field":"file.macho.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"file.macho.sections.virtual_size","type":"long","normalization":"","example":"","description":"Mach-O Section List virtual size. This is always the same as `physical_size`."},{"field":"file.macho.symhash","type":"keyword","normalization":"","example":"d3ccf195b62a9279c3c19af1080497ec","description":"A hash of the imports in a Mach-O file."},{"field":"file.mime_type","type":"keyword","normalization":"","example":"","description":"Media type of file, document, or arrangement of bytes."},{"field":"file.mode","type":"keyword","normalization":"","example":"0640","description":"Mode of the file in octal representation."},{"field":"file.mtime","type":"date","normalization":"","example":"","description":"Last time the file content was modified."},{"field":"file.name","type":"keyword","normalization":"","example":"example.png","description":"Name of the file including the extension, without the directory."},{"field":"file.owner","type":"keyword","normalization":"","example":"alice","description":"File owner's username."},{"field":"file.path","type":"keyword","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"file.path.text","type":"match_only_text","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"file.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"file.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"file.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"file.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"file.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"file.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"file.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"file.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"file.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"file.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"file.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"file.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"file.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"file.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"file.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"file.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"file.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"file.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"file.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"file.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"file.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"file.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"file.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"file.size","type":"long","normalization":"","example":16384,"description":"File size in bytes."},{"field":"file.target_path","type":"keyword","normalization":"","example":"","description":"Target path for symlinks."},{"field":"file.target_path.text","type":"match_only_text","normalization":"","example":"","description":"Target path for symlinks."},{"field":"file.type","type":"keyword","normalization":"","example":"file","description":"File type (file, dir, or symlink)."},{"field":"file.uid","type":"keyword","normalization":"","example":1001,"description":"The user ID (UID) or security identifier (SID) of the file owner."},{"field":"file.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"file.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"file.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"file.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"file.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"file.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"file.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"file.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"file.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"file.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"file.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"file.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"file.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"file.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"file.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"file.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"file.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"file.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"file.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"file.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"file.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"file.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"file.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"file.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"host.boot.id","type":"keyword","normalization":"","example":"88a1f0ed-5ae5-41ee-af6b-41921c311872","description":"Linux boot uuid taken from /proc/sys/kernel/random/boot_id"},{"field":"host.cpu.usage","type":"scaled_float","normalization":"","example":"","description":"Percent CPU used, between 0 and 1."},{"field":"host.disk.read.bytes","type":"long","normalization":"","example":"","description":"The number of bytes read by all disks."},{"field":"host.disk.write.bytes","type":"long","normalization":"","example":"","description":"The number of bytes written on all disks."},{"field":"host.domain","type":"keyword","normalization":"","example":"CONTOSO","description":"Name of the directory the group is a member of."},{"field":"host.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"host.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"host.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"host.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"host.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"host.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"host.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"host.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"host.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"host.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"host.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"host.name","type":"keyword","normalization":"","example":"","description":"Name of the host."},{"field":"host.network.egress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes sent on all network interfaces."},{"field":"host.network.egress.packets","type":"long","normalization":"","example":"","description":"The number of packets sent on all network interfaces."},{"field":"host.network.ingress.bytes","type":"long","normalization":"","example":"","description":"The number of bytes received on all network interfaces."},{"field":"host.network.ingress.packets","type":"long","normalization":"","example":"","description":"The number of packets received on all network interfaces."},{"field":"host.os.full","type":"keyword","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"host.os.full.text","type":"match_only_text","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"host.os.name.text","type":"match_only_text","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"host.os.platform","type":"keyword","normalization":"","example":"darwin","description":"Operating system platform (such centos, ubuntu, windows)."},{"field":"host.pid_ns_ino","type":"keyword","normalization":"","example":256383,"description":"Pid namespace inode"},{"field":"host.risk.calculated_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"host.risk.calculated_score","type":"float","normalization":"","example":880.73,"description":"A risk classification score calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"host.risk.calculated_score_norm","type":"float","normalization":"","example":88.73,"description":"A normalized risk score calculated by an internal system."},{"field":"host.risk.static_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"host.risk.static_score","type":"float","normalization":"","example":830,"description":"A risk classification score obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"host.risk.static_score_norm","type":"float","normalization":"","example":83,"description":"A normalized risk score calculated by an external system."},{"field":"host.type","type":"keyword","normalization":"","example":"","description":"Type of host."},{"field":"host.uptime","type":"long","normalization":"","example":1325,"description":"Seconds the host has been up."},{"field":"http.request.body.bytes","type":"long","normalization":"","example":887,"description":"Size in bytes of the request body."},{"field":"http.request.body.content","type":"wildcard","normalization":"","example":"Hello world","description":"The full HTTP request body."},{"field":"http.request.body.content.text","type":"match_only_text","normalization":"","example":"Hello world","description":"The full HTTP request body."},{"field":"http.request.bytes","type":"long","normalization":"","example":1437,"description":"Total size in bytes of the request (body and headers)."},{"field":"http.request.id","type":"keyword","normalization":"","example":"123e4567-e89b-12d3-a456-426614174000","description":"HTTP request ID."},{"field":"http.request.method","type":"keyword","normalization":"","example":"POST","description":"HTTP request method."},{"field":"http.request.mime_type","type":"keyword","normalization":"","example":"image/gif","description":"Mime type of the body of the request."},{"field":"http.request.referrer","type":"keyword","normalization":"","example":"https://blog.example.com/","description":"Referrer for this HTTP request."},{"field":"http.response.body.bytes","type":"long","normalization":"","example":887,"description":"Size in bytes of the response body."},{"field":"http.response.body.content","type":"wildcard","normalization":"","example":"Hello world","description":"The full HTTP response body."},{"field":"http.response.body.content.text","type":"match_only_text","normalization":"","example":"Hello world","description":"The full HTTP response body."},{"field":"http.response.bytes","type":"long","normalization":"","example":1437,"description":"Total size in bytes of the response (body and headers)."},{"field":"http.response.mime_type","type":"keyword","normalization":"","example":"image/gif","description":"Mime type of the body of the response."},{"field":"http.response.status_code","type":"long","normalization":"","example":404,"description":"HTTP response status code."},{"field":"http.version","type":"keyword","normalization":"","example":1.1,"description":"HTTP version."},{"field":"log.file.path","type":"keyword","normalization":"","example":"/var/log/fun-times.log","description":"Full path to the log file this event came from."},{"field":"log.level","type":"keyword","normalization":"","example":"error","description":"Log level of the log event."},{"field":"log.logger","type":"keyword","normalization":"","example":"org.elasticsearch.bootstrap.Bootstrap","description":"Name of the logger."},{"field":"log.origin.file.line","type":"long","normalization":"","example":42,"description":"The line number of the file which originated the log event."},{"field":"log.origin.file.name","type":"keyword","normalization":"","example":"Bootstrap.java","description":"The code file which originated the log event."},{"field":"log.origin.function","type":"keyword","normalization":"","example":"init","description":"The function which originated the log event."},{"field":"log.syslog","type":"object","normalization":"","example":"","description":"Syslog metadata"},{"field":"log.syslog.appname","type":"keyword","normalization":"","example":"sshd","description":"The device or application that originated the Syslog message."},{"field":"log.syslog.facility.code","type":"long","normalization":"","example":23,"description":"Syslog numeric facility of the event."},{"field":"log.syslog.facility.name","type":"keyword","normalization":"","example":"local7","description":"Syslog text-based facility of the event."},{"field":"log.syslog.hostname","type":"keyword","normalization":"","example":"example-host","description":"The host that originated the Syslog message."},{"field":"log.syslog.msgid","type":"keyword","normalization":"","example":"ID47","description":"An identifier for the type of Syslog message."},{"field":"log.syslog.priority","type":"long","normalization":"","example":135,"description":"Syslog priority of the event."},{"field":"log.syslog.procid","type":"keyword","normalization":"","example":12345,"description":"The process name or ID that originated the Syslog message."},{"field":"log.syslog.severity.code","type":"long","normalization":"","example":3,"description":"Syslog numeric severity of the event."},{"field":"log.syslog.severity.name","type":"keyword","normalization":"","example":"Error","description":"Syslog text-based severity of the event."},{"field":"log.syslog.structured_data","type":"flattened","normalization":"","example":"","description":"Structured data expressed in RFC 5424 messages."},{"field":"log.syslog.version","type":"keyword","normalization":"","example":1,"description":"Syslog protocol version."},{"field":"network.application","type":"keyword","normalization":"","example":"aim","description":"Application level protocol name."},{"field":"network.bytes","type":"long","normalization":"","example":368,"description":"Total bytes transferred in both directions."},{"field":"network.community_id","type":"keyword","normalization":"","example":"1:hO+sN4H+MG5MY/8hIrXPqc4ZQz0=","description":"A hash of source and destination IPs and ports."},{"field":"network.direction","type":"keyword","normalization":"","example":"inbound","description":"Direction of the network traffic."},{"field":"network.forwarded_ip","type":"ip","normalization":"","example":"192.1.1.2","description":"Host IP address when the source IP address is the proxy."},{"field":"network.iana_number","type":"keyword","normalization":"","example":6,"description":"IANA Protocol Number."},{"field":"network.inner","type":"object","normalization":"","example":"","description":"Inner VLAN tag information"},{"field":"network.inner.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"network.inner.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"network.name","type":"keyword","normalization":"","example":"Guest Wifi","description":"Name given by operators to sections of their network."},{"field":"network.packets","type":"long","normalization":"","example":24,"description":"Total packets transferred in both directions."},{"field":"network.protocol","type":"keyword","normalization":"","example":"http","description":"Application protocol name."},{"field":"network.transport","type":"keyword","normalization":"","example":"tcp","description":"Protocol Name corresponding to the field `iana_number`."},{"field":"network.type","type":"keyword","normalization":"","example":"ipv4","description":"In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc"},{"field":"network.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"network.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"observer.egress","type":"object","normalization":"","example":"","description":"Object field for egress information"},{"field":"observer.egress.interface.alias","type":"keyword","normalization":"","example":"outside","description":"Interface alias"},{"field":"observer.egress.interface.id","type":"keyword","normalization":"","example":10,"description":"Interface ID"},{"field":"observer.egress.interface.name","type":"keyword","normalization":"","example":"eth0","description":"Interface name"},{"field":"observer.egress.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"observer.egress.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"observer.egress.zone","type":"keyword","normalization":"","example":"Public_Internet","description":"Observer Egress zone"},{"field":"observer.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"observer.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"observer.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"observer.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"observer.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"observer.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"observer.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"observer.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"observer.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"observer.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"observer.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"observer.hostname","type":"keyword","normalization":"","example":"","description":"Hostname of the observer."},{"field":"observer.ingress","type":"object","normalization":"","example":"","description":"Object field for ingress information"},{"field":"observer.ingress.interface.alias","type":"keyword","normalization":"","example":"outside","description":"Interface alias"},{"field":"observer.ingress.interface.id","type":"keyword","normalization":"","example":10,"description":"Interface ID"},{"field":"observer.ingress.interface.name","type":"keyword","normalization":"","example":"eth0","description":"Interface name"},{"field":"observer.ingress.vlan.id","type":"keyword","normalization":"","example":10,"description":"VLAN ID as reported by the observer."},{"field":"observer.ingress.vlan.name","type":"keyword","normalization":"","example":"outside","description":"Optional VLAN name as reported by the observer."},{"field":"observer.ingress.zone","type":"keyword","normalization":"","example":"DMZ","description":"Observer ingress zone"},{"field":"observer.ip","type":"ip","normalization":"array","example":"","description":"IP addresses of the observer."},{"field":"observer.mac","type":"keyword","normalization":"array","example":["00-00-5E-00-53-23","00-00-5E-00-53-24"],"description":"MAC addresses of the observer."},{"field":"observer.name","type":"keyword","normalization":"","example":"1_proxySG","description":"Custom name of the observer."},{"field":"observer.os.family","type":"keyword","normalization":"","example":"debian","description":"OS family (such as redhat, debian, freebsd, windows)."},{"field":"observer.os.full","type":"keyword","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"observer.os.full.text","type":"match_only_text","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"observer.os.kernel","type":"keyword","normalization":"","example":"4.4.0-112-generic","description":"Operating system kernel version as a raw string."},{"field":"observer.os.name","type":"keyword","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"observer.os.name.text","type":"match_only_text","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"observer.os.platform","type":"keyword","normalization":"","example":"darwin","description":"Operating system platform (such centos, ubuntu, windows)."},{"field":"observer.os.type","type":"keyword","normalization":"","example":"macos","description":"Which commercial OS family (one of: linux, macos, unix, windows, ios or android)."},{"field":"observer.os.version","type":"keyword","normalization":"","example":"10.14.1","description":"Operating system version as a raw string."},{"field":"observer.product","type":"keyword","normalization":"","example":"s200","description":"The product name of the observer."},{"field":"observer.serial_number","type":"keyword","normalization":"","example":"","description":"Observer serial number."},{"field":"observer.type","type":"keyword","normalization":"","example":"firewall","description":"The type of the observer the data is coming from."},{"field":"observer.vendor","type":"keyword","normalization":"","example":"Symantec","description":"Vendor name of the observer."},{"field":"observer.version","type":"keyword","normalization":"","example":"","description":"Observer version."},{"field":"orchestrator.api_version","type":"keyword","normalization":"","example":"v1beta1","description":"API version being used to carry out the action"},{"field":"orchestrator.cluster.id","type":"keyword","normalization":"","example":"","description":"Unique ID of the cluster."},{"field":"orchestrator.cluster.name","type":"keyword","normalization":"","example":"","description":"Name of the cluster."},{"field":"orchestrator.cluster.url","type":"keyword","normalization":"","example":"","description":"URL of the API used to manage the cluster."},{"field":"orchestrator.cluster.version","type":"keyword","normalization":"","example":"","description":"The version of the cluster."},{"field":"orchestrator.namespace","type":"keyword","normalization":"","example":"kube-system","description":"Namespace in which the action is taking place."},{"field":"orchestrator.organization","type":"keyword","normalization":"","example":"elastic","description":"Organization affected by the event (for multi-tenant orchestrator setups)."},{"field":"orchestrator.resource.id","type":"keyword","normalization":"","example":"","description":"Unique ID of the resource being acted upon."},{"field":"orchestrator.resource.ip","type":"ip","normalization":"array","example":"","description":"IP address assigned to the resource associated with the event being observed."},{"field":"orchestrator.resource.name","type":"keyword","normalization":"","example":"test-pod-cdcws","description":"Name of the resource being acted upon."},{"field":"orchestrator.resource.parent.type","type":"keyword","normalization":"","example":"DaemonSet","description":"Type or kind of the parent resource associated with the event being observed."},{"field":"orchestrator.resource.type","type":"keyword","normalization":"","example":"service","description":"Type of resource being acted upon."},{"field":"orchestrator.type","type":"keyword","normalization":"","example":"kubernetes","description":"Orchestrator cluster type (e.g. kubernetes, nomad or cloudfoundry)."},{"field":"organization.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the organization."},{"field":"organization.name","type":"keyword","normalization":"","example":"","description":"Organization name."},{"field":"organization.name.text","type":"match_only_text","normalization":"","example":"","description":"Organization name."},{"field":"package.architecture","type":"keyword","normalization":"","example":"x86_64","description":"Package architecture."},{"field":"package.build_version","type":"keyword","normalization":"","example":"36f4f7e89dd61b0988b12ee000b98966867710cd","description":"Build version information"},{"field":"package.checksum","type":"keyword","normalization":"","example":"68b329da9893e34099c7d8ad5cb9c940","description":"Checksum of the installed package for verification."},{"field":"package.description","type":"keyword","normalization":"","example":"Open source programming language to build simple/reliable/efficient software.","description":"Description of the package."},{"field":"package.install_scope","type":"keyword","normalization":"","example":"global","description":"Indicating how the package was installed, e.g. user-local, global."},{"field":"package.installed","type":"date","normalization":"","example":"","description":"Time when package was installed."},{"field":"package.license","type":"keyword","normalization":"","example":"Apache License 2.0","description":"Package license"},{"field":"package.name","type":"keyword","normalization":"","example":"go","description":"Package name"},{"field":"package.path","type":"keyword","normalization":"","example":"/usr/local/Cellar/go/1.12.9/","description":"Path where the package is installed."},{"field":"package.reference","type":"keyword","normalization":"","example":"https://golang.org","description":"Package home page or reference URL"},{"field":"package.size","type":"long","normalization":"","example":62231,"description":"Package size in bytes."},{"field":"package.type","type":"keyword","normalization":"","example":"rpm","description":"Package type"},{"field":"package.version","type":"keyword","normalization":"","example":"1.12.9","description":"Package version"},{"field":"process.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"process.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"process.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"process.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"process.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"process.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"process.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"process.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"process.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"process.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"process.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"process.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"process.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"process.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"process.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"process.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"process.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"process.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"process.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"process.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"process.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"process.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"process.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"process.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"process.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"process.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"process.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"process.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"process.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"process.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"process.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"process.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"process.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"process.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"process.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"process.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"process.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"process.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"process.end","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process ended."},{"field":"process.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.entry_leader.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.entry_leader.attested_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.attested_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.attested_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.attested_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.entry_leader.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.entry_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.entry_meta.source.ip","type":"ip","normalization":"","example":"","description":"IP address of the source."},{"field":"process.entry_leader.entry_meta.type","type":"keyword","normalization":"","example":"","description":"The entry type for the entry session leader."},{"field":"process.entry_leader.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.entry_leader.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.entry_leader.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.entry_leader.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.entry_leader.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.entry_leader.parent.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.parent.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.entry_leader.parent.session_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.entry_leader.parent.session_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.entry_leader.parent.session_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.entry_leader.parent.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.entry_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.entry_leader.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.same_as_process","type":"boolean","normalization":"","example":"True","description":"This boolean is used to identify if a leader process is the same as the top level process."},{"field":"process.entry_leader.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.entry_leader.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.entry_leader.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.entry_leader.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.entry_leader.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.entry_leader.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.entry_leader.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.entry_leader.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.entry_leader.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.entry_leader.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.env_vars","type":"keyword","normalization":"array","example":["PATH=/usr/local/bin:/usr/bin","USER=ubuntu"],"description":"Array of environment variable bindings."},{"field":"process.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.exit_code","type":"long","normalization":"","example":137,"description":"The exit code of the process."},{"field":"process.group_leader.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.group_leader.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.group_leader.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.group_leader.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.group_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.group_leader.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.group_leader.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.group_leader.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.group_leader.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.group_leader.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.group_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.group_leader.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.group_leader.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.same_as_process","type":"boolean","normalization":"","example":"True","description":"This boolean is used to identify if a leader process is the same as the top level process."},{"field":"process.group_leader.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.group_leader.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.group_leader.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.group_leader.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.group_leader.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.group_leader.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.group_leader.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.group_leader.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.group_leader.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.group_leader.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.group_leader.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"process.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"process.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"process.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"process.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"process.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"process.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"process.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.io","type":"object","normalization":"","example":"","description":"A chunk of input or output (IO) from a single process."},{"field":"process.io.bytes_skipped","type":"object","normalization":"array","example":"","description":"An array of byte offsets and lengths denoting where IO data has been skipped."},{"field":"process.io.bytes_skipped.length","type":"long","normalization":"","example":"","description":"The length of bytes skipped."},{"field":"process.io.bytes_skipped.offset","type":"long","normalization":"","example":"","description":"The byte offset into this event's io.text (or io.bytes in the future) where length bytes were skipped."},{"field":"process.io.max_bytes_per_process_exceeded","type":"boolean","normalization":"","example":"","description":"If true, the process producing the output has exceeded the max_kilobytes_per_process configuration setting."},{"field":"process.io.text","type":"wildcard","normalization":"","example":"","description":"A chunk of output or input sanitized to UTF-8."},{"field":"process.io.total_bytes_captured","type":"long","normalization":"","example":"","description":"The total number of bytes captured in this event."},{"field":"process.io.total_bytes_skipped","type":"long","normalization":"","example":"","description":"The total number of bytes that were not captured due to implementation restrictions such as buffer size limits."},{"field":"process.io.type","type":"keyword","normalization":"","example":"","description":"The type of object on which the IO action (read or write) was taken."},{"field":"process.macho.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a Mach-O file."},{"field":"process.macho.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.macho.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.macho.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.macho.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.macho.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a Mach-O file."},{"field":"process.macho.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.macho.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.macho.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.macho.sections","type":"nested","normalization":"array","example":"","description":"Section information of the Mach-O file."},{"field":"process.macho.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.macho.sections.name","type":"keyword","normalization":"","example":"","description":"Mach-O Section List name."},{"field":"process.macho.sections.physical_size","type":"long","normalization":"","example":"","description":"Mach-O Section List physical size."},{"field":"process.macho.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.macho.sections.virtual_size","type":"long","normalization":"","example":"","description":"Mach-O Section List virtual size. This is always the same as `physical_size`."},{"field":"process.macho.symhash","type":"keyword","normalization":"","example":"d3ccf195b62a9279c3c19af1080497ec","description":"A hash of the imports in a Mach-O file."},{"field":"process.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.parent.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.parent.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.parent.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"process.parent.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"process.parent.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"process.parent.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"process.parent.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"process.parent.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"process.parent.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"process.parent.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"process.parent.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"process.parent.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.parent.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.parent.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"process.parent.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"process.parent.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"process.parent.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"process.parent.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"process.parent.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"process.parent.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.parent.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.parent.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"process.parent.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"process.parent.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"process.parent.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"process.parent.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"process.parent.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"process.parent.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"process.parent.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"process.parent.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"process.parent.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.parent.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"process.parent.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"process.parent.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.parent.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"process.parent.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"process.parent.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"process.parent.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"process.parent.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"process.parent.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.parent.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"process.parent.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"process.parent.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"process.parent.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"process.parent.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"process.parent.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"process.parent.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"process.parent.end","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process ended."},{"field":"process.parent.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.parent.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.parent.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.parent.exit_code","type":"long","normalization":"","example":137,"description":"The exit code of the process."},{"field":"process.parent.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.group_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.parent.group_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.parent.group_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.parent.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"process.parent.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"process.parent.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"process.parent.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"process.parent.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"process.parent.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"process.parent.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"process.parent.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.parent.macho.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a Mach-O file."},{"field":"process.parent.macho.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.parent.macho.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.macho.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.macho.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.parent.macho.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a Mach-O file."},{"field":"process.parent.macho.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.parent.macho.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.macho.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.macho.sections","type":"nested","normalization":"array","example":"","description":"Section information of the Mach-O file."},{"field":"process.parent.macho.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.parent.macho.sections.name","type":"keyword","normalization":"","example":"","description":"Mach-O Section List name."},{"field":"process.parent.macho.sections.physical_size","type":"long","normalization":"","example":"","description":"Mach-O Section List physical size."},{"field":"process.parent.macho.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.parent.macho.sections.virtual_size","type":"long","normalization":"","example":"","description":"Mach-O Section List virtual size. This is always the same as `physical_size`."},{"field":"process.parent.macho.symhash","type":"keyword","normalization":"","example":"d3ccf195b62a9279c3c19af1080497ec","description":"A hash of the imports in a Mach-O file."},{"field":"process.parent.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.parent.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.parent.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"process.parent.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"process.parent.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"process.parent.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"process.parent.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"process.parent.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.parent.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.parent.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.parent.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"process.parent.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"process.parent.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.parent.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.parent.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"process.parent.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"process.parent.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"process.parent.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"process.parent.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.parent.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"process.parent.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"process.parent.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.parent.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"process.parent.pgid","type":"long","normalization":"","example":"","description":"Deprecated identifier of the group of processes the process belongs to."},{"field":"process.parent.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.parent.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.parent.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.parent.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.parent.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.parent.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.parent.thread.id","type":"long","normalization":"","example":4242,"description":"Thread ID."},{"field":"process.parent.thread.name","type":"keyword","normalization":"","example":"thread-0","description":"Thread name."},{"field":"process.parent.title","type":"keyword","normalization":"","example":"","description":"Process title."},{"field":"process.parent.title.text","type":"match_only_text","normalization":"","example":"","description":"Process title."},{"field":"process.parent.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.parent.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.parent.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.parent.uptime","type":"long","normalization":"","example":1325,"description":"Seconds the process has been up."},{"field":"process.parent.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.parent.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.parent.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.parent.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"process.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"process.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"process.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"process.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"process.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"process.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"process.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"process.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"process.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"process.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"process.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"process.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"process.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"process.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"process.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"process.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"process.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"process.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"process.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"process.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"process.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"process.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"process.pgid","type":"long","normalization":"","example":"","description":"Deprecated identifier of the group of processes the process belongs to."},{"field":"process.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.previous.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.previous.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.previous.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.previous.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.args","type":"keyword","normalization":"array","example":["/usr/bin/ssh","-l","user","10.0.0.16"],"description":"Array of process arguments."},{"field":"process.session_leader.args_count","type":"long","normalization":"","example":4,"description":"Length of the process.args array."},{"field":"process.session_leader.command_line","type":"wildcard","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.session_leader.command_line.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh -l user 10.0.0.16","description":"Full command line that started the process."},{"field":"process.session_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.session_leader.executable","type":"keyword","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.session_leader.executable.text","type":"match_only_text","normalization":"","example":"/usr/bin/ssh","description":"Absolute path to the process executable."},{"field":"process.session_leader.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.interactive","type":"boolean","normalization":"","example":"True","description":"Whether the process is connected to an interactive shell."},{"field":"process.session_leader.name","type":"keyword","normalization":"","example":"ssh","description":"Process name."},{"field":"process.session_leader.name.text","type":"match_only_text","normalization":"","example":"ssh","description":"Process name."},{"field":"process.session_leader.parent.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.session_leader.parent.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.session_leader.parent.session_leader.entity_id","type":"keyword","normalization":"","example":"c2c455d9f99375d","description":"Unique identifier for the process."},{"field":"process.session_leader.parent.session_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.session_leader.parent.session_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.session_leader.parent.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.session_leader.pid","type":"long","normalization":"","example":4242,"description":"Process id."},{"field":"process.session_leader.real_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.real_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.real_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.session_leader.real_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.real_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.same_as_process","type":"boolean","normalization":"","example":"True","description":"This boolean is used to identify if a leader process is the same as the top level process."},{"field":"process.session_leader.saved_group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.saved_group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.saved_user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.session_leader.saved_user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.saved_user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.session_leader.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.session_leader.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.session_leader.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.session_leader.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.session_leader.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.session_leader.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.session_leader.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.session_leader.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.session_leader.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.start","type":"date","normalization":"","example":"2016-05-23T08:05:34.853Z","description":"The time the process started."},{"field":"process.supplemental_groups.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"process.supplemental_groups.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"process.thread.id","type":"long","normalization":"","example":4242,"description":"Thread ID."},{"field":"process.thread.name","type":"keyword","normalization":"","example":"thread-0","description":"Thread name."},{"field":"process.title","type":"keyword","normalization":"","example":"","description":"Process title."},{"field":"process.title.text","type":"match_only_text","normalization":"","example":"","description":"Process title."},{"field":"process.tty","type":"object","normalization":"","example":"","description":"Information about the controlling TTY device."},{"field":"process.tty.char_device.major","type":"long","normalization":"","example":4,"description":"The TTY character device's major number."},{"field":"process.tty.char_device.minor","type":"long","normalization":"","example":1,"description":"The TTY character device's minor number."},{"field":"process.tty.columns","type":"long","normalization":"","example":80,"description":"The number of character columns per line. e.g terminal width"},{"field":"process.tty.rows","type":"long","normalization":"","example":24,"description":"The number of character rows in the terminal. e.g terminal height"},{"field":"process.uptime","type":"long","normalization":"","example":1325,"description":"Seconds the process has been up."},{"field":"process.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"process.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"process.working_directory","type":"keyword","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"process.working_directory.text","type":"match_only_text","normalization":"","example":"/home/alice","description":"The working directory of the process."},{"field":"registry.data.bytes","type":"keyword","normalization":"","example":"ZQBuAC0AVQBTAAAAZQBuAAAAAAA=","description":"Original bytes written with base64 encoding."},{"field":"registry.data.strings","type":"wildcard","normalization":"array","example":"[\"C:\\rta\\red_ttp\\bin\\myapp.exe\"]","description":"List of strings representing what was written to the registry."},{"field":"registry.data.type","type":"keyword","normalization":"","example":"REG_SZ","description":"Standard registry type for encoding contents"},{"field":"registry.hive","type":"keyword","normalization":"","example":"HKLM","description":"Abbreviated name for the hive."},{"field":"registry.key","type":"keyword","normalization":"","example":"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe","description":"Hive-relative path of keys."},{"field":"registry.path","type":"keyword","normalization":"","example":"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe\\Debugger","description":"Full path, including hive, key and value"},{"field":"registry.value","type":"keyword","normalization":"","example":"Debugger","description":"Name of the value written."},{"field":"related.hash","type":"keyword","normalization":"array","example":"","description":"All the hashes seen on your event."},{"field":"related.hosts","type":"keyword","normalization":"array","example":"","description":"All the host identifiers seen on your event."},{"field":"related.ip","type":"ip","normalization":"array","example":"","description":"All of the IPs seen on your event."},{"field":"related.user","type":"keyword","normalization":"array","example":"","description":"All the user names or other user identifiers seen on the event."},{"field":"rule.author","type":"keyword","normalization":"array","example":["Star-Lord"],"description":"Rule author"},{"field":"rule.category","type":"keyword","normalization":"","example":"Attempted Information Leak","description":"Rule category"},{"field":"rule.description","type":"keyword","normalization":"","example":"Block requests to public DNS over HTTPS / TLS protocols","description":"Rule description"},{"field":"rule.id","type":"keyword","normalization":"","example":101,"description":"Rule ID"},{"field":"rule.license","type":"keyword","normalization":"","example":"Apache 2.0","description":"Rule license"},{"field":"rule.name","type":"keyword","normalization":"","example":"BLOCK_DNS_over_TLS","description":"Rule name"},{"field":"rule.reference","type":"keyword","normalization":"","example":"https://en.wikipedia.org/wiki/DNS_over_TLS","description":"Rule reference URL"},{"field":"rule.ruleset","type":"keyword","normalization":"","example":"Standard_Protocol_Filters","description":"Rule ruleset"},{"field":"rule.uuid","type":"keyword","normalization":"","example":1100110011,"description":"Rule UUID"},{"field":"rule.version","type":"keyword","normalization":"","example":1.1,"description":"Rule version"},{"field":"server.address","type":"keyword","normalization":"","example":"","description":"Server network address."},{"field":"server.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"server.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"server.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"server.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the server to the client."},{"field":"server.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the server."},{"field":"server.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"server.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"server.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"server.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"server.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"server.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"server.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"server.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"server.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"server.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"server.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"server.ip","type":"ip","normalization":"","example":"","description":"IP address of the server."},{"field":"server.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the server."},{"field":"server.nat.ip","type":"ip","normalization":"","example":"","description":"Server NAT ip"},{"field":"server.nat.port","type":"long","normalization":"","example":"","description":"Server NAT port"},{"field":"server.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the server to the client."},{"field":"server.port","type":"long","normalization":"","example":"","description":"Port of the server."},{"field":"server.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered server domain, stripped of the subdomain."},{"field":"server.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"server.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"server.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"server.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"server.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"server.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"server.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"server.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"server.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"server.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"server.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"server.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"server.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"server.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"service.address","type":"keyword","normalization":"","example":"172.26.0.2:5432","description":"Address of this service."},{"field":"service.environment","type":"keyword","normalization":"","example":"production","description":"Environment of the service."},{"field":"service.ephemeral_id","type":"keyword","normalization":"","example":"8a4f500f","description":"Ephemeral identifier of this service."},{"field":"service.id","type":"keyword","normalization":"","example":"d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6","description":"Unique identifier of the running service."},{"field":"service.name","type":"keyword","normalization":"","example":"elasticsearch-metrics","description":"Name of the service."},{"field":"service.node.name","type":"keyword","normalization":"","example":"instance-0000000016","description":"Name of the service node."},{"field":"service.node.role","type":"keyword","normalization":"","example":"background_tasks","description":"Deprecated role (singular) of the service node."},{"field":"service.node.roles","type":"keyword","normalization":"array","example":["ui","background_tasks"],"description":"Roles of the service node."},{"field":"service.origin.address","type":"keyword","normalization":"","example":"172.26.0.2:5432","description":"Address of this service."},{"field":"service.origin.environment","type":"keyword","normalization":"","example":"production","description":"Environment of the service."},{"field":"service.origin.ephemeral_id","type":"keyword","normalization":"","example":"8a4f500f","description":"Ephemeral identifier of this service."},{"field":"service.origin.id","type":"keyword","normalization":"","example":"d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6","description":"Unique identifier of the running service."},{"field":"service.origin.name","type":"keyword","normalization":"","example":"elasticsearch-metrics","description":"Name of the service."},{"field":"service.origin.node.name","type":"keyword","normalization":"","example":"instance-0000000016","description":"Name of the service node."},{"field":"service.origin.node.role","type":"keyword","normalization":"","example":"background_tasks","description":"Deprecated role (singular) of the service node."},{"field":"service.origin.node.roles","type":"keyword","normalization":"array","example":["ui","background_tasks"],"description":"Roles of the service node."},{"field":"service.origin.state","type":"keyword","normalization":"","example":"","description":"Current state of the service."},{"field":"service.origin.type","type":"keyword","normalization":"","example":"elasticsearch","description":"The type of the service."},{"field":"service.origin.version","type":"keyword","normalization":"","example":"3.2.4","description":"Version of the service."},{"field":"service.state","type":"keyword","normalization":"","example":"","description":"Current state of the service."},{"field":"service.target.address","type":"keyword","normalization":"","example":"172.26.0.2:5432","description":"Address of this service."},{"field":"service.target.environment","type":"keyword","normalization":"","example":"production","description":"Environment of the service."},{"field":"service.target.ephemeral_id","type":"keyword","normalization":"","example":"8a4f500f","description":"Ephemeral identifier of this service."},{"field":"service.target.id","type":"keyword","normalization":"","example":"d37e5ebfe0ae6c4972dbe9f0174a1637bb8247f6","description":"Unique identifier of the running service."},{"field":"service.target.name","type":"keyword","normalization":"","example":"elasticsearch-metrics","description":"Name of the service."},{"field":"service.target.node.name","type":"keyword","normalization":"","example":"instance-0000000016","description":"Name of the service node."},{"field":"service.target.node.role","type":"keyword","normalization":"","example":"background_tasks","description":"Deprecated role (singular) of the service node."},{"field":"service.target.node.roles","type":"keyword","normalization":"array","example":["ui","background_tasks"],"description":"Roles of the service node."},{"field":"service.target.state","type":"keyword","normalization":"","example":"","description":"Current state of the service."},{"field":"service.target.type","type":"keyword","normalization":"","example":"elasticsearch","description":"The type of the service."},{"field":"service.target.version","type":"keyword","normalization":"","example":"3.2.4","description":"Version of the service."},{"field":"service.type","type":"keyword","normalization":"","example":"elasticsearch","description":"The type of the service."},{"field":"service.version","type":"keyword","normalization":"","example":"3.2.4","description":"Version of the service."},{"field":"source.address","type":"keyword","normalization":"","example":"","description":"Source network address."},{"field":"source.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"source.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"source.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"source.bytes","type":"long","normalization":"","example":184,"description":"Bytes sent from the source to the destination."},{"field":"source.domain","type":"keyword","normalization":"","example":"foo.example.com","description":"The domain name of the source."},{"field":"source.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"source.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"source.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"source.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"source.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"source.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"source.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"source.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"source.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"source.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"source.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"source.ip","type":"ip","normalization":"","example":"","description":"IP address of the source."},{"field":"source.mac","type":"keyword","normalization":"","example":"00-00-5E-00-53-23","description":"MAC address of the source."},{"field":"source.nat.ip","type":"ip","normalization":"","example":"","description":"Source NAT ip"},{"field":"source.nat.port","type":"long","normalization":"","example":"","description":"Source NAT port"},{"field":"source.packets","type":"long","normalization":"","example":12,"description":"Packets sent from the source to the destination."},{"field":"source.port","type":"long","normalization":"","example":"","description":"Port of the source."},{"field":"source.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered source domain, stripped of the subdomain."},{"field":"source.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"source.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"source.user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"source.user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"source.user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"source.user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"source.user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"source.user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"source.user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"source.user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"source.user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"source.user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"source.user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"source.user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"span.id","type":"keyword","normalization":"","example":"3ff9a8981b7ccd5a","description":"Unique identifier of the span within the scope of its trace."},{"field":"threat.enrichments","type":"nested","normalization":"array","example":"","description":"List of objects containing indicators enriching the event."},{"field":"threat.enrichments.indicator","type":"object","normalization":"","example":"","description":"Object containing indicators enriching the event."},{"field":"threat.enrichments.indicator.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"threat.enrichments.indicator.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.enrichments.indicator.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.enrichments.indicator.confidence","type":"keyword","normalization":"","example":"Medium","description":"Indicator confidence rating"},{"field":"threat.enrichments.indicator.description","type":"keyword","normalization":"","example":"IP x.x.x.x was observed delivering the Angler EK.","description":"Indicator description"},{"field":"threat.enrichments.indicator.email.address","type":"keyword","normalization":"","example":"phish@example.com","description":"Indicator email address"},{"field":"threat.enrichments.indicator.file.accessed","type":"date","normalization":"","example":"","description":"Last time the file was accessed."},{"field":"threat.enrichments.indicator.file.attributes","type":"keyword","normalization":"array","example":["readonly","system"],"description":"Array of file attributes."},{"field":"threat.enrichments.indicator.file.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"threat.enrichments.indicator.file.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"threat.enrichments.indicator.file.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"threat.enrichments.indicator.file.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"threat.enrichments.indicator.file.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"threat.enrichments.indicator.file.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"threat.enrichments.indicator.file.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"threat.enrichments.indicator.file.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"threat.enrichments.indicator.file.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"threat.enrichments.indicator.file.created","type":"date","normalization":"","example":"","description":"File creation time."},{"field":"threat.enrichments.indicator.file.ctime","type":"date","normalization":"","example":"","description":"Last time the file attributes or metadata changed."},{"field":"threat.enrichments.indicator.file.device","type":"keyword","normalization":"","example":"sda","description":"Device that is the source of the file."},{"field":"threat.enrichments.indicator.file.directory","type":"keyword","normalization":"","example":"/home/alice","description":"Directory where the file is located."},{"field":"threat.enrichments.indicator.file.drive_letter","type":"keyword","normalization":"","example":"C","description":"Drive letter where the file is located."},{"field":"threat.enrichments.indicator.file.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"threat.enrichments.indicator.file.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"threat.enrichments.indicator.file.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"threat.enrichments.indicator.file.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"threat.enrichments.indicator.file.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.enrichments.indicator.file.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.enrichments.indicator.file.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"threat.enrichments.indicator.file.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"threat.enrichments.indicator.file.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"threat.enrichments.indicator.file.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"threat.enrichments.indicator.file.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"threat.enrichments.indicator.file.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"threat.enrichments.indicator.file.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.enrichments.indicator.file.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"threat.enrichments.indicator.file.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"threat.enrichments.indicator.file.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"threat.enrichments.indicator.file.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"threat.enrichments.indicator.file.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"threat.enrichments.indicator.file.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"threat.enrichments.indicator.file.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"threat.enrichments.indicator.file.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"threat.enrichments.indicator.file.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"threat.enrichments.indicator.file.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"threat.enrichments.indicator.file.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"threat.enrichments.indicator.file.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"threat.enrichments.indicator.file.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"threat.enrichments.indicator.file.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"threat.enrichments.indicator.file.extension","type":"keyword","normalization":"","example":"png","description":"File extension, excluding the leading dot."},{"field":"threat.enrichments.indicator.file.fork_name","type":"keyword","normalization":"","example":"Zone.Identifer","description":"A fork is additional data associated with a filesystem object."},{"field":"threat.enrichments.indicator.file.gid","type":"keyword","normalization":"","example":1001,"description":"Primary group ID (GID) of the file."},{"field":"threat.enrichments.indicator.file.group","type":"keyword","normalization":"","example":"alice","description":"Primary group name of the file."},{"field":"threat.enrichments.indicator.file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"threat.enrichments.indicator.file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"threat.enrichments.indicator.file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"threat.enrichments.indicator.file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"threat.enrichments.indicator.file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"threat.enrichments.indicator.file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"threat.enrichments.indicator.file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"threat.enrichments.indicator.file.inode","type":"keyword","normalization":"","example":256383,"description":"Inode representing the file in the filesystem."},{"field":"threat.enrichments.indicator.file.mime_type","type":"keyword","normalization":"","example":"","description":"Media type of file, document, or arrangement of bytes."},{"field":"threat.enrichments.indicator.file.mode","type":"keyword","normalization":"","example":"0640","description":"Mode of the file in octal representation."},{"field":"threat.enrichments.indicator.file.mtime","type":"date","normalization":"","example":"","description":"Last time the file content was modified."},{"field":"threat.enrichments.indicator.file.name","type":"keyword","normalization":"","example":"example.png","description":"Name of the file including the extension, without the directory."},{"field":"threat.enrichments.indicator.file.owner","type":"keyword","normalization":"","example":"alice","description":"File owner's username."},{"field":"threat.enrichments.indicator.file.path","type":"keyword","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.enrichments.indicator.file.path.text","type":"match_only_text","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.enrichments.indicator.file.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"threat.enrichments.indicator.file.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"threat.enrichments.indicator.file.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"threat.enrichments.indicator.file.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.enrichments.indicator.file.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.enrichments.indicator.file.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.enrichments.indicator.file.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"threat.enrichments.indicator.file.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"threat.enrichments.indicator.file.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.enrichments.indicator.file.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.enrichments.indicator.file.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"threat.enrichments.indicator.file.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"threat.enrichments.indicator.file.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"threat.enrichments.indicator.file.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"threat.enrichments.indicator.file.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"threat.enrichments.indicator.file.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.enrichments.indicator.file.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"threat.enrichments.indicator.file.size","type":"long","normalization":"","example":16384,"description":"File size in bytes."},{"field":"threat.enrichments.indicator.file.target_path","type":"keyword","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.enrichments.indicator.file.target_path.text","type":"match_only_text","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.enrichments.indicator.file.type","type":"keyword","normalization":"","example":"file","description":"File type (file, dir, or symlink)."},{"field":"threat.enrichments.indicator.file.uid","type":"keyword","normalization":"","example":1001,"description":"The user ID (UID) or security identifier (SID) of the file owner."},{"field":"threat.enrichments.indicator.file.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.enrichments.indicator.file.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.enrichments.indicator.file.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.file.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.enrichments.indicator.file.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.file.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.enrichments.indicator.file.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.enrichments.indicator.file.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.enrichments.indicator.file.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.enrichments.indicator.file.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.enrichments.indicator.file.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.enrichments.indicator.file.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.enrichments.indicator.file.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.enrichments.indicator.file.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.enrichments.indicator.file.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.enrichments.indicator.file.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.enrichments.indicator.file.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.file.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.enrichments.indicator.file.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.enrichments.indicator.file.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.file.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.enrichments.indicator.first_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was first reported."},{"field":"threat.enrichments.indicator.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"threat.enrichments.indicator.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"threat.enrichments.indicator.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"threat.enrichments.indicator.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"threat.enrichments.indicator.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"threat.enrichments.indicator.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"threat.enrichments.indicator.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"threat.enrichments.indicator.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"threat.enrichments.indicator.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"threat.enrichments.indicator.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"threat.enrichments.indicator.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"threat.enrichments.indicator.ip","type":"ip","normalization":"","example":"1.2.3.4","description":"Indicator IP address"},{"field":"threat.enrichments.indicator.last_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last reported."},{"field":"threat.enrichments.indicator.marking.tlp","type":"keyword","normalization":"","example":"CLEAR","description":"Indicator TLP marking"},{"field":"threat.enrichments.indicator.marking.tlp_version","type":"keyword","normalization":"","example":2,"description":"Indicator TLP version"},{"field":"threat.enrichments.indicator.modified_at","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last updated."},{"field":"threat.enrichments.indicator.name","type":"keyword","normalization":"","example":"5.2.75.227","description":"Indicator display name"},{"field":"threat.enrichments.indicator.port","type":"long","normalization":"","example":443,"description":"Indicator port"},{"field":"threat.enrichments.indicator.provider","type":"keyword","normalization":"","example":"lrz_urlhaus","description":"Indicator provider"},{"field":"threat.enrichments.indicator.reference","type":"keyword","normalization":"","example":"https://system.example.com/indicator/0001234","description":"Indicator reference URL"},{"field":"threat.enrichments.indicator.registry.data.bytes","type":"keyword","normalization":"","example":"ZQBuAC0AVQBTAAAAZQBuAAAAAAA=","description":"Original bytes written with base64 encoding."},{"field":"threat.enrichments.indicator.registry.data.strings","type":"wildcard","normalization":"array","example":"[\"C:\\rta\\red_ttp\\bin\\myapp.exe\"]","description":"List of strings representing what was written to the registry."},{"field":"threat.enrichments.indicator.registry.data.type","type":"keyword","normalization":"","example":"REG_SZ","description":"Standard registry type for encoding contents"},{"field":"threat.enrichments.indicator.registry.hive","type":"keyword","normalization":"","example":"HKLM","description":"Abbreviated name for the hive."},{"field":"threat.enrichments.indicator.registry.key","type":"keyword","normalization":"","example":"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe","description":"Hive-relative path of keys."},{"field":"threat.enrichments.indicator.registry.path","type":"keyword","normalization":"","example":"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe\\Debugger","description":"Full path, including hive, key and value"},{"field":"threat.enrichments.indicator.registry.value","type":"keyword","normalization":"","example":"Debugger","description":"Name of the value written."},{"field":"threat.enrichments.indicator.scanner_stats","type":"long","normalization":"","example":4,"description":"Scanner statistics"},{"field":"threat.enrichments.indicator.sightings","type":"long","normalization":"","example":20,"description":"Number of times indicator observed"},{"field":"threat.enrichments.indicator.type","type":"keyword","normalization":"","example":"ipv4-addr","description":"Type of indicator"},{"field":"threat.enrichments.indicator.url.domain","type":"keyword","normalization":"","example":"www.elastic.co","description":"Domain of the url."},{"field":"threat.enrichments.indicator.url.extension","type":"keyword","normalization":"","example":"png","description":"File extension from the request url, excluding the leading dot."},{"field":"threat.enrichments.indicator.url.fragment","type":"keyword","normalization":"","example":"","description":"Portion of the url after the `#`."},{"field":"threat.enrichments.indicator.url.full","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.enrichments.indicator.url.full.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.enrichments.indicator.url.original","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.enrichments.indicator.url.original.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.enrichments.indicator.url.password","type":"keyword","normalization":"","example":"","description":"Password of the request."},{"field":"threat.enrichments.indicator.url.path","type":"wildcard","normalization":"","example":"","description":"Path of the request, such as \"/search\"."},{"field":"threat.enrichments.indicator.url.port","type":"long","normalization":"","example":443,"description":"Port of the request, such as 443."},{"field":"threat.enrichments.indicator.url.query","type":"keyword","normalization":"","example":"","description":"Query string of the request."},{"field":"threat.enrichments.indicator.url.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered url domain, stripped of the subdomain."},{"field":"threat.enrichments.indicator.url.scheme","type":"keyword","normalization":"","example":"https","description":"Scheme of the url."},{"field":"threat.enrichments.indicator.url.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"threat.enrichments.indicator.url.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"threat.enrichments.indicator.url.username","type":"keyword","normalization":"","example":"","description":"Username of the request."},{"field":"threat.enrichments.indicator.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.enrichments.indicator.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.enrichments.indicator.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.enrichments.indicator.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.enrichments.indicator.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.enrichments.indicator.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.enrichments.indicator.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.enrichments.indicator.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.enrichments.indicator.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.enrichments.indicator.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.enrichments.indicator.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.enrichments.indicator.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.enrichments.indicator.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.enrichments.indicator.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.enrichments.indicator.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.enrichments.indicator.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.enrichments.indicator.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.enrichments.indicator.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.enrichments.indicator.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.enrichments.matched.atomic","type":"keyword","normalization":"","example":"bad-domain.com","description":"Matched indicator value"},{"field":"threat.enrichments.matched.field","type":"keyword","normalization":"","example":"file.hash.sha256","description":"Matched indicator field"},{"field":"threat.enrichments.matched.id","type":"keyword","normalization":"","example":"ff93aee5-86a1-4a61-b0e6-0cdc313d01b5","description":"Matched indicator identifier"},{"field":"threat.enrichments.matched.index","type":"keyword","normalization":"","example":"filebeat-8.0.0-2021.05.23-000011","description":"Matched indicator index"},{"field":"threat.enrichments.matched.occurred","type":"date","normalization":"","example":"2021-10-05T17:00:58.326Z","description":"Date of match"},{"field":"threat.enrichments.matched.type","type":"keyword","normalization":"","example":"indicator_match_rule","description":"Type of indicator match"},{"field":"threat.feed.dashboard_id","type":"keyword","normalization":"","example":"5ba16340-72e6-11eb-a3e3-b3cc7c78a70f","description":"Feed dashboard ID."},{"field":"threat.feed.description","type":"keyword","normalization":"","example":"Threat feed from the AlienVault Open Threat eXchange network.","description":"Description of the threat feed."},{"field":"threat.feed.name","type":"keyword","normalization":"","example":"AlienVault OTX","description":"Name of the threat feed."},{"field":"threat.feed.reference","type":"keyword","normalization":"","example":"https://otx.alienvault.com","description":"Reference for the threat feed."},{"field":"threat.framework","type":"keyword","normalization":"","example":"MITRE ATT&CK","description":"Threat classification framework."},{"field":"threat.group.alias","type":"keyword","normalization":"array","example":["Magecart Group 6"],"description":"Alias of the group."},{"field":"threat.group.id","type":"keyword","normalization":"","example":"G0037","description":"ID of the group."},{"field":"threat.group.name","type":"keyword","normalization":"","example":"FIN6","description":"Name of the group."},{"field":"threat.group.reference","type":"keyword","normalization":"","example":"https://attack.mitre.org/groups/G0037/","description":"Reference URL of the group."},{"field":"threat.indicator.as.number","type":"long","normalization":"","example":15169,"description":"Unique number allocated to the autonomous system."},{"field":"threat.indicator.as.organization.name","type":"keyword","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.indicator.as.organization.name.text","type":"match_only_text","normalization":"","example":"Google LLC","description":"Organization name."},{"field":"threat.indicator.confidence","type":"keyword","normalization":"","example":"Medium","description":"Indicator confidence rating"},{"field":"threat.indicator.description","type":"keyword","normalization":"","example":"IP x.x.x.x was observed delivering the Angler EK.","description":"Indicator description"},{"field":"threat.indicator.email.address","type":"keyword","normalization":"","example":"phish@example.com","description":"Indicator email address"},{"field":"threat.indicator.file.accessed","type":"date","normalization":"","example":"","description":"Last time the file was accessed."},{"field":"threat.indicator.file.attributes","type":"keyword","normalization":"array","example":["readonly","system"],"description":"Array of file attributes."},{"field":"threat.indicator.file.code_signature.digest_algorithm","type":"keyword","normalization":"","example":"sha256","description":"Hashing algorithm used to sign the process."},{"field":"threat.indicator.file.code_signature.exists","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if a signature is present."},{"field":"threat.indicator.file.code_signature.signing_id","type":"keyword","normalization":"","example":"com.apple.xpc.proxy","description":"The identifier used to sign the process."},{"field":"threat.indicator.file.code_signature.status","type":"keyword","normalization":"","example":"ERROR_UNTRUSTED_ROOT","description":"Additional information about the certificate status."},{"field":"threat.indicator.file.code_signature.subject_name","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Subject name of the code signer"},{"field":"threat.indicator.file.code_signature.team_id","type":"keyword","normalization":"","example":"EQHXZ8M8AV","description":"The team identifier used to sign the process."},{"field":"threat.indicator.file.code_signature.timestamp","type":"date","normalization":"","example":"2021-01-01T12:10:30Z","description":"When the signature was generated and signed."},{"field":"threat.indicator.file.code_signature.trusted","type":"boolean","normalization":"","example":true,"description":"Stores the trust status of the certificate chain."},{"field":"threat.indicator.file.code_signature.valid","type":"boolean","normalization":"","example":true,"description":"Boolean to capture if the digital signature is verified against the binary content."},{"field":"threat.indicator.file.created","type":"date","normalization":"","example":"","description":"File creation time."},{"field":"threat.indicator.file.ctime","type":"date","normalization":"","example":"","description":"Last time the file attributes or metadata changed."},{"field":"threat.indicator.file.device","type":"keyword","normalization":"","example":"sda","description":"Device that is the source of the file."},{"field":"threat.indicator.file.directory","type":"keyword","normalization":"","example":"/home/alice","description":"Directory where the file is located."},{"field":"threat.indicator.file.drive_letter","type":"keyword","normalization":"","example":"C","description":"Drive letter where the file is located."},{"field":"threat.indicator.file.elf.architecture","type":"keyword","normalization":"","example":"x86-64","description":"Machine architecture of the ELF file."},{"field":"threat.indicator.file.elf.byte_order","type":"keyword","normalization":"","example":"Little Endian","description":"Byte sequence of ELF file."},{"field":"threat.indicator.file.elf.cpu_type","type":"keyword","normalization":"","example":"Intel","description":"CPU type of the ELF file."},{"field":"threat.indicator.file.elf.creation_date","type":"date","normalization":"","example":"","description":"Build or compile date."},{"field":"threat.indicator.file.elf.exports","type":"flattened","normalization":"array","example":"","description":"List of exported element names and types."},{"field":"threat.indicator.file.elf.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in an ELF file."},{"field":"threat.indicator.file.elf.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.indicator.file.elf.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.elf.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.elf.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.indicator.file.elf.header.abi_version","type":"keyword","normalization":"","example":"","description":"Version of the ELF Application Binary Interface (ABI)."},{"field":"threat.indicator.file.elf.header.class","type":"keyword","normalization":"","example":"","description":"Header class of the ELF file."},{"field":"threat.indicator.file.elf.header.data","type":"keyword","normalization":"","example":"","description":"Data table of the ELF header."},{"field":"threat.indicator.file.elf.header.entrypoint","type":"long","normalization":"","example":"","description":"Header entrypoint of the ELF file."},{"field":"threat.indicator.file.elf.header.object_version","type":"keyword","normalization":"","example":"","description":"0x1\" for original ELF files."},{"field":"threat.indicator.file.elf.header.os_abi","type":"keyword","normalization":"","example":"","description":"Application Binary Interface (ABI) of the Linux OS."},{"field":"threat.indicator.file.elf.header.type","type":"keyword","normalization":"","example":"","description":"Header type of the ELF file."},{"field":"threat.indicator.file.elf.header.version","type":"keyword","normalization":"","example":"","description":"Version of the ELF header."},{"field":"threat.indicator.file.elf.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in an ELF file."},{"field":"threat.indicator.file.elf.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.indicator.file.elf.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.elf.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.elf.sections","type":"nested","normalization":"array","example":"","description":"Section information of the ELF file."},{"field":"threat.indicator.file.elf.sections.chi2","type":"long","normalization":"","example":"","description":"Chi-square probability distribution of the section."},{"field":"threat.indicator.file.elf.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.indicator.file.elf.sections.flags","type":"keyword","normalization":"","example":"","description":"ELF Section List flags."},{"field":"threat.indicator.file.elf.sections.name","type":"keyword","normalization":"","example":"","description":"ELF Section List name."},{"field":"threat.indicator.file.elf.sections.physical_offset","type":"keyword","normalization":"","example":"","description":"ELF Section List offset."},{"field":"threat.indicator.file.elf.sections.physical_size","type":"long","normalization":"","example":"","description":"ELF Section List physical size."},{"field":"threat.indicator.file.elf.sections.type","type":"keyword","normalization":"","example":"","description":"ELF Section List type."},{"field":"threat.indicator.file.elf.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.indicator.file.elf.sections.virtual_address","type":"long","normalization":"","example":"","description":"ELF Section List virtual address."},{"field":"threat.indicator.file.elf.sections.virtual_size","type":"long","normalization":"","example":"","description":"ELF Section List virtual size."},{"field":"threat.indicator.file.elf.segments","type":"nested","normalization":"array","example":"","description":"ELF object segment list."},{"field":"threat.indicator.file.elf.segments.sections","type":"keyword","normalization":"","example":"","description":"ELF object segment sections."},{"field":"threat.indicator.file.elf.segments.type","type":"keyword","normalization":"","example":"","description":"ELF object segment type."},{"field":"threat.indicator.file.elf.shared_libraries","type":"keyword","normalization":"array","example":"","description":"List of shared libraries used by this ELF object."},{"field":"threat.indicator.file.elf.telfhash","type":"keyword","normalization":"","example":"","description":"telfhash hash for ELF file."},{"field":"threat.indicator.file.extension","type":"keyword","normalization":"","example":"png","description":"File extension, excluding the leading dot."},{"field":"threat.indicator.file.fork_name","type":"keyword","normalization":"","example":"Zone.Identifer","description":"A fork is additional data associated with a filesystem object."},{"field":"threat.indicator.file.gid","type":"keyword","normalization":"","example":1001,"description":"Primary group ID (GID) of the file."},{"field":"threat.indicator.file.group","type":"keyword","normalization":"","example":"alice","description":"Primary group name of the file."},{"field":"threat.indicator.file.hash.md5","type":"keyword","normalization":"","example":"","description":"MD5 hash."},{"field":"threat.indicator.file.hash.sha1","type":"keyword","normalization":"","example":"","description":"SHA1 hash."},{"field":"threat.indicator.file.hash.sha256","type":"keyword","normalization":"","example":"","description":"SHA256 hash."},{"field":"threat.indicator.file.hash.sha384","type":"keyword","normalization":"","example":"","description":"SHA384 hash."},{"field":"threat.indicator.file.hash.sha512","type":"keyword","normalization":"","example":"","description":"SHA512 hash."},{"field":"threat.indicator.file.hash.ssdeep","type":"keyword","normalization":"","example":"","description":"SSDEEP hash."},{"field":"threat.indicator.file.hash.tlsh","type":"keyword","normalization":"","example":"","description":"TLSH hash."},{"field":"threat.indicator.file.inode","type":"keyword","normalization":"","example":256383,"description":"Inode representing the file in the filesystem."},{"field":"threat.indicator.file.mime_type","type":"keyword","normalization":"","example":"","description":"Media type of file, document, or arrangement of bytes."},{"field":"threat.indicator.file.mode","type":"keyword","normalization":"","example":"0640","description":"Mode of the file in octal representation."},{"field":"threat.indicator.file.mtime","type":"date","normalization":"","example":"","description":"Last time the file content was modified."},{"field":"threat.indicator.file.name","type":"keyword","normalization":"","example":"example.png","description":"Name of the file including the extension, without the directory."},{"field":"threat.indicator.file.owner","type":"keyword","normalization":"","example":"alice","description":"File owner's username."},{"field":"threat.indicator.file.path","type":"keyword","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.indicator.file.path.text","type":"match_only_text","normalization":"","example":"/home/alice/example.png","description":"Full path to the file, including the file name."},{"field":"threat.indicator.file.pe.architecture","type":"keyword","normalization":"","example":"x64","description":"CPU architecture target for the file."},{"field":"threat.indicator.file.pe.company","type":"keyword","normalization":"","example":"Microsoft Corporation","description":"Internal company name of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.description","type":"keyword","normalization":"","example":"Paint","description":"Internal description of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.file_version","type":"keyword","normalization":"","example":"6.3.9600.17415","description":"Process name."},{"field":"threat.indicator.file.pe.go_import_hash","type":"keyword","normalization":"","example":"10bddcb4cee42080f76c88d9ff964491","description":"A hash of the Go language imports in a PE file."},{"field":"threat.indicator.file.pe.go_imports","type":"flattened","normalization":"","example":"","description":"List of imported Go language element names and types."},{"field":"threat.indicator.file.pe.go_imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.pe.go_imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of Go imports."},{"field":"threat.indicator.file.pe.go_stripped","type":"boolean","normalization":"","example":"","description":"Whether the file is a stripped or obfuscated Go executable."},{"field":"threat.indicator.file.pe.imphash","type":"keyword","normalization":"","example":"0c6803c4e922103c4dca5963aad36ddf","description":"A hash of the imports in a PE file."},{"field":"threat.indicator.file.pe.import_hash","type":"keyword","normalization":"","example":"d41d8cd98f00b204e9800998ecf8427e","description":"A hash of the imports in a PE file."},{"field":"threat.indicator.file.pe.imports","type":"flattened","normalization":"array","example":"","description":"List of imported element names and types."},{"field":"threat.indicator.file.pe.imports_names_entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.pe.imports_names_var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the list of imported element names and types."},{"field":"threat.indicator.file.pe.original_file_name","type":"keyword","normalization":"","example":"MSPAINT.EXE","description":"Internal name of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.pehash","type":"keyword","normalization":"","example":"73ff189b63cd6be375a7ff25179a38d347651975","description":"A hash of the PE header and data from one or more PE sections."},{"field":"threat.indicator.file.pe.product","type":"keyword","normalization":"","example":"Microsoft® Windows® Operating System","description":"Internal product name of the file, provided at compile-time."},{"field":"threat.indicator.file.pe.sections","type":"nested","normalization":"array","example":"","description":"Section information of the PE file."},{"field":"threat.indicator.file.pe.sections.entropy","type":"long","normalization":"","example":"","description":"Shannon entropy calculation from the section."},{"field":"threat.indicator.file.pe.sections.name","type":"keyword","normalization":"","example":"","description":"PE Section List name."},{"field":"threat.indicator.file.pe.sections.physical_size","type":"long","normalization":"","example":"","description":"PE Section List physical size."},{"field":"threat.indicator.file.pe.sections.var_entropy","type":"long","normalization":"","example":"","description":"Variance for Shannon entropy calculation from the section."},{"field":"threat.indicator.file.pe.sections.virtual_size","type":"long","normalization":"","example":"","description":"PE Section List virtual size. This is always the same as `physical_size`."},{"field":"threat.indicator.file.size","type":"long","normalization":"","example":16384,"description":"File size in bytes."},{"field":"threat.indicator.file.target_path","type":"keyword","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.indicator.file.target_path.text","type":"match_only_text","normalization":"","example":"","description":"Target path for symlinks."},{"field":"threat.indicator.file.type","type":"keyword","normalization":"","example":"file","description":"File type (file, dir, or symlink)."},{"field":"threat.indicator.file.uid","type":"keyword","normalization":"","example":1001,"description":"The user ID (UID) or security identifier (SID) of the file owner."},{"field":"threat.indicator.file.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.indicator.file.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.indicator.file.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.indicator.file.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.indicator.file.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.file.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.indicator.file.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.indicator.file.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.indicator.file.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.indicator.file.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.indicator.file.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.indicator.file.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.indicator.file.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.indicator.file.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.indicator.file.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.indicator.file.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.indicator.file.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.indicator.file.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.indicator.file.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.indicator.file.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.file.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.indicator.first_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was first reported."},{"field":"threat.indicator.geo.city_name","type":"keyword","normalization":"","example":"Montreal","description":"City name."},{"field":"threat.indicator.geo.continent_code","type":"keyword","normalization":"","example":"NA","description":"Continent code."},{"field":"threat.indicator.geo.continent_name","type":"keyword","normalization":"","example":"North America","description":"Name of the continent."},{"field":"threat.indicator.geo.country_iso_code","type":"keyword","normalization":"","example":"CA","description":"Country ISO code."},{"field":"threat.indicator.geo.country_name","type":"keyword","normalization":"","example":"Canada","description":"Country name."},{"field":"threat.indicator.geo.location","type":"geo_point","normalization":"","example":{"lon":-73.61483,"lat":45.505918},"description":"Longitude and latitude."},{"field":"threat.indicator.geo.name","type":"keyword","normalization":"","example":"boston-dc","description":"User-defined description of a location."},{"field":"threat.indicator.geo.postal_code","type":"keyword","normalization":"","example":94040,"description":"Postal code."},{"field":"threat.indicator.geo.region_iso_code","type":"keyword","normalization":"","example":"CA-QC","description":"Region ISO code."},{"field":"threat.indicator.geo.region_name","type":"keyword","normalization":"","example":"Quebec","description":"Region name."},{"field":"threat.indicator.geo.timezone","type":"keyword","normalization":"","example":"America/Argentina/Buenos_Aires","description":"Time zone."},{"field":"threat.indicator.ip","type":"ip","normalization":"","example":"1.2.3.4","description":"Indicator IP address"},{"field":"threat.indicator.last_seen","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last reported."},{"field":"threat.indicator.marking.tlp","type":"keyword","normalization":"","example":"CLEAR","description":"Indicator TLP marking"},{"field":"threat.indicator.marking.tlp_version","type":"keyword","normalization":"","example":2,"description":"Indicator TLP version"},{"field":"threat.indicator.modified_at","type":"date","normalization":"","example":"2020-11-05T17:25:47.000Z","description":"Date/time indicator was last updated."},{"field":"threat.indicator.name","type":"keyword","normalization":"","example":"5.2.75.227","description":"Indicator display name"},{"field":"threat.indicator.port","type":"long","normalization":"","example":443,"description":"Indicator port"},{"field":"threat.indicator.provider","type":"keyword","normalization":"","example":"lrz_urlhaus","description":"Indicator provider"},{"field":"threat.indicator.reference","type":"keyword","normalization":"","example":"https://system.example.com/indicator/0001234","description":"Indicator reference URL"},{"field":"threat.indicator.registry.data.bytes","type":"keyword","normalization":"","example":"ZQBuAC0AVQBTAAAAZQBuAAAAAAA=","description":"Original bytes written with base64 encoding."},{"field":"threat.indicator.registry.data.strings","type":"wildcard","normalization":"array","example":"[\"C:\\rta\\red_ttp\\bin\\myapp.exe\"]","description":"List of strings representing what was written to the registry."},{"field":"threat.indicator.registry.data.type","type":"keyword","normalization":"","example":"REG_SZ","description":"Standard registry type for encoding contents"},{"field":"threat.indicator.registry.hive","type":"keyword","normalization":"","example":"HKLM","description":"Abbreviated name for the hive."},{"field":"threat.indicator.registry.key","type":"keyword","normalization":"","example":"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe","description":"Hive-relative path of keys."},{"field":"threat.indicator.registry.path","type":"keyword","normalization":"","example":"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\winword.exe\\Debugger","description":"Full path, including hive, key and value"},{"field":"threat.indicator.registry.value","type":"keyword","normalization":"","example":"Debugger","description":"Name of the value written."},{"field":"threat.indicator.scanner_stats","type":"long","normalization":"","example":4,"description":"Scanner statistics"},{"field":"threat.indicator.sightings","type":"long","normalization":"","example":20,"description":"Number of times indicator observed"},{"field":"threat.indicator.type","type":"keyword","normalization":"","example":"ipv4-addr","description":"Type of indicator"},{"field":"threat.indicator.url.domain","type":"keyword","normalization":"","example":"www.elastic.co","description":"Domain of the url."},{"field":"threat.indicator.url.extension","type":"keyword","normalization":"","example":"png","description":"File extension from the request url, excluding the leading dot."},{"field":"threat.indicator.url.fragment","type":"keyword","normalization":"","example":"","description":"Portion of the url after the `#`."},{"field":"threat.indicator.url.full","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.indicator.url.full.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"threat.indicator.url.original","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.indicator.url.original.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"threat.indicator.url.password","type":"keyword","normalization":"","example":"","description":"Password of the request."},{"field":"threat.indicator.url.path","type":"wildcard","normalization":"","example":"","description":"Path of the request, such as \"/search\"."},{"field":"threat.indicator.url.port","type":"long","normalization":"","example":443,"description":"Port of the request, such as 443."},{"field":"threat.indicator.url.query","type":"keyword","normalization":"","example":"","description":"Query string of the request."},{"field":"threat.indicator.url.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered url domain, stripped of the subdomain."},{"field":"threat.indicator.url.scheme","type":"keyword","normalization":"","example":"https","description":"Scheme of the url."},{"field":"threat.indicator.url.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"threat.indicator.url.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"threat.indicator.url.username","type":"keyword","normalization":"","example":"","description":"Username of the request."},{"field":"threat.indicator.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"threat.indicator.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"threat.indicator.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"threat.indicator.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"threat.indicator.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"threat.indicator.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"threat.indicator.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"threat.indicator.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"threat.indicator.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"threat.indicator.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"threat.indicator.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"threat.indicator.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"threat.indicator.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"threat.indicator.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"threat.indicator.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"threat.indicator.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"threat.indicator.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"threat.indicator.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"threat.indicator.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"threat.indicator.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"threat.software.alias","type":"keyword","normalization":"array","example":["X-Agent"],"description":"Alias of the software"},{"field":"threat.software.id","type":"keyword","normalization":"","example":"S0552","description":"ID of the software"},{"field":"threat.software.name","type":"keyword","normalization":"","example":"AdFind","description":"Name of the software."},{"field":"threat.software.platforms","type":"keyword","normalization":"array","example":["Windows"],"description":"Platforms of the software."},{"field":"threat.software.reference","type":"keyword","normalization":"","example":"https://attack.mitre.org/software/S0552/","description":"Software reference URL."},{"field":"threat.software.type","type":"keyword","normalization":"","example":"Tool","description":"Software type."},{"field":"threat.tactic.id","type":"keyword","normalization":"array","example":"TA0002","description":"Threat tactic id."},{"field":"threat.tactic.name","type":"keyword","normalization":"array","example":"Execution","description":"Threat tactic."},{"field":"threat.tactic.reference","type":"keyword","normalization":"array","example":"https://attack.mitre.org/tactics/TA0002/","description":"Threat tactic URL reference."},{"field":"threat.technique.id","type":"keyword","normalization":"array","example":"T1059","description":"Threat technique id."},{"field":"threat.technique.name","type":"keyword","normalization":"array","example":"Command and Scripting Interpreter","description":"Threat technique name."},{"field":"threat.technique.name.text","type":"match_only_text","normalization":"","example":"Command and Scripting Interpreter","description":"Threat technique name."},{"field":"threat.technique.reference","type":"keyword","normalization":"array","example":"https://attack.mitre.org/techniques/T1059/","description":"Threat technique URL reference."},{"field":"threat.technique.subtechnique.id","type":"keyword","normalization":"array","example":"T1059.001","description":"Threat subtechnique id."},{"field":"threat.technique.subtechnique.name","type":"keyword","normalization":"array","example":"PowerShell","description":"Threat subtechnique name."},{"field":"threat.technique.subtechnique.name.text","type":"match_only_text","normalization":"","example":"PowerShell","description":"Threat subtechnique name."},{"field":"threat.technique.subtechnique.reference","type":"keyword","normalization":"array","example":"https://attack.mitre.org/techniques/T1059/001/","description":"Threat subtechnique URL reference."},{"field":"tls.cipher","type":"keyword","normalization":"","example":"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256","description":"String indicating the cipher used during the current connection."},{"field":"tls.client.certificate","type":"keyword","normalization":"","example":"MII...","description":"PEM-encoded stand-alone certificate offered by the client."},{"field":"tls.client.certificate_chain","type":"keyword","normalization":"array","example":["MII...","MII..."],"description":"Array of PEM-encoded certificates that make up the certificate chain offered by the client."},{"field":"tls.client.hash.md5","type":"keyword","normalization":"","example":"0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC","description":"Certificate fingerprint using the MD5 digest of DER-encoded version of certificate offered by the client."},{"field":"tls.client.hash.sha1","type":"keyword","normalization":"","example":"9E393D93138888D288266C2D915214D1D1CCEB2A","description":"Certificate fingerprint using the SHA1 digest of DER-encoded version of certificate offered by the client."},{"field":"tls.client.hash.sha256","type":"keyword","normalization":"","example":"0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0","description":"Certificate fingerprint using the SHA256 digest of DER-encoded version of certificate offered by the client."},{"field":"tls.client.issuer","type":"keyword","normalization":"","example":"CN=Example Root CA, OU=Infrastructure Team, DC=example, DC=com","description":"Distinguished name of subject of the issuer of the x.509 certificate presented by the client."},{"field":"tls.client.ja3","type":"keyword","normalization":"","example":"d4e5b18d6b55c71272893221c96ba240","description":"A hash that identifies clients based on how they perform an SSL/TLS handshake."},{"field":"tls.client.not_after","type":"date","normalization":"","example":"2021-01-01T00:00:00.000Z","description":"Date/Time indicating when client certificate is no longer considered valid."},{"field":"tls.client.not_before","type":"date","normalization":"","example":"1970-01-01T00:00:00.000Z","description":"Date/Time indicating when client certificate is first considered valid."},{"field":"tls.client.server_name","type":"keyword","normalization":"","example":"www.elastic.co","description":"Hostname the client is trying to connect to. Also called the SNI."},{"field":"tls.client.subject","type":"keyword","normalization":"","example":"CN=myclient, OU=Documentation Team, DC=example, DC=com","description":"Distinguished name of subject of the x.509 certificate presented by the client."},{"field":"tls.client.supported_ciphers","type":"keyword","normalization":"array","example":["TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","..."],"description":"Array of ciphers offered by the client during the client hello."},{"field":"tls.client.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"tls.client.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"tls.client.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"tls.client.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"tls.client.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"tls.client.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"tls.client.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"tls.client.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.client.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"tls.client.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"tls.client.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"tls.client.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"tls.client.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"tls.client.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"tls.client.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"tls.client.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"tls.client.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"tls.client.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"tls.client.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"tls.client.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"tls.client.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"tls.client.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"tls.client.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.client.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"tls.curve","type":"keyword","normalization":"","example":"secp256r1","description":"String indicating the curve used for the given cipher, when applicable."},{"field":"tls.established","type":"boolean","normalization":"","example":"","description":"Boolean flag indicating if the TLS negotiation was successful and transitioned to an encrypted tunnel."},{"field":"tls.next_protocol","type":"keyword","normalization":"","example":"http/1.1","description":"String indicating the protocol being tunneled."},{"field":"tls.resumed","type":"boolean","normalization":"","example":"","description":"Boolean flag indicating if this TLS connection was resumed from an existing TLS negotiation."},{"field":"tls.server.certificate","type":"keyword","normalization":"","example":"MII...","description":"PEM-encoded stand-alone certificate offered by the server."},{"field":"tls.server.certificate_chain","type":"keyword","normalization":"array","example":["MII...","MII..."],"description":"Array of PEM-encoded certificates that make up the certificate chain offered by the server."},{"field":"tls.server.hash.md5","type":"keyword","normalization":"","example":"0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC","description":"Certificate fingerprint using the MD5 digest of DER-encoded version of certificate offered by the server."},{"field":"tls.server.hash.sha1","type":"keyword","normalization":"","example":"9E393D93138888D288266C2D915214D1D1CCEB2A","description":"Certificate fingerprint using the SHA1 digest of DER-encoded version of certificate offered by the server."},{"field":"tls.server.hash.sha256","type":"keyword","normalization":"","example":"0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0","description":"Certificate fingerprint using the SHA256 digest of DER-encoded version of certificate offered by the server."},{"field":"tls.server.issuer","type":"keyword","normalization":"","example":"CN=Example Root CA, OU=Infrastructure Team, DC=example, DC=com","description":"Subject of the issuer of the x.509 certificate presented by the server."},{"field":"tls.server.ja3s","type":"keyword","normalization":"","example":"394441ab65754e2207b1e1b457b3641d","description":"A hash that identifies servers based on how they perform an SSL/TLS handshake."},{"field":"tls.server.not_after","type":"date","normalization":"","example":"2021-01-01T00:00:00.000Z","description":"Timestamp indicating when server certificate is no longer considered valid."},{"field":"tls.server.not_before","type":"date","normalization":"","example":"1970-01-01T00:00:00.000Z","description":"Timestamp indicating when server certificate is first considered valid."},{"field":"tls.server.subject","type":"keyword","normalization":"","example":"CN=www.example.com, OU=Infrastructure Team, DC=example, DC=com","description":"Subject of the x.509 certificate presented by the server."},{"field":"tls.server.x509.alternative_names","type":"keyword","normalization":"array","example":"*.elastic.co","description":"List of subject alternative names (SAN)."},{"field":"tls.server.x509.issuer.common_name","type":"keyword","normalization":"array","example":"Example SHA2 High Assurance Server CA","description":"List of common name (CN) of issuing certificate authority."},{"field":"tls.server.x509.issuer.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) codes"},{"field":"tls.server.x509.issuer.distinguished_name","type":"keyword","normalization":"","example":"C=US, O=Example Inc, OU=www.example.com, CN=Example SHA2 High Assurance Server CA","description":"Distinguished name (DN) of issuing certificate authority."},{"field":"tls.server.x509.issuer.locality","type":"keyword","normalization":"array","example":"Mountain View","description":"List of locality names (L)"},{"field":"tls.server.x509.issuer.organization","type":"keyword","normalization":"array","example":"Example Inc","description":"List of organizations (O) of issuing certificate authority."},{"field":"tls.server.x509.issuer.organizational_unit","type":"keyword","normalization":"array","example":"www.example.com","description":"List of organizational units (OU) of issuing certificate authority."},{"field":"tls.server.x509.issuer.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.server.x509.not_after","type":"date","normalization":"","example":"2020-07-16T03:15:39Z","description":"Time at which the certificate is no longer considered valid."},{"field":"tls.server.x509.not_before","type":"date","normalization":"","example":"2019-08-16T01:40:25Z","description":"Time at which the certificate is first considered valid."},{"field":"tls.server.x509.public_key_algorithm","type":"keyword","normalization":"","example":"RSA","description":"Algorithm used to generate the public key."},{"field":"tls.server.x509.public_key_curve","type":"keyword","normalization":"","example":"nistp521","description":"The curve used by the elliptic curve public key algorithm. This is algorithm specific."},{"field":"tls.server.x509.public_key_exponent","type":"long","normalization":"","example":65537,"description":"Exponent used to derive the public key. This is algorithm specific."},{"field":"tls.server.x509.public_key_size","type":"long","normalization":"","example":2048,"description":"The size of the public key space in bits."},{"field":"tls.server.x509.serial_number","type":"keyword","normalization":"","example":"55FBB9C7DEBF09809D12CCAA","description":"Unique serial number issued by the certificate authority."},{"field":"tls.server.x509.signature_algorithm","type":"keyword","normalization":"","example":"SHA256-RSA","description":"Identifier for certificate signature algorithm."},{"field":"tls.server.x509.subject.common_name","type":"keyword","normalization":"array","example":"shared.global.example.net","description":"List of common names (CN) of subject."},{"field":"tls.server.x509.subject.country","type":"keyword","normalization":"array","example":"US","description":"List of country \\(C) code"},{"field":"tls.server.x509.subject.distinguished_name","type":"keyword","normalization":"","example":"C=US, ST=California, L=San Francisco, O=Example, Inc., CN=shared.global.example.net","description":"Distinguished name (DN) of the certificate subject entity."},{"field":"tls.server.x509.subject.locality","type":"keyword","normalization":"array","example":"San Francisco","description":"List of locality names (L)"},{"field":"tls.server.x509.subject.organization","type":"keyword","normalization":"array","example":"Example, Inc.","description":"List of organizations (O) of subject."},{"field":"tls.server.x509.subject.organizational_unit","type":"keyword","normalization":"array","example":"","description":"List of organizational units (OU) of subject."},{"field":"tls.server.x509.subject.state_or_province","type":"keyword","normalization":"array","example":"California","description":"List of state or province names (ST, S, or P)"},{"field":"tls.server.x509.version_number","type":"keyword","normalization":"","example":3,"description":"Version of x509 format."},{"field":"tls.version","type":"keyword","normalization":"","example":1.2,"description":"Numeric part of the version parsed from the original string."},{"field":"tls.version_protocol","type":"keyword","normalization":"","example":"tls","description":"Normalized lowercase protocol name parsed from original string."},{"field":"trace.id","type":"keyword","normalization":"","example":"4bf92f3577b34da6a3ce929d0e0e4736","description":"Unique identifier of the trace."},{"field":"transaction.id","type":"keyword","normalization":"","example":"00f067aa0ba902b7","description":"Unique identifier of the transaction within the scope of its trace."},{"field":"url.domain","type":"keyword","normalization":"","example":"www.elastic.co","description":"Domain of the url."},{"field":"url.extension","type":"keyword","normalization":"","example":"png","description":"File extension from the request url, excluding the leading dot."},{"field":"url.fragment","type":"keyword","normalization":"","example":"","description":"Portion of the url after the `#`."},{"field":"url.full","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"url.full.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top","description":"Full unparsed URL."},{"field":"url.original","type":"wildcard","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"url.original.text","type":"match_only_text","normalization":"","example":"https://www.elastic.co:443/search?q=elasticsearch#top or /search?q=elasticsearch","description":"Unmodified original url as seen in the event source."},{"field":"url.password","type":"keyword","normalization":"","example":"","description":"Password of the request."},{"field":"url.path","type":"wildcard","normalization":"","example":"","description":"Path of the request, such as \"/search\"."},{"field":"url.port","type":"long","normalization":"","example":443,"description":"Port of the request, such as 443."},{"field":"url.query","type":"keyword","normalization":"","example":"","description":"Query string of the request."},{"field":"url.registered_domain","type":"keyword","normalization":"","example":"example.com","description":"The highest registered url domain, stripped of the subdomain."},{"field":"url.scheme","type":"keyword","normalization":"","example":"https","description":"Scheme of the url."},{"field":"url.subdomain","type":"keyword","normalization":"","example":"east","description":"The subdomain of the domain."},{"field":"url.top_level_domain","type":"keyword","normalization":"","example":"co.uk","description":"The effective top level domain (com, org, net, co.uk)."},{"field":"url.username","type":"keyword","normalization":"","example":"","description":"Username of the request."},{"field":"user.changes.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.changes.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.changes.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.changes.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.changes.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.changes.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.changes.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.changes.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.changes.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.changes.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.changes.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.changes.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.effective.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.effective.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.effective.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.effective.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.effective.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.effective.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.effective.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.effective.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.effective.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.effective.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.effective.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.effective.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.risk.calculated_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"user.risk.calculated_score","type":"float","normalization":"","example":880.73,"description":"A risk classification score calculated by an internal system as part of entity analytics and entity risk scoring."},{"field":"user.risk.calculated_score_norm","type":"float","normalization":"","example":88.73,"description":"A normalized risk score calculated by an internal system."},{"field":"user.risk.static_level","type":"keyword","normalization":"","example":"High","description":"A risk classification level obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"user.risk.static_score","type":"float","normalization":"","example":830,"description":"A risk classification score obtained from outside the system, such as from some external Threat Intelligence Platform."},{"field":"user.risk.static_score_norm","type":"float","normalization":"","example":83,"description":"A normalized risk score calculated by an external system."},{"field":"user.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user.target.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the user is a member of."},{"field":"user.target.email","type":"keyword","normalization":"","example":"","description":"User email address."},{"field":"user.target.full_name","type":"keyword","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.target.full_name.text","type":"match_only_text","normalization":"","example":"Albert Einstein","description":"User's full name, if available."},{"field":"user.target.group.domain","type":"keyword","normalization":"","example":"","description":"Name of the directory the group is a member of."},{"field":"user.target.group.id","type":"keyword","normalization":"","example":"","description":"Unique identifier for the group on the system/platform."},{"field":"user.target.group.name","type":"keyword","normalization":"","example":"","description":"Name of the group."},{"field":"user.target.hash","type":"keyword","normalization":"","example":"","description":"Unique user hash to correlate information for a user in anonymized form."},{"field":"user.target.id","type":"keyword","normalization":"","example":"S-1-5-21-202424912787-2692429404-2351956786-1000","description":"Unique identifier of the user."},{"field":"user.target.name","type":"keyword","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.target.name.text","type":"match_only_text","normalization":"","example":"a.einstein","description":"Short name or login of the user."},{"field":"user.target.roles","type":"keyword","normalization":"array","example":["kibana_admin","reporting_user"],"description":"Array of user roles at the time of the event."},{"field":"user_agent.device.name","type":"keyword","normalization":"","example":"iPhone","description":"Name of the device."},{"field":"user_agent.name","type":"keyword","normalization":"","example":"Safari","description":"Name of the user agent."},{"field":"user_agent.original","type":"keyword","normalization":"","example":"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1","description":"Unparsed user_agent string."},{"field":"user_agent.original.text","type":"match_only_text","normalization":"","example":"Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1","description":"Unparsed user_agent string."},{"field":"user_agent.os.family","type":"keyword","normalization":"","example":"debian","description":"OS family (such as redhat, debian, freebsd, windows)."},{"field":"user_agent.os.full","type":"keyword","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"user_agent.os.full.text","type":"match_only_text","normalization":"","example":"Mac OS Mojave","description":"Operating system name, including the version or code name."},{"field":"user_agent.os.kernel","type":"keyword","normalization":"","example":"4.4.0-112-generic","description":"Operating system kernel version as a raw string."},{"field":"user_agent.os.name","type":"keyword","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"user_agent.os.name.text","type":"match_only_text","normalization":"","example":"Mac OS X","description":"Operating system name, without the version."},{"field":"user_agent.os.platform","type":"keyword","normalization":"","example":"darwin","description":"Operating system platform (such centos, ubuntu, windows)."},{"field":"user_agent.os.type","type":"keyword","normalization":"","example":"macos","description":"Which commercial OS family (one of: linux, macos, unix, windows, ios or android)."},{"field":"user_agent.os.version","type":"keyword","normalization":"","example":"10.14.1","description":"Operating system version as a raw string."},{"field":"user_agent.version","type":"keyword","normalization":"","example":12,"description":"Version of the user agent."},{"field":"vulnerability.category","type":"keyword","normalization":"array","example":["Firewall"],"description":"Category of a vulnerability."},{"field":"vulnerability.classification","type":"keyword","normalization":"","example":"CVSS","description":"Classification of the vulnerability."},{"field":"vulnerability.description","type":"keyword","normalization":"","example":"In macOS before 2.12.6, there is a vulnerability in the RPC...","description":"Description of the vulnerability."},{"field":"vulnerability.description.text","type":"match_only_text","normalization":"","example":"In macOS before 2.12.6, there is a vulnerability in the RPC...","description":"Description of the vulnerability."},{"field":"vulnerability.enumeration","type":"keyword","normalization":"","example":"CVE","description":"Identifier of the vulnerability."},{"field":"vulnerability.id","type":"keyword","normalization":"","example":"CVE-2019-00001","description":"ID of the vulnerability."},{"field":"vulnerability.reference","type":"keyword","normalization":"","example":"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-6111","description":"Reference of the vulnerability."},{"field":"vulnerability.report_id","type":"keyword","normalization":"","example":20191018.0001,"description":"Scan identification number."},{"field":"vulnerability.scanner.vendor","type":"keyword","normalization":"","example":"Tenable","description":"Name of the scanner vendor."},{"field":"vulnerability.score.base","type":"float","normalization":"","example":5.5,"description":"Vulnerability Base score."},{"field":"vulnerability.score.environmental","type":"float","normalization":"","example":5.5,"description":"Vulnerability Environmental score."},{"field":"vulnerability.score.temporal","type":"float","normalization":"","example":"","description":"Vulnerability Temporal score."},{"field":"vulnerability.score.version","type":"keyword","normalization":"","example":2,"description":"CVSS version."},{"field":"vulnerability.severity","type":"keyword","normalization":"","example":"Critical","description":"Severity of the vulnerability."}] \ No newline at end of file diff --git a/x-pack/plugins/osquery/public/common/schemas/osquery/v5.10.2.json b/x-pack/plugins/osquery/public/common/schemas/osquery/v5.10.2.json new file mode 100644 index 0000000000000..41b1607e995ce --- /dev/null +++ b/x-pack/plugins/osquery/public/common/schemas/osquery/v5.10.2.json @@ -0,0 +1 @@ +[{"name":"account_policy_data","description":"Additional macOS user account data from the AccountPolicy section of OpenDirectory.","platforms":["darwin"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the account was first created","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"failed_login_count","description":"The number of failed login attempts using an incorrect password. Count resets after a correct password is entered.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"failed_login_timestamp","description":"The time of the last failed login attempt. Resets after a correct password is entered","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"password_last_set_time","description":"The time the password was last changed","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"acpi_tables","description":"Firmware ACPI functional table common metadata and content.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"ACPI table name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of compiled table data","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table content","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ad_config","description":"macOS Active Directory configuration.","platforms":["darwin"],"columns":[{"name":"name","description":"The macOS-specific configuration name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain","description":"Active Directory trust domain","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option","description":"Canonical name of option","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Variable typed option value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"alf","description":"macOS application layer firewall (ALF) service details.","platforms":["darwin"],"columns":[{"name":"allow_signed_enabled","description":"1 If allow signed mode is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"firewall_unload","description":"1 If firewall unloading enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"global_state","description":"1 If the firewall is enabled with exceptions, 2 if the firewall is configured to block all incoming connections, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logging_enabled","description":"1 If logging mode is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logging_option","description":"Firewall logging option","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"stealth_enabled","description":"1 If stealth mode is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Application Layer Firewall version","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"alf_exceptions","description":"macOS application layer firewall (ALF) service exceptions.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to the executable that is excepted","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Firewall exception state","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"alf_explicit_auths","description":"ALF services explicitly allowed to perform networking.","platforms":["darwin"],"columns":[{"name":"process","description":"Process name explicitly allowed","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"app_schemes","description":"macOS application schemes and handlers (e.g., http, file, mailto).","platforms":["darwin"],"columns":[{"name":"scheme","description":"Name of the scheme/protocol","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"handler","description":"Application label for the handler","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this handler is the OS default, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"external","description":"1 if this handler does NOT exist on macOS by default, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protected","description":"1 if this handler is protected (reserved) by macOS, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apparmor_events","description":"Track AppArmor events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Raw audit message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"apparmor","description":"Apparmor Status like ALLOWED, DENIED etc.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"operation","description":"Permission requested by the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process PID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"profile","description":"Apparmor profile name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"denied_mask","description":"Denied permissions for the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"capname","description":"Capability requested by the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ouid","description":"Object owner's user ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"capability","description":"Capability number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"requested_mask","description":"Requested access mask","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"info","description":"Additional information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error","description":"Error information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"namespace","description":"AppArmor namespace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"AppArmor label","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apparmor_profiles","description":"Track active AppArmor profiles.","platforms":["linux"],"columns":[{"name":"path","description":"Unique, aa-status compatible, policy identifier.","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Policy name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"attach","description":"Which executable(s) a profile will attach to.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"How the policy is applied.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"A unique hash that identifies this policy.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"appcompat_shims","description":"Application Compatibility shims are a way to persist malware. This table presents the AppCompat Shim information from the registry in a nice format. See http://files.brucon.org/2015/Tomczak_and_Ballenthin_Shims_for_the_Win.pdf for more details.","platforms":["windows"],"columns":[{"name":"executable","description":"Name of the executable that is being shimmed. This is pulled from the registry.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the SDB database.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the SDB.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Install time of the SDB","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the SDB database.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdb_id","description":"Unique GUID of the SDB.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apps","description":"macOS applications installed in known search paths (e.g., /Applications).","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the Name.app folder","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute and full Name.app path","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"bundle_executable","description":"Info properties CFBundleExecutable label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_identifier","description":"Info properties CFBundleIdentifier label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_name","description":"Info properties CFBundleName label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_short_version","description":"Info properties CFBundleShortVersionString label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_version","description":"Info properties CFBundleVersion label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_package_type","description":"Info properties CFBundlePackageType label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"environment","description":"Application-set environment variables","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"element","description":"Does the app identify as a background agent","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"compiler","description":"Info properties DTCompiler label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Info properties CFBundleDevelopmentRegion label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Info properties CFBundleDisplayName label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"info_string","description":"Info properties CFBundleGetInfoString label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"minimum_system_version","description":"Minimum version of macOS required for the app to run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The UTI that categorizes the app for the App Store","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"applescript_enabled","description":"Info properties NSAppleScriptEnabled label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"copyright","description":"Info properties NSHumanReadableCopyright label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"The time that the app was last used","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apt_sources","description":"Current list of APT repositories or software channels.","platforms":["linux"],"columns":[{"name":"name","description":"Repository name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Source file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"base_uri","description":"Repository base URI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"release","description":"Release name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Repository source version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Repository maintainer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"components","description":"Repository components","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architectures","description":"Repository architectures","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"arp_cache","description":"Address resolution cache, both static and dynamic (from ARP, NDP).","platforms":["darwin","linux","windows"],"columns":[{"name":"address","description":"IPv4 address target","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address of broadcasted address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"interface","description":"Interface of the network for the MAC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permanent","description":"1 for true, 0 for false","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"asl","description":"Queries the Apple System Log data structure for system events.","platforms":["darwin"],"columns":[{"name":"time","description":"Unix timestamp. Set automatically","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"time_nano_sec","description":"Nanosecond time.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Sender's address (set by the server).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sender","description":"Sender's identification string. Default is process name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"facility","description":"Sender's facility. Default is 'user'.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Sending process ID encoded as a string. Set automatically.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"GID that sent the log message (set by the server).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"UID that sent the log message (set by the server).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"Log level number. See levels in asl.h.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message text.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ref_pid","description":"Reference PID for messages proxied by launchd","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ref_proc","description":"Reference process for messages proxied by launchd","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extra","description":"Extra columns, in JSON format. Queries against this column are performed entirely in SQLite, so do not benefit from efficient querying via asl.h.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"atom_packages","description":"Lists all atom packages in a directory or globally installed in a system.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Package supplied description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Package's package.json path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License for package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"homepage","description":"Package supplied homepage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the plugin","type":"bigint","notes":"","hidden":false,"required":false,"index":true}]},{"name":"augeas","description":"Configuration files parsed by augeas.","platforms":["darwin","linux"],"columns":[{"name":"node","description":"The node path of the configuration item","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"value","description":"The value of the configuration item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"The label of the configuration item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path to the configuration file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authenticode","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["windows"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"original_program_name","description":"The original program name that the publisher has signed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The certificate serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_name","description":"The certificate issuer name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_name","description":"The certificate subject name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"result","description":"The signature check result","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authorization_mechanisms","description":"macOS Authorization mechanisms database.","platforms":["darwin"],"columns":[{"name":"label","description":"Label of the authorization right","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"plugin","description":"Authorization plugin name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mechanism","description":"Name of the mechanism that will be called","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"privileged","description":"If privileged it will run as root, else as an anonymous user","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"entry","description":"The whole string entry","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authorizations","description":"macOS Authorization rights database.","platforms":["darwin"],"columns":[{"name":"label","description":"Item name, usually in reverse domain format","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"modified","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"allow_root","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"timeout","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tries","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authenticate_user","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shared","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"session_owner","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authorized_keys","description":"A line-delimited authorized_keys table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local owner of authorized_keys file","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"algorithm","description":"Key type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Key encoded as base64","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"options","description":"Optional list of login options","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional comment","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to the authorized_keys file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"autoexec","description":"Aggregate of executables that will automatically execute on the target machine. This is an amalgamation of other tables like services, scheduled_tasks, startup_items and more.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the executable","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of the program","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Source table of the autoexec item","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_metadata","description":"Azure instance metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"location","description":"Azure Region the VM is running in","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"offer","description":"Offer information for the VM image (Azure image gallery VMs only)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Publisher of the VM image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sku","description":"SKU for the VM image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the VM image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Linux or Windows","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_update_domain","description":"Update domain the VM is running in","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_fault_domain","description":"Fault domain the VM is running in","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vm_id","description":"Unique identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"vm_size","description":"VM size","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subscription_id","description":"Azure subscription for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resource_group_name","description":"Resource group for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"placement_group_id","description":"Placement group for the VM scale set","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vm_scale_set_name","description":"VM scale set name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_tags","description":"Azure instance tags.","platforms":["darwin","linux","windows"],"columns":[{"name":"vm_id","description":"Unique identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"The tag key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"The tag value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"background_activities_moderator","description":"Background Activities Moderator (BAM) tracks application execution.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"battery","description":"Provides information about the internal battery of a Macbook.","platforms":["darwin"],"columns":[{"name":"manufacturer","description":"The battery manufacturer's name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacture_date","description":"The date the battery was manufactured UNIX Epoch","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The battery's model number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The battery's unique serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cycle_count","description":"The number of charge/discharge cycles","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"health","description":"One of the following: \"Good\" describes a well-performing battery, \"Fair\" describes a functional battery with limited capacity, or \"Poor\" describes a battery that's not capable of providing power","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"condition","description":"One of the following: \"Normal\" indicates the condition of the battery is within normal tolerances, \"Service Needed\" indicates that the battery should be checked out by a licensed Mac repair service, \"Permanent Failure\" indicates the battery needs replacement","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"One of the following: \"AC Power\" indicates the battery is connected to an external power source, \"Battery Power\" indicates that the battery is drawing internal power, \"Off Line\" indicates the battery is off-line or no longer connected","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"charging","description":"1 if the battery is currently being charged by a power source. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"charged","description":"1 if the battery is currently completely charged. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"designed_capacity","description":"The battery's designed capacity in mAh","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"The battery's actual capacity when it is fully charged in mAh","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"current_capacity","description":"The battery's current charged capacity in mAh","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_remaining","description":"The percentage of battery remaining before it is drained","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"amperage","description":"The battery's current amperage in mA","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"voltage","description":"The battery's current voltage in mV","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes_until_empty","description":"The number of minutes until the battery is fully depleted. This value is -1 if this time is still being calculated","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes_to_full_charge","description":"The number of minutes until the battery is fully charged. This value is -1 if this time is still being calculated","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"bitlocker_info","description":"Retrieve bitlocker status of the machine.","platforms":["windows"],"columns":[{"name":"device_id","description":"ID of the encrypted drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"Drive letter of the encrypted drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"persistent_volume_id","description":"Persistent ID of the drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"conversion_status","description":"The bitlocker conversion status of the drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protection_status","description":"The bitlocker protection status of the drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"encryption_method","description":"The encryption type of the device.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The FVE metadata version of the drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"percentage_encrypted","description":"The percentage of the drive that is encrypted.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"lock_status","description":"The accessibility status of the drive from Windows.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"block_devices","description":"Block (buffered access) device file nodes: disks, ramdisks, and DMG containers.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Block device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Block device parent name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Block device vendor string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"Block device model string identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Block device size in blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Block device Universally Unique Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Block device type string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"Block device label string","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"bpf_process_events","description":"Track time/action process executions.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Binary path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"json_cmdline","description":"Command line arguments, in JSON format","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"bpf_socket_events","description":"Track network socket opens and closes.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The socket type","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"browser_plugins","description":"All C/NPAPI browser plugin details for all users. C/NPAPI has been deprecated on all major browsers. To query for plugins on modern browsers, try: `chrome_extensions` `firefox_addons` `safari_extensions`.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the plugin","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Plugin display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Plugin identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Plugin short version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Build SDK used to compile plugin","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Plugin description text","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Plugin language-localization","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"native","description":"Plugin requires native execution","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"disabled","description":"Is the plugin disabled. 1 = Disabled","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"carbon_black_info","description":"Returns info about a Carbon Black sensor install.","platforms":["darwin","linux","windows"],"columns":[{"name":"sensor_id","description":"Sensor ID of the Carbon Black sensor","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"config_name","description":"Sensor group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_store_files","description":"If the sensor is configured to send back binaries to the Carbon Black server","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_module_loads","description":"If the sensor is configured to capture module loads","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_module_info","description":"If the sensor is configured to collect metadata of binaries","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_file_mods","description":"If the sensor is configured to collect file modification events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_reg_mods","description":"If the sensor is configured to collect registry modification events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_net_conns","description":"If the sensor is configured to collect network connections","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_processes","description":"If the sensor is configured to process events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_cross_processes","description":"If the sensor is configured to cross process events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_emet_events","description":"If the sensor is configured to EMET events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_data_file_writes","description":"If the sensor is configured to collect non binary file writes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_process_user_context","description":"If the sensor is configured to collect the user running a process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_sensor_operations","description":"Unknown","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_mb","description":"Event file disk quota in MB","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_percentage","description":"Event file disk quota in a percentage","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protection_disabled","description":"If the sensor is configured to report tamper events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sensor_ip_addr","description":"IP address of the sensor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sensor_backend_server","description":"Carbon Black server","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"event_queue","description":"Size in bytes of Carbon Black event files on disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"binary_queue","description":"Size in bytes of binaries waiting to be sent to Carbon Black server","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"carves","description":"List the set of completed and in-progress carves. If carve=1 then the query is treated as a new carve request.","platforms":["darwin","linux","windows"],"columns":[{"name":"time","description":"Time at which the carve was kicked off","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"A SHA256 sum of the carved archive","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the carved archive","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the requested carve","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the carve, can be STARTING, PENDING, SUCCESS, or FAILED","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"carve_guid","description":"Identifying value of the carve session","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"request_id","description":"Identifying value of the carve request (e.g., scheduled query name, distributed request, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"carve","description":"Set this value to '1' to start a file carve","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"certificates","description":"Certificate Authorities installed in Keychains/ca-bundles.","platforms":["darwin","linux","windows"],"columns":[{"name":"common_name","description":"Certificate CommonName","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject","description":"Certificate distinguished name (deprecated, use subject2)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer","description":"Certificate issuer distinguished name (deprecated, use issuer2)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ca","description":"1 if CA: true (certificate is an authority) else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"self_signed","description":"1 if self-signed, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"not_valid_before","description":"Lower bound of valid date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"not_valid_after","description":"Certificate expiration data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signing_algorithm","description":"Signing algorithm used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_algorithm","description":"Key algorithm used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_strength","description":"Key size used for RSA/DSA, or curve name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Certificate key usage and extended key usage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_key_id","description":"SKID an optionally included SHA1","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authority_key_id","description":"AKID an optionally included SHA1","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the raw certificate contents","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Keychain or PEM bundle","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"Certificate serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"SID","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"store_location","description":"Certificate system store location","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"store","description":"Certificate system store","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"username","description":"Username","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"store_id","description":"Exists for service/user stores. Contains raw store id provided by WinAPI.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"issuer2","description":"Certificate issuer distinguished name","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"subject2","description":"Certificate distinguished name","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux","darwin"]}]},{"name":"chassis_info","description":"Display information pertaining to the chassis and its security status.","platforms":["windows"],"columns":[{"name":"audible_alarm","description":"If TRUE, the frame is equipped with an audible alarm.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"breach_description","description":"If provided, gives a more detailed description of a detected security breach.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"chassis_types","description":"A comma-separated list of chassis types, such as Desktop or Laptop.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"An extended description of the chassis if available.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"lock","description":"If TRUE, the frame is equipped with a lock.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_breach","description":"The physical status of the chassis such as Breach Successful, Breach Attempted, etc.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"smbios_tag","description":"The assigned asset tag number of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sku","description":"The Stock Keeping Unit number if available.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"If available, gives various operational or nonoperational statuses such as OK, Degraded, and Pred Fail.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"visible_alarm","description":"If TRUE, the frame is equipped with a visual alarm.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"chocolatey_packages","description":"Chocolatey packages installed in a system.","platforms":["windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this package resides","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"chrome_extension_content_scripts","description":"Chrome browser extension content scripts.","platforms":["darwin","linux","windows"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"identifier","description":"Extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script","description":"The content script used by the extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"match","description":"The pattern that the script is matched against","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"chrome_extensions","description":"Chrome-based browser extensions.","platforms":["darwin","linux","windows"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave, edge, edge_beta)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Extension display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile","description":"The name of the Chrome profile that contains this extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"referenced_identifier","description":"Extension identifier, as specified by the preferences file. Empty if the extension is not in the profile.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier, computed from its manifest. Empty in case of error.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Extension-optional description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"default_locale","description":"Default locale supported by extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_locale","description":"Current locale supported by extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"persistent","description":"1 If extension is persistent across all tabs else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"The permissions required by the extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions_json","description":"The JSON-encoded permissions required by the extension","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"optional_permissions","description":"The permissions optionally required by the extensions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"optional_permissions_json","description":"The JSON-encoded permissions optionally required by the extensions","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"manifest_hash","description":"The SHA256 hash of the manifest.json file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"from_webstore","description":"True if this extension was installed from the web store","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"1 if this extension is enabled","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Extension install time, in its original Webkit format","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_timestamp","description":"Extension install time, converted to unix time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"manifest_json","description":"The manifest file of the extension","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"key","description":"The extension key, from the manifest file","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"connected_displays","description":"Provides information about the connected displays of the machine.","platforms":["darwin"],"columns":[{"name":"name","description":"The name of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"product_id","description":"The product ID of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The serial number of the display. (may not be unique)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"The vendor ID of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufactured_week","description":"The manufacture week of the display. This field is 0 if not supported","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"manufactured_year","description":"The manufacture year of the display. This field is 0 if not supported","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"display_id","description":"The display ID.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pixels","description":"The number of pixels of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resolution","description":"The resolution of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ambient_brightness_enabled","description":"The ambient brightness setting associated with the display. This will be 1 if enabled and is 0 if disabled or not supported.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"connection_type","description":"The connection type associated with the display.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"display_type","description":"The type of display.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"main","description":"If the display is the main display.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mirror","description":"If the display is mirrored or not. This field is 1 if mirrored and 0 if not mirrored.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"online","description":"The online status of the display. This field is 1 if the display is online and 0 if it is offline.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"rotation","description":"The orientation of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"connectivity","description":"Provides the overall system's network state.","platforms":["windows"],"columns":[{"name":"disconnected","description":"True if the all interfaces are not connected to any network","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_no_traffic","description":"True if any interface is connected via IPv4, but has seen no traffic","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_no_traffic","description":"True if any interface is connected via IPv6, but has seen no traffic","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_subnet","description":"True if any interface is connected to the local subnet via IPv4","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_local_network","description":"True if any interface is connected to a routed network via IPv4","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_internet","description":"True if any interface is connected to the Internet via IPv4","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_subnet","description":"True if any interface is connected to the local subnet via IPv6","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_local_network","description":"True if any interface is connected to a routed network via IPv6","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_internet","description":"True if any interface is connected to the Internet via IPv6","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"cpu_info","description":"Retrieve cpu hardware info of the machine.","platforms":["darwin","linux","windows"],"columns":[{"name":"device_id","description":"The DeviceID of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"processor_type","description":"The processor type, such as Central, Math, or Video.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_status","description":"The current operating status of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"number_of_cores","description":"The number of cores of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logical_processors","description":"The number of logical processors of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"address_width","description":"The width of the CPU address bus.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_clock_speed","description":"The current frequency of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_clock_speed","description":"The maximum possible frequency of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"socket_designation","description":"The assigned socket on the board for the given CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"availability","description":"The availability and status of the CPU.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"number_of_efficiency_cores","description":"The number of efficiency cores of the CPU. Only available on Apple Silicon","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"number_of_performance_cores","description":"The number of performance cores of the CPU. Only available on Apple Silicon","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]}]},{"name":"cpu_time","description":"Displays information from /proc/stat file about the time the cpu cores spent in different parts of the system.","platforms":["darwin","linux"],"columns":[{"name":"core","description":"Name of the cpu (core)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"Time spent in user mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Time spent in user mode with low priority (nice)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system","description":"Time spent in system mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"idle","description":"Time spent in the idle task","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"iowait","description":"Time spent waiting for I/O to complete","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"irq","description":"Time spent servicing interrupts","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"softirq","description":"Time spent servicing softirqs","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"steal","description":"Time spent in other operating systems when running in a virtualized environment","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"guest","description":"Time spent running a virtual CPU for a guest OS under the control of the Linux kernel","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"guest_nice","description":"Time spent running a niced guest ","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"cpuid","description":"Useful CPU features from the cpuid ASM call.","platforms":["darwin","linux","windows"],"columns":[{"name":"feature","description":"Present feature flags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Bit value or string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"output_register","description":"Register used to for feature value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"output_bit","description":"Bit in register value for feature value","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"input_eax","description":"Value of EAX used","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"crashes","description":"Application, System, and Mobile App crash logs.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of crash log","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID of the crashed process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Location of log file","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"identifier","description":"Identifier of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version info of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent PID of the crashed process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"responsible","description":"Process responsible for the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the crashed process","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"datetime","description":"Date/Time at which the crash occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"crashed_thread","description":"Thread ID which crashed","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Most recent frame from the stack trace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_type","description":"Exception type of the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_codes","description":"Exception codes from the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_notes","description":"Exception notes from the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registers","description":"The value of the system registers","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"crontab","description":"Line parsed values from system and user cron/tab.","platforms":["darwin","linux"],"columns":[{"name":"event","description":"The job @event name (rare)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"minute","description":"The exact minute for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hour","description":"The hour of the day for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"day_of_month","description":"The day of the month for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"month","description":"The month of the year for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"day_of_week","description":"The day of the week for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command","description":"Raw command string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"File parsed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"cups_destinations","description":"Returns all configured printers.","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the printer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option_name","description":"Option name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option_value","description":"Option value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"cups_jobs","description":"Returns all completed print jobs from cups.","platforms":["darwin"],"columns":[{"name":"title","description":"Title of the printed job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"destination","description":"The printer the job was sent to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"The user who printed the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"format","description":"The format of the print job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the print job","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"completed_time","description":"When the job completed printing","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"processing_time","description":"How long the job took to process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the print request was initiated","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"curl","description":"Perform an http request and return stats about it.","platforms":["darwin","linux","windows"],"columns":[{"name":"url","description":"The url for the request","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"method","description":"The HTTP method for the request","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_agent","description":"The user-agent string to use for the request","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"response_code","description":"The HTTP status code for the response","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"round_trip_time","description":"Time taken to complete the request","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of bytes in the response","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"result","description":"The HTTP response body","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"curl_certificate","description":"Inspect TLS certificates by connecting to input hostnames.","platforms":["darwin","linux","windows"],"columns":[{"name":"hostname","description":"Hostname to CURL (domain[:port], e.g. osquery.io)","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"common_name","description":"Common name of company issued to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"organization","description":"Organization issued to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"organization_unit","description":"Organization unit issued to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Certificate serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_common_name","description":"Issuer common name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_organization","description":"Issuer organization","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_organization_unit","description":"Issuer organization unit","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"valid_from","description":"Period of validity start date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"valid_to","description":"Period of validity end date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256_fingerprint","description":"SHA-256 fingerprint","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1_fingerprint","description":"SHA1 fingerprint","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version Number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"signature_algorithm","description":"Signature Algorithm","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signature","description":"Signature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_key_identifier","description":"Subject Key Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authority_key_identifier","description":"Authority Key Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Usage of key in certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extended_key_usage","description":"Extended usage of key in certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policies","description":"Certificate Policies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_alternative_names","description":"Subject Alternative Name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_alternative_names","description":"Issuer Alternative Name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"info_access","description":"Authority Information Access","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_info_access","description":"Subject Information Access","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_mappings","description":"Policy Mappings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"has_expired","description":"1 if the certificate has expired, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"basic_constraint","description":"Basic Constraints","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name_constraints","description":"Name Constraints","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_constraints","description":"Policy Constraints","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dump_certificate","description":"Set this value to '1' to dump certificate","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"timeout","description":"Set this value to the timeout in seconds to complete the TLS handshake (default 4s, use 0 for no timeout)","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"pem","description":"Certificate PEM format","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"deb_packages","description":"The installed DEB package database.","platforms":["linux"],"columns":[{"name":"name","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Package source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Package architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"revision","description":"Package revision","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Package status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Package maintainer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"section","description":"Package section","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"priority","description":"Package priority","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"admindir","description":"libdpkg admindir. Defaults to /var/lib/dpkg","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"default_environment","description":"Default environment variables and values.","platforms":["windows"],"columns":[{"name":"variable","description":"Name of the environment variable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the environment variable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"expand","description":"1 if the variable needs expanding, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_file","description":"Similar to the file table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"partition","description":"A partition number","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"path","description":"A logical path within the device node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"uid","description":"Owning user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Creation time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_firmware","description":"A best-effort list of discovered firmware versions.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"The device name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"version","description":"Firmware version","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_hash","description":"Similar to the hash table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided inode data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided inode data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided inode data","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_partitions","description":"Use TSK to enumerate details about partitions on a disk device.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number or description","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"offset","description":"","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Byte size of each block","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Number of blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Number of meta nodes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"disk_encryption","description":"Disk encryption status and information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Disk name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Disk Universally Unique Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"encrypted","description":"1 If encrypted: true (disk is encrypted), else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Description of cipher type and mode if available","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"encryption_status","description":"Disk encryption status with one of following values: encrypted | not encrypted | undefined","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Currently authenticated user if available","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"user_uuid","description":"UUID of authenticated user if available","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"filevault_status","description":"FileVault status with one of following values: on | off | unknown","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]}]},{"name":"disk_events","description":"Track DMG disk image events (appearance/disappearance) when opened.","platforms":["darwin"],"columns":[{"name":"action","description":"Appear or disappear","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the DMG file accessed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Disk event name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"Disk event BSD name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"UUID of the volume inside DMG if available","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of partition in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ejectable","description":"1 if ejectable, 0 if not","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mountable","description":"1 if mountable, 0 if not","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"writable","description":"1 if writable, 0 if not","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"content","description":"Disk event content","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"media_name","description":"Disk event media name string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Disk event vendor string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filesystem","description":"Filesystem if available","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"checksum","description":"UDIF Master checksum if available (CRC32)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of appearance/disappearance in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"disk_info","description":"Retrieve basic information about the physical disks of a system.","platforms":["windows"],"columns":[{"name":"partitions","description":"Number of detected partitions on disk.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_index","description":"Physical drive number of the disk.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The interface type of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"id","description":"The unique identifier of the drive on the system.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pnp_device_id","description":"The unique identifier of the drive on the system.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_size","description":"Size of the disk.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hard drive model.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"The label of the disk object.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"The OS's description of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"dns_cache","description":"Enumerate the DNS cache using the undocumented DnsGetCacheDataTable function in dnsapi.dll.","platforms":["windows"],"columns":[{"name":"name","description":"DNS record name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"DNS record type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"DNS record flags","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"dns_resolvers","description":"Resolvers used by this host.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Address type index or order","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Address type: sortlist, nameserver, search","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Resolver IP/IPv6 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Address (sortlist) netmask length","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"options","description":"Resolver options","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"docker_container_envs","description":"Docker container environment variables.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Environment variable name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Environment variable value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_fs_changes","description":"Changes to files or directories on container's filesystem.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"path","description":"FIle or directory path relative to rootfs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"change_type","description":"Type of change: C:Modified, A:Added, D:Deleted","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_labels","description":"Docker container labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_mounts","description":"Docker container mounts.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Type of mount (bind, volume)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Optional mount name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"source","description":"Source path on host","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"destination","description":"Destination path inside container","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver providing the mount","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Mount options (rw, ro)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rw","description":"1 if read/write. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"propagation","description":"Mount propagation","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_networks","description":"Docker container networks.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Network name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"network_id","description":"Network ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"endpoint_id","description":"Endpoint ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Gateway","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ip_address","description":"IP address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ip_prefix_len","description":"IP subnet prefix length","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_gateway","description":"IPv6 gateway","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_prefix_len","description":"IPv6 subnet prefix length","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mac_address","description":"MAC address","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_ports","description":"Docker container ports.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Protocol (tcp, udp)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"port","description":"Port inside the container","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"host_ip","description":"Host IP address on which public port is listening","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host_port","description":"Host port","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_processes","description":"Docker container processes.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start in seconds since boot (non-sleeping)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"User name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Cumulative CPU time. [DD-]HH:MM:SS format","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu","description":"CPU utilization as percentage","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"mem","description":"Memory utilization as percentage","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_stats","description":"Docker container statistics. Queries on this table take at least one second.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"name","description":"Container name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"pids","description":"Number of processes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"read","description":"UNIX time when stats were read","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"preread","description":"UNIX time when stats were last read","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"interval","description":"Difference between read and preread in nano-seconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_read","description":"Total disk read bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_write","description":"Total disk write bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"num_procs","description":"Number of processors","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_total_usage","description":"Total CPU usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_kernelmode_usage","description":"CPU kernel mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_usermode_usage","description":"CPU user mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_cpu_usage","description":"CPU system usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"online_cpus","description":"Online CPUs","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_cpu_total_usage","description":"Last read total CPU usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_cpu_kernelmode_usage","description":"Last read CPU kernel mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_cpu_usermode_usage","description":"Last read CPU user mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_system_cpu_usage","description":"Last read CPU system usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_online_cpus","description":"Last read online CPUs","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_usage","description":"Memory usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_cached","description":"Memory cached","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_max_usage","description":"Memory maximum usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"Memory limit","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"network_rx_bytes","description":"Total network bytes read","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"network_tx_bytes","description":"Total network bytes transmitted","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_containers","description":"Docker containers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Container name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"image","description":"Docker image (name) used to launch this container","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"image_id","description":"Docker image ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command","description":"Command with arguments","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Container state (created, restarting, running, removing, paused, exited, dead)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Container status information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Identifier of the initial process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Container path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_entrypoint","description":"Container entrypoint(s)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"started_at","description":"Container start time as string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"finished_at","description":"Container finish time as string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"privileged","description":"Is the container privileged","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"security_options","description":"List of container security options","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"env_variables","description":"Container environmental variables","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"readonly_rootfs","description":"Is the root filesystem mounted as read only","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cgroup_namespace","description":"cgroup namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"ipc_namespace","description":"IPC namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"mnt_namespace","description":"Mount namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"net_namespace","description":"Network namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"pid_namespace","description":"PID namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"user_namespace","description":"User namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"uts_namespace","description":"UTS namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]}]},{"name":"docker_image_history","description":"Docker image history information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of instruction in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"created_by","description":"Created by instruction","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of tags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Instruction comment","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_image_labels","description":"Docker image labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_image_layers","description":"Docker image layers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"layer_id","description":"Layer ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"layer_order","description":"Layer Order (1 = base layer)","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_images","description":"Docker images information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size_bytes","description":"Size of image in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of repository tags","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_info","description":"Docker system information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Docker system ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"containers","description":"Total number of containers","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"containers_running","description":"Number of containers currently running","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"containers_paused","description":"Number of containers in paused state","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"containers_stopped","description":"Number of containers in stopped state","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"images","description":"Number of images","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"storage_driver","description":"Storage driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"1 if memory limit support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_limit","description":"1 if swap limit support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_memory","description":"1 if kernel memory limit support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_period","description":"1 if CPU Completely Fair Scheduler (CFS) period support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_quota","description":"1 if CPU Completely Fair Scheduler (CFS) quota support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_shares","description":"1 if CPU share weighting support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_set","description":"1 if CPU set selection support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_forwarding","description":"1 if IPv4 forwarding is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bridge_nf_iptables","description":"1 if bridge netfilter iptables is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bridge_nf_ip6tables","description":"1 if bridge netfilter ip6tables is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"oom_kill_disable","description":"1 if Out-of-memory kill is disabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logging_driver","description":"Logging driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cgroup_driver","description":"Control groups driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Operating system type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpus","description":"Number of CPUs","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"memory","description":"Total memory","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"http_proxy","description":"HTTP proxy","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"https_proxy","description":"HTTPS proxy","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"no_proxy","description":"Comma-separated list of domain extensions proxy should not be used for","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the docker host","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"server_version","description":"Server version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root_dir","description":"Docker root directory","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_network_labels","description":"Docker network labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_networks","description":"Docker networks information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Network name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Network driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"enable_ipv6","description":"1 if IPv6 is enabled on this network. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"subnet","description":"Network subnet","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Network gateway","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_version","description":"Docker version information.","platforms":["darwin","linux"],"columns":[{"name":"version","description":"Docker version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"api_version","description":"API version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"min_api_version","description":"Minimum API version supported","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"git_commit","description":"Docker build git commit","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"go_version","description":"Go version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Hardware architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Build time","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_volume_labels","description":"Docker volume labels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_volumes","description":"Docker volumes information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"driver","description":"Volume driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mount_point","description":"Mount point","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Volume type","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"drivers","description":"Details for in-use Windows device drivers. This does not display installed but unused drivers.","platforms":["windows"],"columns":[{"name":"device_id","description":"Device ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_name","description":"Device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"image","description":"Path to driver image file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Driver description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service","description":"Driver service name, if one exists","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service_key","description":"Driver service registry key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Driver version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inf","description":"Associated inf file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Device/driver class name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider","description":"Driver provider","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Device manufacturer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver_key","description":"Driver key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"date","description":"Driver date","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"signed","description":"Whether the driver is signed or not","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_metadata","description":"EC2 instance metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instance_type","description":"EC2 instance type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture of this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"region","description":"AWS region in which this instance launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"availability_zone","description":"Availability zone in which this instance launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Private IPv4 DNS hostname of the first interface of this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_ipv4","description":"Private IPv4 address of the first interface of this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address for the first network interface of this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_groups","description":"Comma separated list of security group names","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iam_arn","description":"If there is an IAM role associated with the instance, contains instance profile ARN","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ami_id","description":"AMI ID used to launch this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reservation_id","description":"ID of the reservation","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"account_id","description":"AWS account ID which owns this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_tags","description":"EC2 instance tag key value pairs.","platforms":["darwin","linux","windows"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Tag key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Tag value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"es_process_events","description":"Process execution events from EndpointSecurity.","platforms":["darwin"],"columns":[{"name":"version","description":"Version of EndpointSecurity event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seq_num","description":"Per event sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"global_seq_num","description":"Global sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"original_parent","description":"Original parent process ID in case of reparenting","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline_count","description":"Number of command line arguments","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective User ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective Group ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signing_id","description":"Signature identifier of the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"team_id","description":"Team identifier of thd process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Codesigning hash of the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_binary","description":"Indicates if the binary is Apple signed binary (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of a process in case of an exit event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"child_pid","description":"Process ID of a child process in case of a fork event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"event_type","description":"Type of EndpointSecurity event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"codesigning_flags","description":"Codesigning flags matching one of these options, in a comma separated list: NOT_VALID, ADHOC, NOT_RUNTIME, INSTALLER. See kern/cs_blobs.h in XNU for descriptions.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"es_process_file_events","description":"File integrity monitoring events from EndpointSecurity including process context.","platforms":["darwin"],"columns":[{"name":"version","description":"Version of EndpointSecurity event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seq_num","description":"Per event sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"global_seq_num","description":"Global sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"The source or target filename for the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dest_filename","description":"Destination filename for the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"event_type","description":"Type of EndpointSecurity event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"etc_hosts","description":"Line-parsed /etc/hosts.","platforms":["darwin","linux","windows"],"columns":[{"name":"address","description":"IP address mapping","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hostnames","description":"Raw hosts mapping","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"etc_protocols","description":"Line-parsed /etc/protocols.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Protocol name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"number","description":"Protocol number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"alias","description":"Protocol alias","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Comment with protocol description","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"etc_services","description":"Line-parsed /etc/services.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"port","description":"Service port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Optional space separated list of other names for a service","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional comment for a service.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"event_taps","description":"Returns information about installed event taps.","platforms":["darwin"],"columns":[{"name":"enabled","description":"Is the Event Tap enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"event_tap_id","description":"Unique ID for the Tap","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"event_tapped","description":"The mask that identifies the set of events to be observed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"process_being_tapped","description":"The process ID of the target application","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"tapping_process","description":"The process ID of the application that created the event tap.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"extended_attributes","description":"Returns the extended attributes for files (similar to Windows ADS).","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute file path","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"directory","description":"Directory of file(s)","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the value generated from the extended attribute","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"The parsed information from the attribute","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"base64","description":"1 if the value is base64 encoded else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"fan_speed_sensors","description":"Fan speeds.","platforms":["darwin"],"columns":[{"name":"fan","description":"Fan number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Fan name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"actual","description":"Actual speed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimum speed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum speed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"target","description":"Target speed","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"file","description":"Interactive filesystem attributes and metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"Absolute file path","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"directory","description":"Directory of file(s)","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"Device ID (optional)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"btime","description":"(B)irth or (cr)eate time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"symlink","description":"1 if the path is a symlink, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"attributes","description":"File attrib string. See: https://ss64.com/nt/attrib.html","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"volume_serial","description":"Volume serial number","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"file_id","description":"file ID","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"file_version","description":"File version","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"product_version","description":"File product version","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"original_filename","description":"(Executable files only) Original filename","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"bsd_flags","description":"The BSD file flags (chflags). Possible values: NODUMP, UF_IMMUTABLE, UF_APPEND, OPAQUE, HIDDEN, ARCHIVED, SF_IMMUTABLE, SF_APPEND","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"file_events","description":"Track time/action changes to files specified in configuration data.","platforms":["darwin","linux"],"columns":[{"name":"target_path","description":"The path associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file defined in the config","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"md5","description":"The MD5 of the file after change","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"The SHA1 of the file after change","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"The SHA256 of the file after change","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hashed","description":"1 if the file was hashed, 0 if not, -1 if hashing failed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"firefox_addons","description":"Firefox browser extensions, webapps, and addons.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"The local user that owns the addon","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Addon display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Addon identifier","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"creator","description":"Addon-supported creator string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Extension, addon, webapp","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Addon-supplied version string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Addon-supplied description string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source_url","description":"URL that installed the addon","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"visible","description":"1 If the addon is shown in browser else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If the addon is active else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 If the addon is application-disabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"1 If the addon applies background updates else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"location","description":"Global, profile location","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper","description":"macOS Gatekeeper Details.","platforms":["darwin"],"columns":[{"name":"assessments_enabled","description":"1 If a Gatekeeper is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"dev_id_enabled","description":"1 If a Gatekeeper allows execution from identified developers else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of Gatekeeper's gke.bundle","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"opaque_version","description":"Version of Gatekeeper's gkopaque.bundle","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper_approved_apps","description":"Gatekeeper apps a user has allowed to run.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of executable allowed to run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"requirement","description":"Code signing requirement language","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last change time","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"groups","description":"Local system groups.","platforms":["darwin","linux","windows"],"columns":[{"name":"gid","description":"Unsigned int64 group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid_signed","description":"A signed int64 version of gid","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Canonical local group name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"group_sid","description":"Unique group ID","type":"text","notes":"","hidden":true,"required":false,"index":true,"platforms":["windows","win32","cygwin"]},{"name":"comment","description":"Remarks or comments associated with the group","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"hardware_events","description":"Hardware (PCI/USB/HID) events from UDEV or IOKit.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"Remove, insert, change properties, etc","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Local device path assigned (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of hardware and hardware event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver claiming the device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Hardware device vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded Hardware vendor identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"Hardware device model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded Hardware model identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"Device serial (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"revision","description":"Device revision (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of hardware event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"hash","description":"Filesystem hash data.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"directory","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided filesystem data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided filesystem data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided filesystem data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"homebrew_packages","description":"The installed homebrew package database.","platforms":["darwin"],"columns":[{"name":"name","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Package install path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Current 'linked' version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"prefix","description":"Homebrew install prefix","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"hvci_status","description":"Retrieve HVCI info of the machine.","platforms":["windows"],"columns":[{"name":"version","description":"The version number of the Device Guard build.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instance_identifier","description":"The instance ID of Device Guard.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vbs_status","description":"The status of the virtualization based security settings. Returns UNKNOWN if an error is encountered.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"code_integrity_policy_enforcement_status","description":"The status of the code integrity policy enforcement settings. Returns UNKNOWN if an error is encountered.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"umci_policy_status","description":"The status of the User Mode Code Integrity security settings. Returns UNKNOWN if an error is encountered.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ibridge_info","description":"Information about the Apple iBridge hardware controller.","platforms":["darwin"],"columns":[{"name":"boot_uuid","description":"Boot UUID of the iBridge controller","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"coprocessor_version","description":"The manufacturer and chip version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"firmware_version","description":"The build version of the firmware","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"unique_chip_id","description":"Unique id of the iBridge controller","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ie_extensions","description":"Internet Explorer browser extensions.","platforms":["windows"],"columns":[{"name":"name","description":"Extension display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registry_path","description":"Extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the executable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executable","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"intel_me_info","description":"Intel ME/CSE Info.","platforms":["linux","windows"],"columns":[{"name":"version","description":"Intel ME version","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"interface_addresses","description":"Network interfaces and relevant metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"interface","description":"Interface name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mask","description":"Interface netmask","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"broadcast","description":"Broadcast address for the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"point_to_point","description":"PtP address for the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of address. One of dhcp, manual, auto, other, unknown","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"interface_details","description":"Detailed information and stats of network interfaces.","platforms":["darwin","linux","windows"],"columns":[{"name":"interface","description":"Interface name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC of interface (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Interface type (includes virtual)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Network MTU","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"metric","description":"Metric based on the speed of the interface","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags (netdevice) for the device","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipackets","description":"Input packets","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"opackets","description":"Output packets","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ibytes","description":"Input bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"obytes","description":"Output bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ierrors","description":"Input errors","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"oerrors","description":"Output errors","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"idrops","description":"Input drops","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"odrops","description":"Output drops","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"collisions","description":"Packet Collisions detected","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Time of last device modification (optional)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"link_speed","description":"Interface speed in Mb/s","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"pci_slot","description":"PCI slot number","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"description","description":"Short description of the object a one-line string.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"manufacturer","description":"Name of the network adapter's manufacturer.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"connection_id","description":"Name of the network connection as it appears in the Network Connections Control Panel program.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"connection_status","description":"State of the network adapter connection to the network.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"enabled","description":"Indicates whether the adapter is enabled or not.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"physical_adapter","description":"Indicates whether the adapter is a physical or a logical adapter.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"speed","description":"Estimate of the current bandwidth in bits per second.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"service","description":"The name of the service the network adapter uses.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_enabled","description":"If TRUE, the dynamic host configuration protocol (DHCP) server automatically assigns an IP address to the computer system when establishing a network connection.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_lease_expires","description":"Expiration date and time for a leased IP address that was assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_lease_obtained","description":"Date and time the lease was obtained for the IP address assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_server","description":"IP address of the dynamic host configuration protocol (DHCP) server.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_domain","description":"Organization name followed by a period and an extension that indicates the type of organization, such as 'microsoft.com'.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_domain_suffix_search_order","description":"Array of DNS domain suffixes to be appended to the end of host names during name resolution.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_host_name","description":"Host name used to identify the local computer for authentication by some utilities.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_server_search_order","description":"Array of server IP addresses to be used in querying for DNS servers.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"interface_ipv6","description":"IPv6 configuration and stats of network interfaces.","platforms":["darwin","linux"],"columns":[{"name":"interface","description":"Interface name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hop_limit","description":"Current Hop Limit","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"forwarding_enabled","description":"Enable IP forwarding","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"redirect_accept","description":"Accept ICMP redirect messages","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"rtadv_accept","description":"Accept ICMP Router Advertisement","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"iokit_devicetree","description":"The IOKit registry matching the DeviceTree plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Device node name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent device registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"device_path","description":"Device tree path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service","description":"1 if the device conforms to IOService else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the device is in a busy state else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The device reference count","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"depth","description":"Device nested depth","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"iokit_registry","description":"The full IOKit registry without selecting a plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Default name of the node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the node is in a busy state else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The node reference count","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"depth","description":"Node nested depth","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"iptables","description":"Linux IP packet filtering and NAT tool.","platforms":["linux"],"columns":[{"name":"filter_name","description":"Packet matching filter table name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"chain","description":"Size of module content.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy","description":"Policy that applies for this rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"target","description":"Target that applies for this rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Protocol number identification.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"src_port","description":"Protocol source port(s).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dst_port","description":"Protocol destination port(s).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"src_ip","description":"Source IP address.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"src_mask","description":"Source IP address mask.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iniface","description":"Input interface for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iniface_mask","description":"Input interface mask for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dst_ip","description":"Destination IP address.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dst_mask","description":"Destination IP address mask.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"outiface","description":"Output interface for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"outiface_mask","description":"Output interface mask for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"match","description":"Matching rule that applies.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"packets","description":"Number of matching packets for this rule.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of matching bytes for this rule.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_extensions","description":"macOS's kernel extensions, both loaded and within the load search path.","platforms":["darwin"],"columns":[{"name":"idx","description":"Extension load tag or index","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"refs","description":"Reference count","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Bytes of wired memory used by extension","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"linked_against","description":"Indexes of extensions this extension is linked against","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Optional path to extension bundle","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_info","description":"Basic active kernel information.","platforms":["darwin","linux","windows"],"columns":[{"name":"version","description":"Kernel version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arguments","description":"Kernel arguments","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Kernel path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"Kernel device identifier","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_keys","description":"List of security data, authentication keys and encryption keys.","platforms":["linux"],"columns":[{"name":"serial_number","description":"The serial key of the key.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"A set of flags describing the state of the key.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"usage","description":"the number of threads and open file references thatrefer to this key.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"timeout","description":"The amount of time until the key will expire,expressed in human-readable form. The string perm heremeans that the key is permanent (no timeout). Thestring expd means that the key has already expired.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"The key permissions, expressed as four hexadecimalbytes containing, from left to right, thepossessor, user, group, and other permissions.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The user ID of the key owner.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"The group ID of the key.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The key type.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"The key description.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_modules","description":"Linux kernel modules both loaded and within the load search path.","platforms":["linux"],"columns":[{"name":"name","description":"Module name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of module content","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"used_by","description":"Module reverse dependencies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Kernel module status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Kernel module address","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_panics","description":"System kernel panic logs.","platforms":["darwin"],"columns":[{"name":"path","description":"Location of log file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Formatted time of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registers","description":"A space delimited line of register:value pairs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"frame_backtrace","description":"Backtrace of the crashed module","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"module_backtrace","description":"Modules appearing in the crashed module's backtrace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dependencies","description":"Module dependencies existing in crashed module's backtrace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name corresponding to crashed thread","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os_version","description":"Version of the operating system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Version of the system kernel","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"system_model","description":"Physical system model, for example 'MacBookPro12,1 (Mac-E43C1C25D4880AD6)'","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"System uptime at kernel panic in nanoseconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_loaded","description":"Last loaded module before panic","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_unloaded","description":"Last unloaded module before panic","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"keychain_acls","description":"Applications that have ACL entries in the keychain.","platforms":["darwin"],"columns":[{"name":"keychain_path","description":"The path of the keychain","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authorizations","description":"A space delimited set of authorization attributes","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the authorized application","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"The description included with the ACL entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"An optional label tag that may be included with the keychain entry","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"keychain_items","description":"Generic details about keychain items.","platforms":["darwin"],"columns":[{"name":"label","description":"Generic item name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional item description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional keychain comment","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"account","description":"Optional item account","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Date item was created","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"modified","description":"Date of last modification","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Keychain item type (class)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pk_hash","description":"Hash of associated public key (SHA1 of subjectPublicKey, see RFC 8520 4.2.1.2)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to keychain containing item","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"known_hosts","description":"A line-delimited known_hosts table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local user that owns the known_hosts file","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"parsed authorized keys line","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to known_hosts file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kva_speculative_info","description":"Display kernel virtual address and speculative execution information for the system.","platforms":["windows"],"columns":[{"name":"kva_shadow_enabled","description":"Kernel Virtual Address shadowing is enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kva_shadow_user_global","description":"User pages are marked as global.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kva_shadow_pcid","description":"Kernel VA PCID flushing optimization is enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kva_shadow_inv_pcid","description":"Kernel VA INVPCID is enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bp_mitigations","description":"Branch Prediction mitigations are enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bp_system_pol_disabled","description":"Branch Predictions are disabled via system policy.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bp_microcode_disabled","description":"Branch Predictions are disabled due to lack of microcode update.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_spec_ctrl_supported","description":"SPEC_CTRL MSR supported by CPU Microcode.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ibrs_support_enabled","description":"Windows uses IBRS.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"stibp_support_enabled","description":"Windows uses STIBP.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_pred_cmd_supported","description":"PRED_CMD MSR supported by CPU Microcode.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"last","description":"System logins and logouts.","platforms":["darwin","linux"],"columns":[{"name":"username","description":"Entry username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tty","description":"Entry terminal","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Entry type, according to ut_type types (utmp.h)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type_name","description":"Entry type name, according to ut_type types (utmp.h)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Entry hostname","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"launchd","description":"LaunchAgents and LaunchDaemons from default search paths.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to daemon or agent plist","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"File name of plist (used by launchd)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"Daemon or agent service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"program","description":"Path to target program","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"run_at_load","description":"Should the program run on launch load","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"keep_alive","description":"Should the process be restarted if killed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"on_demand","description":"Deprecated key, replaced by keep_alive","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"disabled","description":"Skip loading this daemon or agent on boot","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Run this daemon or agent as this username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Run this daemon or agent as this group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"stdout_path","description":"Pipe stdout to a target path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"stderr_path","description":"Pipe stderr to a target path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start_interval","description":"Frequency to run in seconds","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"program_arguments","description":"Command line arguments passed to program","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"watch_paths","description":"Key that launches daemon or agent if path is modified","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"queue_directories","description":"Similar to watch_paths but only with non-empty directories","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inetd_compatibility","description":"Run this daemon or agent as it was launched from inetd","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start_on_mount","description":"Run daemon or agent every time a filesystem is mounted","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root_directory","description":"Key used to specify a directory to chroot to before launch","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"working_directory","description":"Key used to specify a directory to chdir to before launch","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"process_type","description":"Key describes the intended purpose of the job","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"launchd_overrides","description":"Override keys, per user, for LaunchDaemons and Agents.","platforms":["darwin"],"columns":[{"name":"label","description":"Daemon or agent service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Name of the override key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Overridden value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID applied to the override, 0 applies to all","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to daemon or agent plist","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"listening_ports","description":"Processes with listening (bound) network sockets/ports.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"port","description":"Transport layer port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for bind","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"Socket file descriptor number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path for UNIX domain sockets","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]}]},{"name":"load_average","description":"Displays information about the system wide load averages.","platforms":["darwin","linux"],"columns":[{"name":"period","description":"Period over which the average is calculated.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"average","description":"Load average over the specified period.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"location_services","description":"Reports the status of the Location Services feature of the OS.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 if Location Services are enabled, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"logged_in_users","description":"Users with an active shell on the system.","platforms":["darwin","linux","windows"],"columns":[{"name":"type","description":"Login type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"User login name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tty","description":"Device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Remote hostname","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time entry was made","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"The user's unique security identifier","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"registry_hive","description":"HKEY_USERS registry hive","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"logical_drives","description":"Details for logical drives on the system. A logical drive generally represents a single partition.","platforms":["windows"],"columns":[{"name":"device_id","description":"The drive id, usually the drive name, e.g., 'C:'.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Deprecated (always 'Unknown').","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"The canonical description of the drive, e.g. 'Logical Fixed Disk', 'CD-ROM Disk'.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"free_space","description":"The amount of free space, in bytes, of the drive (-1 on failure).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"The total amount of space, in bytes, of the drive (-1 on failure).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"file_system","description":"The file system of the drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"boot_partition","description":"True if Windows booted from this drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"logon_sessions","description":"Windows Logon Session.","platforms":["windows"],"columns":[{"name":"logon_id","description":"A locally unique identifier (LUID) that identifies a logon session.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"The account name of the security principal that owns the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_domain","description":"The name of the domain used to authenticate the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authentication_package","description":"The authentication package used to authenticate the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_type","description":"The logon method.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"session_id","description":"The Terminal Services session identifier.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_sid","description":"The user's security identifier (SID).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_time","description":"The time the session owner logged on.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_server","description":"The name of the server used to authenticate the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dns_domain_name","description":"The DNS name for the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"upn","description":"The user principal name (UPN) for the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_script","description":"The script used for logging on.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The home directory for the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"home_directory","description":"The home directory for the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"home_directory_drive","description":"The drive location of the home directory of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_certificates","description":"LXD certificates information.","platforms":["linux"],"columns":[{"name":"name","description":"Name of the certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fingerprint","description":"SHA256 hash of the certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"certificate","description":"Certificate content","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster","description":"LXD cluster information.","platforms":["linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether clustering enabled (1) or not (0) on this node","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_entity","description":"Type of configuration parameter for this node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_name","description":"Name of configuration parameter","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_key","description":"Config key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_value","description":"Config value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_description","description":"Config description","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster_members","description":"LXD cluster members information.","platforms":["linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"url","description":"URL of the node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"database","description":"Whether the server is a database node (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the node (Online/Offline)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the node (Online/Offline)","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_images","description":"LXD images information.","platforms":["linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"architecture","description":"Target architecture for the image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"OS on which image is based","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"release","description":"OS release version on which the image is based","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Image description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Comma-separated list of image aliases","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Filename of the image file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of image in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"auto_update","description":"Whether the image auto-updates (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cached","description":"Whether image is cached (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"public","description":"Whether image is public (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of image creation","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"expires_at","description":"ISO time of image expiration","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uploaded_at","description":"ISO time of image upload","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_used_at","description":"ISO time for the most recent use of this image in terms of container spawn","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_server","description":"Server for image update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_protocol","description":"Protocol used for image information update and image import from source server","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_certificate","description":"Certificate for update source server","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_alias","description":"Alias of image at update source server","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_config","description":"LXD instance configuration information.","platforms":["linux"],"columns":[{"name":"name","description":"Instance name","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"key","description":"Configuration parameter name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Configuration parameter value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_devices","description":"LXD instance devices information.","platforms":["linux"],"columns":[{"name":"name","description":"Instance name","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"device","description":"Name of the device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_type","description":"Device type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Device info param name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Device info param value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_instances","description":"LXD instances information.","platforms":["linux"],"columns":[{"name":"name","description":"Instance name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"status","description":"Instance state (running, stopped, etc.)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"stateful","description":"Whether the instance is stateful(1) or not(0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ephemeral","description":"Whether the instance is ephemeral(1) or not(0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of creation","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"base_image","description":"ID of image used to launch this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Instance architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"The OS of this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Instance description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Instance's process ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"processes","description":"Number of processes running inside this instance","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_networks","description":"LXD network information.","platforms":["linux"],"columns":[{"name":"name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"managed","description":"1 if network created by LXD, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_address","description":"IPv4 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"used_by","description":"URLs for containers using this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_received","description":"Number of bytes received on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_sent","description":"Number of bytes sent on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"packets_received","description":"Number of packets received on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"packets_sent","description":"Number of packets sent on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hwaddr","description":"Hardware address for this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Network status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mtu","description":"MTU size","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_storage_pools","description":"LXD storage pool information.","platforms":["linux"],"columns":[{"name":"name","description":"Name of the storage pool","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Storage driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Storage pool source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the storage pool","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"space_used","description":"Storage space used in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"space_total","description":"Total available storage space in bytes for this storage pool","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes_used","description":"Number of inodes used","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes_total","description":"Total number of inodes available in this storage pool","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"magic","description":"Magic number recognition library table.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute path to target file","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"magic_db_files","description":"Colon(:) separated list of files where the magic db file can be found. By default one of the following is used: /usr/share/file/magic/magic, /usr/share/misc/magic or /usr/share/misc/magic.mgc","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Magic number data from libmagic","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mime_type","description":"MIME type data from libmagic","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mime_encoding","description":"MIME encoding data from libmagic","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"managed_policies","description":"The managed configuration policies from AD, MDM, MCX, etc.","platforms":["darwin"],"columns":[{"name":"domain","description":"System or manager-chosen domain key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Optional UUID assigned to policy set","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Policy key name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Policy value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Policy applies only this user","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manual","description":"1 if policy was loaded manually, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"md_devices","description":"Software RAID array settings.","platforms":["linux"],"columns":[{"name":"device_name","description":"md device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Current state of the array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"raid_level","description":"Current raid level of the array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"size of the array in blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"chunk_size","description":"chunk size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"raid_disks","description":"Number of configured RAID disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nr_raid_disks","description":"Number of partitions or disk devices to comprise the array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"working_disks","description":"Number of working disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active_disks","description":"Number of active disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"failed_disks","description":"Number of failed disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"spare_disks","description":"Number of idle disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"superblock_state","description":"State of the superblock","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"superblock_version","description":"Version of the superblock","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"superblock_update_time","description":"Unix timestamp of last update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"bitmap_on_mem","description":"Pages allocated in in-memory bitmap, if enabled","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bitmap_chunk_size","description":"Bitmap chunk size","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bitmap_external_file","description":"External referenced bitmap file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"recovery_progress","description":"Progress of the recovery activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"recovery_finish","description":"Estimated duration of recovery activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"recovery_speed","description":"Speed of recovery activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resync_progress","description":"Progress of the resync activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resync_finish","description":"Estimated duration of resync activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resync_speed","description":"Speed of resync activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reshape_progress","description":"Progress of the reshape activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reshape_finish","description":"Estimated duration of reshape activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reshape_speed","description":"Speed of reshape activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"check_array_progress","description":"Progress of the check array activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"check_array_finish","description":"Estimated duration of the check array activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"check_array_speed","description":"Speed of the check array activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"unused_devices","description":"Unused devices","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"other","description":"Other information associated with array from /proc/mdstat","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"md_drives","description":"Drive devices used for Software RAID.","platforms":["linux"],"columns":[{"name":"md_device_name","description":"md device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"drive_name","description":"Drive device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"slot","description":"Slot position of disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the drive","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"md_personalities","description":"Software RAID setting supported by the kernel.","platforms":["linux"],"columns":[{"name":"name","description":"Name of personality supported by kernel","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"mdfind","description":"Run searches against the spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file returned from spotlight","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query","description":"The query that was run to find the file","type":"text","notes":"","hidden":false,"required":true,"index":false}]},{"name":"mdls","description":"Query file metadata in the Spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the metadata key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Value stored in the metadata key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"valuetype","description":"CoreFoundation type of data stored in value","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"memory_array_mapped_addresses","description":"Data associated for address mapping of physical memory arrays.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_array_handle","description":"Handle of the memory array associated with this structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partition_width","description":"Number of memory devices that form a single row of memory for the address partition of this structure","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_arrays","description":"Data associated with collection of memory devices that operate to form a memory address.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"location","description":"Physical location of the memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"use","description":"Function for which the array is used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_error_correction","description":"Primary hardware error correction or detection method supported","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"Maximum capacity of array in gigabytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_error_info_handle","description":"Handle, or instance number, associated with any error that was detected for the array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"number_memory_devices","description":"Number of memory devices on array","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_device_mapped_addresses","description":"Data associated for address mapping of physical memory devices.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_device_handle","description":"Handle of the memory device structure associated with this structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_array_mapped_address_handle","description":"Handle of the memory array mapped address to which this device range is mapped to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partition_row_position","description":"Identifies the position of the referenced memory device in a row of the address partition","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"interleave_position","description":"The position of the device in a interleave, i.e. 0 indicates non-interleave, 1 indicates 1st interleave, 2 indicates 2nd interleave, etc.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"interleave_data_depth","description":"The max number of consecutive rows from memory device that are accessed in a single interleave transfer; 0 indicates device is non-interleave","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_devices","description":"Physical memory device (type 17) information retrieved from SMBIOS.","platforms":["darwin","linux","windows"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure in SMBIOS","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"array_handle","description":"The memory array that the device is attached to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"form_factor","description":"Implementation form factor for this memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"total_width","description":"Total width, in bits, of this memory device, including any check or error-correction bits","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"data_width","description":"Data width, in bits, of this memory device","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of memory device in Megabyte","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"set","description":"Identifies if memory device is one of a set of devices. A value of 0 indicates no set affiliation.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"device_locator","description":"String number of the string that identifies the physically-labeled socket or board position where the memory device is located","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bank_locator","description":"String number of the string that identifies the physically-labeled bank where the memory device is located","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_type","description":"Type of memory used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_type_details","description":"Additional details for memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"max_speed","description":"Max speed of memory device in megatransfers per second (MT/s)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"configured_clock_speed","description":"Configured speed of memory device in megatransfers per second (MT/s)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Manufacturer ID string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Serial number of memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"asset_tag","description":"Manufacturer specific asset tag of memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"part_number","description":"Manufacturer specific serial number of memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"min_voltage","description":"Minimum operating voltage of device in millivolts","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_voltage","description":"Maximum operating voltage of device in millivolts","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"configured_voltage","description":"Configured operating voltage of device in millivolts","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_error_info","description":"Data associated with errors of a physical memory array.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_type","description":"type of error associated with current error status for array or device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_granularity","description":"Granularity to which the error can be resolved","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_operation","description":"Memory access operation that caused the error","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_syndrome","description":"Vendor specific ECC syndrome or CRC data associated with the erroneous access","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_array_error_address","description":"32 bit physical address of the error based on the addressing of the bus to which the memory array is connected","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_error_address","description":"32 bit physical address of the error relative to the start of the failing memory address, in bytes","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_resolution","description":"Range, in bytes, within which this error can be determined, when an error address is given","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_info","description":"Main memory information in bytes.","platforms":["linux"],"columns":[{"name":"memory_total","description":"Total amount of physical RAM, in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_free","description":"The amount of physical RAM, in bytes, left unused by the system","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_available","description":"The amount of physical RAM, in bytes, available for starting new applications, without swapping","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"buffers","description":"The amount of physical RAM, in bytes, used for file buffers","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cached","description":"The amount of physical RAM, in bytes, used as cache memory","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_cached","description":"The amount of swap, in bytes, used as cache memory","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"The total amount of buffer or page cache memory, in bytes, that is in active use","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inactive","description":"The total amount of buffer or page cache memory, in bytes, that are free and available","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_total","description":"The total amount of swap available, in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_free","description":"The total amount of swap free, in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_map","description":"OS memory region map.","platforms":["linux"],"columns":[{"name":"name","description":"Region name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start","description":"Start address of memory region","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"end","description":"End address of memory region","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"mounts","description":"System mounted devices and filesystems (not process specific).","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Mounted device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_alias","description":"Mounted device alias","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Mounted device path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Mounted device type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Block size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Mounted device used blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_free","description":"Mounted device free blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_available","description":"Mounted device available blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Mounted device used inodes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes_free","description":"Mounted device free inodes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"Mounted device flags","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"msr","description":"Various pieces of data stored in the model specific register per processor. NOTE: the msr kernel module must be enabled, and osquery must be run as root.","platforms":["linux"],"columns":[{"name":"processor_number","description":"The processor number as reported in /proc/cpuinfo","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"turbo_disabled","description":"Whether the turbo feature is disabled.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"turbo_ratio_limit","description":"The turbo feature ratio limit.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_info","description":"Platform information.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"perf_ctl","description":"Performance setting for the processor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"perf_status","description":"Performance status for the processor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"feature_control","description":"Bitfield controlling enabled features.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"rapl_power_limit","description":"Run Time Average Power Limiting power limit.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"rapl_energy_status","description":"Run Time Average Power Limiting energy status.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"rapl_power_units","description":"Run Time Average Power Limiting power units.","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"nfs_shares","description":"NFS shares exported by the host.","platforms":["darwin"],"columns":[{"name":"share","description":"Filesystem path to the share","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"options","description":"Options string set on the export share","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"readonly","description":"1 if the share is exported readonly else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"npm_packages","description":"Node packages installed in a system.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Package-supplied description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Package-supplied author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"homepage","description":"Package supplied homepage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this module resides","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"Directory where node_modules are located","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"ntdomains","description":"Display basic NT domain information of a Windows machine.","platforms":["windows"],"columns":[{"name":"name","description":"The label by which the object is known.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"client_site_name","description":"The name of the site where the domain controller is configured.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dc_site_name","description":"The name of the site where the domain controller is located.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dns_forest_name","description":"The name of the root of the DNS tree.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain_controller_address","description":"The IP Address of the discovered domain controller..","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain_controller_name","description":"The name of the discovered domain controller.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain_name","description":"The name of the domain.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"The current status of the domain object.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ntfs_acl_permissions","description":"Retrieve NTFS ACL permission information for files and directories.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the file or directory.","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"type","description":"Type of access mode for the access control entry.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"principal","description":"User or group to which the ACE applies.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"access","description":"Specific permissions that indicate the rights described by the ACE.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inherited_from","description":"The inheritance policy of the ACE.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ntfs_journal_events","description":"Track time/action changes to files specified in configuration data.","platforms":["windows"],"columns":[{"name":"action","description":"Change action (Write, Delete, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The category that the event originated from","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"old_path","description":"Old path (renames only)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"record_timestamp","description":"Journal record timestamp","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"record_usn","description":"The update sequence number that identifies the journal record","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"node_ref_number","description":"The ordinal that associates a journal record with a filename","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent_ref_number","description":"The ordinal that associates a journal record with a filename's parent directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"The drive letter identifying the source journal","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"file_attributes","description":"File attributes","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partial","description":"Set to 1 if either path or old_path only contains the file or folder name","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"nvram","description":"Apple NVRAM variable listing.","platforms":["darwin"],"columns":[{"name":"name","description":"Variable name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Data type (CFData, CFString, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Raw variable data","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"oem_strings","description":"OEM defined strings retrieved from SMBIOS.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the Type 11 structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"number","description":"The string index of the structure","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"The value of the OEM string","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"office_mru","description":"View recently opened Office documents.","platforms":["windows"],"columns":[{"name":"application","description":"Associated Office application","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Office application version number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"File path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"Most recent opened time file was opened","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"os_version","description":"A single row containing the operating system name and version.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Distribution or product name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Pretty, suitable for presentation, OS version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"major","description":"Major release version","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minor","description":"Minor release version","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"patch","description":"Optional patch release","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"build","description":"Optional build-specific or variant string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform","description":"OS Platform or ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_like","description":"Closely related platforms","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"codename","description":"OS version codename","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"OS Architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extra","description":"Optional extra release specification","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"install_date","description":"The install date of the OS.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"osquery_events","description":"Information about the event publishers and subscribers.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Event publisher or subscriber name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the associated publisher","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Either publisher or subscriber","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subscriptions","description":"Number of subscriptions the publisher received or subscriber used","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"events","description":"Number of events emitted or received since osquery started","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"refreshes","description":"Publisher only: number of runloop restarts","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"1 if the publisher or subscriber is active else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_extensions","description":"List of active osquery extensions.","platforms":["darwin","linux","windows"],"columns":[{"name":"uuid","description":"The transient ID assigned for communication","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension's name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension's version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdk_version","description":"osquery SDK version used to build the extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the extension's Thrift connection or library path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"SDK extension type: core, extension, or module","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_flags","description":"Configurable flags that modify osquery's behavior.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Flag name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Flag type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Flag description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"default_value","description":"Flag default value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Flag value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shell_only","description":"Is the flag shell only?","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_info","description":"Top level information about the running version of osquery.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread/handle) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instance_id","description":"Unique, long-lived ID per instance of osquery","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"osquery toolkit version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_hash","description":"Hash of the working configuration state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_valid","description":"1 if the config was loaded and considered valid, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"extensions","description":"osquery extensions status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_platform","description":"osquery toolkit build platform","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_distro","description":"osquery toolkit platform distribution name (os version)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"UNIX time in seconds when the process started","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"watcher","description":"Process (or thread/handle) ID of optional watcher process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_mask","description":"The osquery platform bitmask","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_packs","description":"Information about the current query packs that are loaded in osquery.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"The given name for this query pack","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform","description":"Platforms this query is supported on","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Minimum osquery version that this query will run on","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shard","description":"Shard restriction limit, 1-100, 0 meaning no restriction","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"discovery_cache_hits","description":"The number of times that the discovery query used cached values since the last time the config was reloaded","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"discovery_executions","description":"The number of times that the discovery queries have been executed since the last time the config was reloaded","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"Whether this pack is active (the version, platform and discovery queries match) yes=1, no=0.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_registry","description":"List the osquery registry plugins.","platforms":["darwin","linux","windows"],"columns":[{"name":"registry","description":"Name of the osquery registry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the plugin item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_uuid","description":"Extension route UUID (0 for core)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"internal","description":"1 If the plugin is internal else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If this plugin is active else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_schedule","description":"Information about the current queries that are scheduled in osquery.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"The given name for this query","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query","description":"The exact query to run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"interval","description":"The interval in seconds to run this query, not an exact interval","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"executions","description":"Number of times the query was executed","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_executed","description":"UNIX time stamp in seconds of the last completed execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"denylisted","description":"1 if the query is denylisted else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"output_size","description":"Cumulative total number of bytes generated by the resultant rows of the query","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wall_time","description":"Total wall time in seconds spent executing (deprecated), hidden=True","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wall_time_ms","description":"Total wall time in milliseconds spent executing","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_wall_time_ms","description":"Wall time in milliseconds of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"user_time","description":"Total user time in milliseconds spent executing","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_user_time","description":"User time in milliseconds of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_time","description":"Total system time in milliseconds spent executing","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_system_time","description":"System time in milliseconds of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"average_memory","description":"Average of the bytes of resident memory left allocated after collecting results","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_memory","description":"Resident memory in bytes left allocated after collecting results of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"package_bom","description":"macOS package bill of materials (BOM) file list.","platforms":["darwin"],"columns":[{"name":"filepath","description":"Package file or directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Expected user of file or directory","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Expected group of file or directory","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Expected permissions","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Timestamp the file was installed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of package bom","type":"text","notes":"","hidden":false,"required":true,"index":false}]},{"name":"package_install_history","description":"macOS package install history.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Label packageIdentifiers","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Label date as UNIX timestamp","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package display version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Install source: usually the installer process name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"content_type","description":"Package content_type (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"package_receipts","description":"macOS package receipt details.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Package domain identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"package_filename","description":"Filename of original .pkg file","type":"text","notes":"","hidden":true,"required":false,"index":true},{"name":"version","description":"Installed package version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"location","description":"Optional relative install path on volume","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Timestamp of install time","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"installer_name","description":"Name of installer process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of receipt plist","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"password_policy","description":"Password Policies for macOS.","platforms":["darwin"],"columns":[{"name":"uid","description":"User ID for the policy, -1 for policies that are global","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"policy_identifier","description":"Policy Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_content","description":"Policy content","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_description","description":"Policy description","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"patches","description":"Lists all the patches applied. Note: This does not include patches applied via MSI or downloaded from Windows Update (e.g. Service Packs).","platforms":["windows"],"columns":[{"name":"csname","description":"The name of the host the patch is installed on.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hotfix_id","description":"The KB ID of the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"caption","description":"Short description of the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Fuller description of the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fix_comments","description":"Additional comments about the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"installed_by","description":"The system context in which the patch as installed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the patch was installed. Lack of a value does not indicate that the patch was not installed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"installed_on","description":"The date when the patch was installed.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"pci_devices","description":"PCI devices active on the host system.","platforms":["darwin","linux"],"columns":[{"name":"pci_slot","description":"PCI Device used slot","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pci_class","description":"PCI Device class","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"PCI Device used driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"PCI Device vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded PCI Device vendor identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"PCI Device model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded PCI Device model identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pci_class_id","description":"PCI Device class ID in hex format","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"pci_subclass_id","description":"PCI Device subclass in hex format","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"pci_subclass","description":"PCI Device subclass","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_vendor_id","description":"Vendor ID of PCI device subsystem","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_vendor","description":"Vendor of PCI device subsystem","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_model_id","description":"Model ID of PCI device subsystem","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_model","description":"Device description of PCI device subsystem","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]}]},{"name":"physical_disk_performance","description":"Provides provides raw data from performance counters that monitor hard or fixed disk drives on the system.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the physical disk","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_read","description":"Average number of bytes transferred from the disk during read operations","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_write","description":"Average number of bytes transferred to the disk during write operations","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_read_queue_length","description":"Average number of read requests that were queued for the selected disk during the sample interval","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_write_queue_length","description":"Average number of write requests that were queued for the selected disk during the sample interval","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_read","description":"Average time, in seconds, of a read operation of data from the disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_write","description":"Average time, in seconds, of a write operation of data to the disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"current_disk_queue_length","description":"Number of requests outstanding on the disk at the time the performance data is collected","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_disk_read_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read requests","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_disk_write_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing write requests","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_disk_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read or write requests","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_idle_time","description":"Percentage of time during the sample interval that the disk was idle","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"pipes","description":"Named and Anonymous pipes.","platforms":["windows"],"columns":[{"name":"pid","description":"Process ID of the process to which the pipe belongs","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of the pipe","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instances","description":"Number of instances of the named pipe","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_instances","description":"The maximum number of instances creatable for this pipe","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"The flags indicating whether this pipe connection is a server or client end, and if the pipe for sending messages or bytes","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"platform_info","description":"Information about EFI/UEFI/ROM and platform/boot.","platforms":["darwin","linux","windows"],"columns":[{"name":"vendor","description":"Platform code vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Platform code version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"date","description":"Self-reported platform code update date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"revision","description":"BIOS major and minor revision","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extra","description":"Platform-specific additional information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"firmware_type","description":"The type of firmware (uefi, bios, iboot, openfirmware, unknown).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Relative address of firmware mapping","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"size","description":"Size in bytes of firmware","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"volume_size","description":"(Optional) size of firmware volume","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]}]},{"name":"plist","description":"Read and parse a plist file.","platforms":["darwin"],"columns":[{"name":"key","description":"Preference top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subkey","description":"Intermediate key path, includes lists/dicts","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"(required) read preferences from a plist","type":"text","notes":"","hidden":false,"required":true,"index":false}]},{"name":"portage_keywords","description":"A summary about portage configurations like keywords, mask and unmask.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"keyword","description":"The keyword applied to the package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mask","description":"If the package is masked","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"unmask","description":"If the package is unmasked","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"portage_packages","description":"List of currently installed packages.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"slot","description":"The slot used by package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Unix time when package was built","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"repository","description":"From which repository the ebuild was used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eapi","description":"The eapi for the ebuild","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the package","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"world","description":"If package is in the world file","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"portage_use","description":"List of enabled portage USE values for specific package.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The version of the installed package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"use","description":"USE flag which has been enabled for package","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"power_sensors","description":"Machine power (currents, voltages, wattages, etc) sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on macOS","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"category","description":"The sensor category: currents, voltage, wattage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of power source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Power in Watts","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"powershell_events","description":"Powershell script blocks reconstructed to their full script content, this table requires script block logging to be enabled.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received by the osquery event publisher","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the Powershell script event occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_block_id","description":"The unique GUID of the powershell script to which this block belongs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_block_count","description":"The total number of script blocks for this script","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"script_text","description":"The text content of the Powershell script","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_name","description":"The name of the Powershell script","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_path","description":"The path for the Powershell script","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cosine_similarity","description":"How similar the Powershell script is to a provided 'normal' character frequency","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"preferences","description":"macOS defaults and managed preferences.","platforms":["darwin"],"columns":[{"name":"domain","description":"Application ID usually in com.name.product format","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Preference top-level key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"subkey","description":"Intemediate key path, includes lists/dicts","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"forced","description":"1 if the value is forced/managed, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"(optional) read preferences for a specific user","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"'current' or 'any' host, where 'current' takes precedence","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"prefetch","description":"Prefetch files show metadata related to file execution.","platforms":["windows"],"columns":[{"name":"path","description":"Prefetch file path.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Executable filename.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hash","description":"Prefetch CRC hash.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Most recent time application was run.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"other_run_times","description":"Other execution times in prefetch file.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"run_count","description":"Number of times the application has been run.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Application file size.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"volume_creation","description":"Volume creation time.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_files_count","description":"Number of files accessed.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_directories_count","description":"Number of directories accessed.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_files","description":"Files accessed by application within ten seconds of launch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_directories","description":"Directories accessed by application within ten seconds of launch.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_envs","description":"A key/value table of environment variables for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Environment variable name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Environment variable value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_etw_events","description":"Windows process execution events.","platforms":["windows"],"columns":[{"name":"type","description":"Event Type (ProcessStart, ProcessStop)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ppid","description":"Parent Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"session_id","description":"Session ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"Process Flags","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit Code - Present only on ProcessStop events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed binary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command Line","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"User rights - primary token username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"token_elevation_type","description":"Primary token elevation type - Present only on ProcessStart events","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"token_elevation_status","description":"Primary token elevation status - Present only on ProcessStart events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mandatory_label","description":"Primary token mandatory label sid - Present only on ProcessStart events","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Event timestamp in DATETIME format","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time_windows","description":"Event timestamp in Windows format","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"time","description":"Event timestamp in Unix format","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"header_pid","description":"Process ID of the process reporting the event","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"process_sequence_number","description":"Process Sequence Number - Present only on ProcessStart events","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"parent_process_sequence_number","description":"Parent Process Sequence Number - Present only on ProcessStart events","type":"bigint","notes":"","hidden":true,"required":false,"index":false}]},{"name":"process_events","description":"Track time/action process executions.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"File mode permissions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline_size","description":"Actual size (bytes) of command line arguments","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"env_size","description":"Actual size (bytes) of environment list","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"File owner user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_gid","description":"File owner group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"File last access in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"File modification in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"File last metadata change in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"btime","description":"File creation in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"overflows","description":"List of structures that overflowed","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"parent","description":"Process parent's PID, or -1 if cannot be determined.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"status","description":"OpenBSM Attribute: Status of the process","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"fsuid","description":"Filesystem user ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"suid","description":"Saved user ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"fsgid","description":"Filesystem group ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"sgid","description":"Saved group ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]},{"name":"syscall","description":"Syscall name: fork, vfork, clone, execve, execveat","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]}]},{"name":"process_file_events","description":"A File Integrity Monitor implementation using the audit service.","platforms":["linux"],"columns":[{"name":"operation","description":"Operation type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ppid","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"executable","description":"The executable path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partial","description":"True if this is a partial event (i.e.: this process existed before we started osquery)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The current working directory of the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dest_path","description":"The canonical path associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The uid of the process performing the action","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"The gid of the process performing the action","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fsgid","description":"Filesystem group ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"process_memory_map","description":"Process memory mapped files and pseudo device/regions.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"start","description":"Virtual start address (hex)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"end","description":"Virtual end address (hex)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"r=read, w=write, x=execute, p=private (cow)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"offset","description":"Offset into mapped path","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"MA:MI Major/minor device ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Mapped path inode, 0 means uninitialized (BSS)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to mapped file or mapped type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pseudo","description":"1 If path is a pseudo path, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_namespaces","description":"Linux namespaces for processes running on the host system.","platforms":["linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"cgroup_namespace","description":"cgroup namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipc_namespace","description":"ipc namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mnt_namespace","description":"mnt namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"net namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_namespace","description":"pid namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_namespace","description":"user namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uts_namespace","description":"uts namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_open_files","description":"File descriptors for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"fd","description":"Process-specific file descriptor number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Filesystem path of descriptor","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_open_pipes","description":"Pipes and partner processes for each process.","platforms":["linux"],"columns":[{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"File descriptor","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Pipe open mode (r/w)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Pipe inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Pipe Type: named vs unnamed/anonymous","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partner_pid","description":"Process ID of partner process sharing a particular pipe","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"partner_fd","description":"File descriptor of shared pipe at partner's end","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"partner_mode","description":"Mode of shared pipe at partner's end","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_open_sockets","description":"Processes which have open network sockets on the system.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"fd","description":"Socket file descriptor number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Socket local address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Socket remote address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Socket local port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Socket remote port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"For UNIX sockets (family=AF_UNIX), the domain path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"TCP socket state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]}]},{"name":"processes","description":"All running processes on the host system.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executed binary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root","description":"Process virtual root directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Unsigned user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Unsigned group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Unsigned effective user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Unsigned effective group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Unsigned saved user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Unsigned saved group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"on_disk","description":"The process path exists yes=1, no=0, unknown=-1","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"user_time","description":"CPU time in milliseconds spent in user space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_time","description":"CPU time in milliseconds spent in kernel space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_read","description":"Bytes read from disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_written","description":"Bytes written to disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start time in seconds since Epoch, in case of error -1","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"elevated_token","description":"Process uses elevated token yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"secure_process","description":"Process is secure (IUM) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"protection_type","description":"The protection type of the process","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"virtual_process","description":"Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"elapsed_time","description":"Elapsed time in seconds this process has been running.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"handle_count","description":"Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"percent_processor_time","description":"Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"upid","description":"A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"uppid","description":"The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_type","description":"Indicates the specific processor designed for installation.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_subtype","description":"Indicates the specific processor on which an entry may be used.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"translated","description":"Indicates whether the process is running under the Rosetta Translation Environment, yes=1, no=0, error=-1.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"cgroup_path","description":"The full hierarchical path of the process's control group","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]}]},{"name":"programs","description":"Represents products as they are installed by Windows Installer. A product generally correlates to one installation package on Windows. Some fields may be blank as Windows installation details are left to the discretion of the product author.","platforms":["windows"],"columns":[{"name":"name","description":"Commonly used product name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Product version information.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_location","description":"The installation location directory of the product.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_source","description":"The installation source of the product.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"language","description":"The language of the product.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the product supplier.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uninstall_string","description":"Path and filename of the uninstaller.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Date that this product was installed on the system. ","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifying_number","description":"Product identification such as a serial number on software, or a die number on a hardware chip.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"prometheus_metrics","description":"Retrieve metrics from a Prometheus server.","platforms":["darwin","linux"],"columns":[{"name":"target_name","description":"Address of prometheus target","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"metric_name","description":"Name of collected Prometheus metric","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"metric_value","description":"Value of collected Prometheus metric","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"timestamp_ms","description":"Unix timestamp of collected data in MS","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"python_packages","description":"Python packages installed in a system.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this module resides","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"Directory where Python modules are located","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"quicklook_cache","description":"Files and thumbnails within macOS's Quicklook Cache.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rowid","description":"Quicklook file rowid key","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"fs_id","description":"Quicklook file fs_id key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"volume_id","description":"Parsed volume ID from fs_id","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Parsed file ID (inode) from fs_id","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Parsed version date field","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Parsed version size field","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"Parsed version 'gen' field","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_hit_date","description":"Apple date format for last thumbnail cache hit","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"hit_count","description":"Number of cache hits on thumbnail","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"icon_mode","description":"Thumbnail icon mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cache_path","description":"Path to cache data","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"registry","description":"All of the Windows registry hives.","platforms":["windows"],"columns":[{"name":"key","description":"Name of the key to search for","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Full path to the value","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of the registry value entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the registry value, or 'subkey' if item is a subkey","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Data content of registry value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"timestamp of the most recent registry write","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"routes","description":"The active route table for the host system.","platforms":["darwin","linux","windows"],"columns":[{"name":"destination","description":"Destination IP address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Netmask length","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Route gateway","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Route source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags to describe route","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"interface","description":"Route local interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Maximum Transmission Unit for the route","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"metric","description":"Cost of route. Lowest is preferred","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of route","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hopcount","description":"Max hops expected","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]}]},{"name":"rpm_package_files","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"package","description":"RPM package name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"path","description":"File path within the package","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"username","description":"File default username from info DB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"File default groupname from info DB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"File permissions mode from info DB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size in bytes from RPM info DB","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 file digest from RPM info DB","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"rpm_packages","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"name","description":"RPM package name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"version","description":"Package version","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"release","description":"Package release","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"source","description":"Source RPM package name (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the package contents","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Architecture(s) supported","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"epoch","description":"Package epoch value","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"install_time","description":"When the package was installed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Package vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"package_group","description":"Package group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"running_apps","description":"macOS applications currently running on the host system.","platforms":["darwin"],"columns":[{"name":"pid","description":"The pid of the application","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"bundle_identifier","description":"The bundle identifier of the application","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"is_active","description":"(DEPRECATED)","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"safari_extensions","description":"Safari browser extension details for all users. This table requires Full Disk Access (FDA) permission.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the extension","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Extension display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension long version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Bundle SDK used to compile extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Optional developer identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional extension description text","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension XAR bundle","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_version","description":"The version of the build that identifies an iteration of the bundle","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"copyright","description":"A human-readable copyright notice for the bundle","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extension_type","description":"Extension Type: WebOrAppExtension or LegacyExtension","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sandboxes","description":"macOS application sandboxes container details.","platforms":["darwin"],"columns":[{"name":"label","description":"UTI-format bundle or label ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"Sandbox owner","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Application sandboxings enabled on container","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"build_id","description":"Sandbox-specific identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"Application bundle used by the sandbox","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to sandbox container directory","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"scheduled_tasks","description":"Lists all of the tasks in the Windows task scheduler.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the scheduled task","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Actions executed by the scheduled task","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the executable to be run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether or not the scheduled task is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the scheduled task","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hidden","description":"Whether or not the task is visible in the UI","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Timestamp the task last ran","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"next_run_time","description":"Timestamp the task is scheduled to run next","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_message","description":"Exit status message of the last task run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_code","description":"Exit status code of the last task run","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"screenlock","description":"macOS screenlock status. Note: only fetches results for osquery's current logged-in user context. The user must also have recently logged in.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 If a password is required after sleep or the screensaver begins; else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"grace_period","description":"The amount of time in seconds the screen must be asleep or the screensaver on before a password is required on-wake. 0 = immediately; -1 = no password is required on-wake","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"seccomp_events","description":"A virtual table that tracks seccomp events.","platforms":["linux"],"columns":[{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID (loginuid) of the user who started the analyzed process","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the user who started the analyzed process","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the user who started the analyzed process","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ses","description":"Session ID of the session from which the analyzed process was invoked","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exe","description":"The path to the executable that was used to invoke the analyzed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sig","description":"Signal value sent to process by seccomp","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Information about the CPU architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"syscall","description":"Type of the system call","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"compat","description":"Is system call in compatibility mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ip","description":"Instruction pointer value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"code","description":"The seccomp action","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"secureboot","description":"Secure Boot UEFI Settings.","platforms":["darwin","linux","windows"],"columns":[{"name":"secure_boot","description":"Whether secure boot is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"secure_mode","description":"Secure mode for Intel-based macOS: 0 disabled, 1 full security, 2 medium security","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"setup_mode","description":"Whether setup mode is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","windows","win32","cygwin"]}]},{"name":"security_profile_info","description":"Information on the security profile of a given system by listing the system Account and Audit Policies. This table mimics the exported securitypolicy output from the secedit tool.","platforms":["windows"],"columns":[{"name":"minimum_password_age","description":"Determines the minimum number of days that a password must be used before the user can change it","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"maximum_password_age","description":"Determines the maximum number of days that a password can be used before the client requires the user to change it","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minimum_password_length","description":"Determines the least number of characters that can make up a password for a user account","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"password_complexity","description":"Determines whether passwords must meet a series of strong-password guidelines","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"password_history_size","description":"Number of unique new passwords that must be associated with a user account before an old password can be reused","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"lockout_bad_count","description":"Number of failed logon attempts after which a user account MUST be locked out","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_to_change_password","description":"Determines if logon session is required to change the password","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"force_logoff_when_expire","description":"Determines whether SMB client sessions with the SMB server will be forcibly disconnected when the client's logon hours expire","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"new_administrator_name","description":"Determines the name of the Administrator account on the local computer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"new_guest_name","description":"Determines the name of the Guest account on the local computer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"clear_text_password","description":"Determines whether passwords MUST be stored by using reversible encryption","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"lsa_anonymous_name_lookup","description":"Determines if an anonymous user is allowed to query the local LSA policy","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enable_admin_account","description":"Determines whether the Administrator account on the local computer is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enable_guest_account","description":"Determines whether the Guest account on the local computer is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_system_events","description":"Determines whether the operating system MUST audit System Change, System Startup, System Shutdown, Authentication Component Load, and Loss or Excess of Security events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_logon_events","description":"Determines whether the operating system MUST audit each instance of a user attempt to log on or log off this computer","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_object_access","description":"Determines whether the operating system MUST audit each instance of user attempts to access a non-Active Directory object that has its own SACL specified","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_privilege_use","description":"Determines whether the operating system MUST audit each instance of user attempts to exercise a user right","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_policy_change","description":"Determines whether the operating system MUST audit each instance of user attempts to change user rights assignment policy, audit policy, account policy, or trust policy","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_account_manage","description":"Determines whether the operating system MUST audit each event of account management on a computer","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_process_tracking","description":"Determines whether the operating system MUST audit process-related events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_ds_access","description":"Determines whether the operating system MUST audit each instance of user attempts to access an Active Directory object that has its own system access control list (SACL) specified","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_account_logon","description":"Determines whether the operating system MUST audit each time this computer validates the credentials of an account","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"selinux_events","description":"Track SELinux events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"selinux_settings","description":"Track active SELinux settings.","platforms":["linux"],"columns":[{"name":"scope","description":"Where the key is located inside the SELinuxFS mount point.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Key or class name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Active value.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"services","description":"Lists all installed Windows services and their relevant data.","platforms":["windows"],"columns":[{"name":"name","description":"Service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service_type","description":"Service Type: OWN_PROCESS, SHARE_PROCESS and maybe Interactive (can interact with the desktop)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Service Display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Service Current status: STOPPED, START_PENDING, STOP_PENDING, RUNNING, CONTINUE_PENDING, PAUSE_PENDING, PAUSED","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"the Process ID of the service","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"start_type","description":"Service start type: BOOT_START, SYSTEM_START, AUTO_START, DEMAND_START, DISABLED","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"win32_exit_code","description":"The error code that the service uses to report an error that occurs when it is starting or stopping","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"service_exit_code","description":"The service-specific error code that the service returns when an error occurs while the service is starting or stopping","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Service Executable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"module_path","description":"Path to ServiceDll","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Service Description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_account","description":"The name of the account that the service process will be logged on as when it runs. This name can be of the form Domain\\UserName. If the account belongs to the built-in domain, the name can be of the form .\\UserName.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shadow","description":"Local system users encrypted passwords and related information. Please note, that you usually need superuser rights to access `/etc/shadow`.","platforms":["linux"],"columns":[{"name":"password_status","description":"Password status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hash_alg","description":"Password hashing algorithm","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Date of last password change (starting from UNIX epoch date)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimal number of days between password changes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum number of days between password changes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"warning","description":"Number of days before password expires to warn user about it","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Number of days after password expires until account is blocked","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"expire","description":"Number of days since UNIX epoch date until account is disabled","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"flag","description":"Reserved","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":true}]},{"name":"shared_folders","description":"Folders available to others via SMB or AFP.","platforms":["darwin"],"columns":[{"name":"name","description":"The shared name of the folder as it appears to other users","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute path of shared folder on the local system","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shared_memory","description":"OS shared memory regions.","platforms":["linux"],"columns":[{"name":"shmid","description":"Shared memory segment ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"User ID of owning process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"creator_uid","description":"User ID of creator process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID to last use the segment","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"creator_pid","description":"Process ID that created the segment","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Attached time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"dtime","description":"Detached time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Changed time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Memory segment permissions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"attached","description":"Number of attached processes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Destination/attach status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"locked","description":"1 if segment is locked else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shared_resources","description":"Displays shared resources on a computer system running Windows. This may be a disk drive, printer, interprocess communication, or other sharable device.","platforms":["windows"],"columns":[{"name":"description","description":"A textual description of the object","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the object was installed. Lack of a value does not indicate that the object is not installed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"String that indicates the current status of the object.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"allow_maximum","description":"Number of concurrent users for this resource has been limited. If True, the value in the MaximumAllowed property is ignored.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"maximum_allowed","description":"Limit on the maximum number of users allowed to use this resource concurrently. The value is only valid if the AllowMaximum property is set to FALSE.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Alias given to a path set up as a share on a computer system running Windows.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Local path of the Windows share.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of resource being shared. Types include: disk drives, print queues, interprocess communications (IPC), and general devices.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"type_name","description":"Human readable value for the 'type' column","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sharing_preferences","description":"macOS Sharing preferences.","platforms":["darwin"],"columns":[{"name":"screen_sharing","description":"1 If screen sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"file_sharing","description":"1 If file sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"printer_sharing","description":"1 If printer sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_login","description":"1 If remote login is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_management","description":"1 If remote management is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_apple_events","description":"1 If remote apple events are enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"internet_sharing","description":"1 If internet sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bluetooth_sharing","description":"1 If bluetooth sharing is enabled for any user else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disc_sharing","description":"1 If CD or DVD sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"content_caching","description":"1 If content caching is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shell_history","description":"A line-delimited (command) table of per-user .*_history data.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"Shell history owner","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp. It could be absent, default value is 0.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"command","description":"Unparsed date/line/command history line","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"history_file","description":"Path to the .*_history for this user","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shellbags","description":"Shows directories accessed via Windows Explorer.","platforms":["windows"],"columns":[{"name":"sid","description":"User SID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Shellbags source Registry file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Directory name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Directory Modified time.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"created_time","description":"Directory Created time.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_time","description":"Directory Accessed time.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mft_entry","description":"Directory master file table entry.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mft_sequence","description":"Directory master file table sequence.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shimcache","description":"Application Compatibility Cache, contains artifacts of execution.","platforms":["windows"],"columns":[{"name":"entry","description":"Execution order.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the executed file.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"File Modified time.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"execution_flag","description":"Boolean Execution flag, 1 for execution, 0 for no execution, -1 for missing (this flag does not exist on Windows 10 and higher).","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"signature","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["darwin"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"hash_resources","description":"Set to 1 to also hash resources, or 0 otherwise. Default is 1","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"If applicable, the arch of the signed code","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signed","description":"1 If the file is signed else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"The signing identifier sealed into the signature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Hash of the application Code Directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"team_identifier","description":"The team signing identifier sealed into the signature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authority","description":"Certificate Common Name","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sip_config","description":"Apple's System Integrity Protection (rootless) status.","platforms":["darwin"],"columns":[{"name":"config_flag","description":"The System Integrity Protection config flag","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this configuration is enabled, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled_nvram","description":"1 if this configuration is enabled, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"smbios_tables","description":"BIOS (DMI) structure common details and content.","platforms":["darwin","linux"],"columns":[{"name":"number","description":"Table entry number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Table entry type","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Table entry description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"handle","description":"Table entry handle","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"header_size","description":"Header size in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Table entry size in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table entry","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"smc_keys","description":"Apple's system management controller keys.","platforms":["darwin"],"columns":[{"name":"key","description":"4-character key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"SMC-reported type literal type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Reported size of data in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"A type-encoded representation of the key value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hidden","description":"1 if this key is normally hidden, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"socket_events","description":"Track network socket opens and closes.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"The socket action (bind, listen, close)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Either 'succeeded', 'failed', 'in_progress' (connect() on non-blocking socket) or 'no_client' (null accept() on non-blocking socket)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"socket","description":"The local path (UNIX domain socket only)","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"success","description":"Deprecated. Use the 'status' column instead","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"ssh_configs","description":"A table of parsed ssh_configs.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"The local owner of the ssh_config file","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block","description":"The host or match block","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option","description":"The option and value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssh_config_file","description":"Path to the ssh_config file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"startup_items","description":"Applications and binaries set as user/login startup items.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Name of startup item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of startup item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"args","description":"Arguments provided to startup executable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Startup Item or Login Item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Directory or plist containing startup item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Startup status; either enabled or disabled","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"The user associated with the startup item","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sudoers","description":"Rules for running commands as other users via sudo.","platforms":["darwin","linux"],"columns":[{"name":"source","description":"Source file containing the given rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"header","description":"Symbol for given rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rule_details","description":"Rule definition","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"suid_bin","description":"suid binaries in common locations.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Binary path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Binary owner username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Binary owner group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Binary permissions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"syslog_events","description":"","platforms":["linux"],"columns":[{"name":"time","description":"Current unix epoch time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Time known to syslog","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Hostname configured for syslog","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"severity","description":"Syslog severity","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"facility","description":"Syslog facility","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tag","description":"The syslog tag","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"The syslog message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"system_controls","description":"sysctl names, values, and settings information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Full sysctl MIB name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"oid","description":"Control MIB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subsystem","description":"Subsystem ID, control type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_value","description":"Value of setting","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_value","description":"The MIB value set in /etc/sysctl.conf","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Data type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"field_name","description":"Specific attribute of opaque type","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]}]},{"name":"system_extensions","description":"macOS (>= 10.15) system extension table.","platforms":["darwin"],"columns":[{"name":"path","description":"Original path of system extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"UUID","description":"Extension unique id","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"System extension state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Identifier name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"System extension version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"System extension category","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"System extension bundle path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"team","description":"Signing team ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mdm_managed","description":"1 if managed by MDM system extension payload configuration, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"system_info","description":"System information for identification.","platforms":["darwin","linux","windows"],"columns":[{"name":"hostname","description":"Network hostname including domain","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_type","description":"CPU type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_subtype","description":"CPU subtype","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_brand","description":"CPU brand string, contains vendor and model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_physical_cores","description":"Number of physical CPU cores in to the system","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_logical_cores","description":"Number of logical CPU cores available to the system","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_sockets","description":"Number of processor sockets in the system","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_microcode","description":"Microcode version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"physical_memory","description":"Total physical memory in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_vendor","description":"Hardware vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hardware model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_version","description":"Hardware version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_serial","description":"Device serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_vendor","description":"Board vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_model","description":"Board model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_version","description":"Board version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_serial","description":"Board serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Friendly computer name (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Local hostname (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"systemd_units","description":"Track systemd units.","platforms":["linux"],"columns":[{"name":"id","description":"Unique unit identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Unit description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"load_state","description":"Reflects whether the unit definition was properly loaded","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"active_state","description":"The high-level unit activation state, i.e. generalization of SUB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sub_state","description":"The low-level unit activation state, values depend on unit type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"unit_file_state","description":"Whether the unit file is enabled, e.g. `enabled`, `masked`, `disabled`, etc","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"following","description":"The name of another unit that this unit follows in state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"object_path","description":"The object path for this unit","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"job_id","description":"Next queued job id","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"job_type","description":"Job type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"job_path","description":"The object path for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fragment_path","description":"The unit file path this unit was read from, if there is any","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"The configured user, if any","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source_path","description":"Path to the (possibly generated) unit configuration file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"temperature_sensors","description":"Machine's temperature sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on macOS","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of temperature source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"celsius","description":"Temperature in Celsius","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"fahrenheit","description":"Temperature in Fahrenheit","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"time","description":"Track current date and time in UTC.","platforms":["darwin","linux","windows"],"columns":[{"name":"weekday","description":"Current weekday in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"year","description":"Current year in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"month","description":"Current month in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"day","description":"Current day in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"hour","description":"Current hour in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Current minutes in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Current seconds in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"timezone","description":"Timezone for reported time (hardcoded to UTC)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_timezone","description":"Current local timezone in of the system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"unix_time","description":"Current UNIX time in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"timestamp","description":"Current timestamp (log format) in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Current date and time (ISO format) in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iso_8601","description":"Current time (ISO format) in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"win_timestamp","description":"Timestamp value in 100 nanosecond units","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"time_machine_backups","description":"Backups to drives using TimeMachine.","platforms":["darwin"],"columns":[{"name":"destination_id","description":"Time Machine destination ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"backup_date","description":"Backup Date","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"time_machine_destinations","description":"Locations backed up to using Time Machine.","platforms":["darwin"],"columns":[{"name":"alias","description":"Human readable name of drive","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"destination_id","description":"Time Machine destination ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"consistency_scan_date","description":"Consistency scan date","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"root_volume_uuid","description":"Root UUID of backup volume","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_available","description":"Bytes available on volume","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_used","description":"Bytes used on volume","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"encryption","description":"Last known encrypted state","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"tpm_info","description":"A table that lists the TPM related information.","platforms":["windows"],"columns":[{"name":"activated","description":"TPM is activated","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"TPM is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"owned","description":"TPM is owned","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer_version","description":"TPM version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer_id","description":"TPM manufacturers ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer_name","description":"TPM manufacturers name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"product_name","description":"Product name of the TPM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"physical_presence_version","description":"Version of the Physical Presence Interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"spec_version","description":"Trusted Computing Group specification that the TPM supports","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ulimit_info","description":"System resource usage limits.","platforms":["darwin","linux"],"columns":[{"name":"type","description":"System resource to be limited","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"soft_limit","description":"Current limit value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hard_limit","description":"Maximum limit value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"unified_log","description":"Queries the OSLog framework for entries in the system log. The maximum number of rows returned is limited for performance issues. Use timestamp > or >= constraints to optimize query performance. This table introduces a new idiom for extracting sequential data in batches using multiple queries, ordered by timestamp. To trigger it, the user should include the condition \"timestamp > -1\", and the table will handle pagination. Note that the saved pagination counter is incremented globally across all queries and table invocations within a query. To avoid multiple table invocations within a query, use only AND and = constraints in WHERE clause.","platforms":["darwin"],"columns":[{"name":"timestamp","description":"unix timestamp associated with the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"storage","description":"the storage category for the entry","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"composed message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"activity","description":"the activity ID associate with the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"process","description":"the name of the process that made the entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"the pid of the process that made the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sender","description":"the name of the binary image that made the entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tid","description":"the tid of the thread that made the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"the category of the os_log_t used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subsystem","description":"the subsystem of the os_log_t used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"the severity level of the entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"max_rows","description":"the max number of rows returned (defaults to 100)","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"predicate","description":"predicate to search (see `log help predicates`), note that this is merged into the predicate created from the column constraints","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"uptime","description":"Track time passed since last boot. Some systems track this as calendar time, some as runtime.","platforms":["darwin","linux","windows"],"columns":[{"name":"days","description":"Days of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"hours","description":"Hours of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Minutes of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Seconds of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"total_seconds","description":"Total uptime seconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"usb_devices","description":"USB devices that are actively plugged into the host system.","platforms":["darwin","linux"],"columns":[{"name":"usb_address","description":"USB Device used address","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"usb_port","description":"USB Device used port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"USB Device vendor string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded USB Device vendor identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"USB Device version number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"USB Device model string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded USB Device model identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"USB Device serial connection","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"USB Device class","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subclass","description":"USB Device subclass","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"USB Device protocol","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"removable","description":"1 If USB device is removable else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"user_events","description":"Track user events from the audit framework.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The file description for the process socket","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Supplied path from event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"The Internet protocol address or family ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"terminal","description":"The network protocol ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"user_groups","description":"Local system user group relationships.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true}]},{"name":"user_interaction_events","description":"Track user interaction events from macOS' event tapping framework.","platforms":["darwin"],"columns":[{"name":"time","description":"Time","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"user_ssh_keys","description":"Returns the private keys in the users ~/.ssh directory and whether or not they are encrypted.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"The local user that owns the key file","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to key file","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"encrypted","description":"1 if key is encrypted, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"key_type","description":"The type of the private key. One of [rsa, dsa, dh, ec, hmac, cmac], or the empty string.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"userassist","description":"UserAssist Registry Key tracks when a user executes an application from Windows Explorer.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of times the application has been executed.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"users","description":"Local user accounts (including domain accounts that have logged on locally (Windows)).","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid","description":"Group ID (unsigned)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid_signed","description":"User ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"Default group ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional user description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"User's home directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shell","description":"User's configured default shell","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"User's UUID (Apple) or SID (Windows)","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Whether the account is roaming (domain), local, or a system profile","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"video_info","description":"Retrieve video card information of the machine.","platforms":["windows"],"columns":[{"name":"color_depth","description":"The amount of bits per pixel to represent color.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"The driver of the device.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver_date","description":"The date listed on the installed driver.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"driver_version","description":"The version of the installed driver.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the gpu.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the gpu.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"series","description":"The series of the gpu.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"video_mode","description":"The current resolution of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"virtual_memory_info","description":"Darwin Virtual Memory statistics.","platforms":["darwin"],"columns":[{"name":"free","description":"Total number of free pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"Total number of active pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Total number of inactive pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"speculative","description":"Total number of speculative pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"throttled","description":"Total number of throttled pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wired","description":"Total number of wired down pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"purgeable","description":"Total number of purgeable pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"faults","description":"Total number of calls to vm_faults.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"copy","description":"Total number of copy-on-write pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"zero_fill","description":"Total number of zero filled pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"reactivated","description":"Total number of reactivated pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"purged","description":"Total number of purged pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"file_backed","description":"Total number of file backed pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"anonymous","description":"Total number of anonymous pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uncompressed","description":"Total number of uncompressed pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"compressor","description":"The number of pages used to store compressed VM pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"decompressed","description":"The total number of pages that have been decompressed by the VM compressor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"compressed","description":"The total number of pages that have been compressed by the VM compressor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"page_ins","description":"The total number of requests for pages from a pager.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"page_outs","description":"Total number of pages paged out.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_ins","description":"The total number of compressed pages that have been swapped out to disk.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_outs","description":"The total number of compressed pages that have been swapped back in from disk.","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wifi_networks","description":"macOS known/remembered Wi-Fi networks list.","platforms":["darwin"],"columns":[{"name":"ssid","description":"SSID octets of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_connected","description":"Last time this network was connected to as a unix_time","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"passpoint","description":"1 if Passpoint is supported, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"possibly_hidden","description":"1 if network is possibly a hidden network, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"roaming","description":"1 if roaming is supported, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"roaming_profile","description":"Describe the roaming profile, usually one of Single, Dual or Multi","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auto_login","description":"1 if auto login is enabled, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"temporarily_disabled","description":"1 if this network is temporarily disabled, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 if this network is disabled, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"add_reason","description":"Shows why this network was added, via menubar or command line or something else ","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"added_at","description":"Time this network was added as a unix_time","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"captive_portal","description":"1 if this network has a captive portal, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"captive_login_date","description":"Time this network logged in to a captive portal as unix_time","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"was_captive_network","description":"1 if this network was previously a captive network, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"auto_join","description":"1 if this network set to join automatically, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"personal_hotspot","description":"1 if this network is a personal hotspot, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wifi_status","description":"macOS current WiFi status.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"transmit_rate","description":"The current transmit rate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"The current operating mode for the Wi-Fi interface","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wifi_survey","description":"Scan for nearby WiFi networks.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"winbaseobj","description":"Lists named Windows objects in the default object directories, across all terminal services sessions. Example Windows ojbect types include Mutexes, Events, Jobs and Semaphors.","platforms":["windows"],"columns":[{"name":"session_id","description":"Terminal Services Session Id","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"object_name","description":"Object Name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"object_type","description":"Object Type","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_crashes","description":"Extracted information from Windows crash logs (Minidumps).","platforms":["windows"],"columns":[{"name":"datetime","description":"Timestamp (log format) of the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"module","description":"Path of the crashed module within the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the executable file for the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID of the crashed process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID of the crashed thread","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"File version info of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"process_uptime","description":"Uptime of the process in seconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Multiple stack frames from the stack trace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_code","description":"The Windows exception code","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_message","description":"The NTSTATUS error message associated with the exception code","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_address","description":"Address (in hex) where the exception occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registers","description":"The values of the system registers","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command_line","description":"Command-line string passed to the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_directory","description":"Current working directory of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username of the user who ran the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"machine_name","description":"Name of the machine where the crash happened","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"major_version","description":"Windows major version of the machine","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minor_version","description":"Windows minor version of the machine","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"build_number","description":"Windows build number of the crashing machine","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of crash log","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Path of the log file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_eventlog","description":"Table for querying all recorded Windows event logs.","platforms":["windows"],"columns":[{"name":"channel","description":"Source or channel of the event","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"Severity level associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID which emitted the event record","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID which emitted the event record","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"time_range","description":"System time to selectively filter the events","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"timestamp","description":"Timestamp to selectively filter the events","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"xpath","description":"The custom query to filter events","type":"text","notes":"","hidden":true,"required":true,"index":false}]},{"name":"windows_events","description":"Windows Event logs.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Source or channel of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"The severity level associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"windows_firewall_rules","description":"Provides the list of Windows firewall rules.","platforms":["windows"],"columns":[{"name":"name","description":"Friendly name of the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"app_name","description":"Friendly name of the application to which the rule applies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Action for the rule or default setting","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if the rule is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"grouping","description":"Group to which an individual rule belongs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"direction","description":"Direction of traffic for which the rule applies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"IP protocol of the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_addresses","description":"Local addresses for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_addresses","description":"Remote addresses for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_ports","description":"Local ports for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_ports","description":"Remote ports for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"icmp_types_codes","description":"ICMP types and codes for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_domain","description":"1 if the rule profile type is domain","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_private","description":"1 if the rule profile type is private","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_public","description":"1 if the rule profile type is public","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"service_name","description":"Service name property of the application","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_optional_features","description":"Lists names and installation states of windows features. Maps to Win32_OptionalFeature WMI class.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the feature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"caption","description":"Caption of feature in settings UI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Installation state value. 1 == Enabled, 2 == Disabled, 3 == Absent","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"statename","description":"Installation state name. 'Enabled','Disabled','Absent'","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_search","description":"Run searches against the Windows system index database using Advanced Query Syntax. See https://learn.microsoft.com/en-us/windows/win32/search/-search-3x-advancedquerysyntax for details.","platforms":["windows"],"columns":[{"name":"name","description":"The name of the item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The full path of the item.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"The item size in bytes.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"date_created","description":"The unix timestamp of when the item was created.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"date_modified","description":"The unix timestamp of when the item was last modified","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"owner","description":"The owner of the item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The item type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"properties","description":"Additional property values JSON","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query","description":"Windows search query","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"sort","description":"Sort for windows api","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"max_results","description":"Maximum number of results returned by windows api, set to -1 for unlimited","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"additional_properties","description":"Comma separated list of columns to include in properties JSON","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"windows_security_center","description":"The health status of Window Security features. Health values can be \"Good\", \"Poor\". \"Snoozed\", \"Not Monitored\", and \"Error\".","platforms":["windows"],"columns":[{"name":"firewall","description":"The health of the monitored Firewall (see windows_security_products)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"The health of the Windows Autoupdate feature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"antivirus","description":"The health of the monitored Antivirus solution (see windows_security_products)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"antispyware","description":"Deprecated (always 'Good').","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"internet_settings","description":"The health of the Internet Settings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"windows_security_center_service","description":"The health of the Windows Security Center Service","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_account_control","description":"The health of the User Account Control (UAC) capability in Windows","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_security_products","description":"Enumeration of registered Windows security products. Note: Not compatible with Windows Server.","platforms":["windows"],"columns":[{"name":"type","description":"Type of security product","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of product","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"State of protection","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state_timestamp","description":"Timestamp for the product state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remediation_path","description":"Remediation path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signatures_up_to_date","description":"1 if product signatures are up to date, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_update_history","description":"Provides the history of the windows update events.","platforms":["windows"],"columns":[{"name":"client_app_id","description":"Identifier of the client application that processed an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"date","description":"Date and the time an update was applied","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hresult","description":"HRESULT value that is returned from the operation on an update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"operation","description":"Operation on an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"result_code","description":"Result of an operation on an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"server_selection","description":"Value that indicates which server provided an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service_id","description":"Service identifier of an update service that is not a Windows update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"support_url","description":"Hyperlink to the language-specific support information for an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"title","description":"Title of an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_id","description":"Revision-independent identifier of an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_revision","description":"Revision number of an update","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_bios_info","description":"Lists important information from the system bios.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the Bios setting","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the Bios setting","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_cli_event_consumers","description":"WMI CommandLineEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique name of a consumer.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command_line_template","description":"Standard string template that specifies the process to be started. This property can be NULL, and the ExecutablePath property is used as the command line.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"executable_path","description":"Module to execute. The string can specify the full path and file name of the module to execute, or it can specify a partial name. If a partial name is specified, the current drive and current directory are assumed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_event_filters","description":"Lists WMI event filters.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier of an event filter.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query","description":"Windows Management Instrumentation Query Language (WQL) event query that specifies the set of events for consumer notification, and the specific conditions for notification.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query_language","description":"Query language that the query is written in.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_filter_consumer_binding","description":"Lists the relationship between event consumers and filters.","platforms":["windows"],"columns":[{"name":"consumer","description":"Reference to an instance of __EventConsumer that represents the object path to a logical consumer, the recipient of an event.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filter","description":"Reference to an instance of __EventFilter that represents the object path to an event filter which is a query that specifies the type of event to be received.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_script_event_consumers","description":"WMI ActiveScriptEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier for the event consumer. ","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"scripting_engine","description":"Name of the scripting engine to use, for example, 'VBScript'. This property cannot be NULL.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_file_name","description":"Name of the file from which the script text is read, intended as an alternative to specifying the text of the script in the ScriptText property.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_text","description":"Text of the script that is expressed in a language known to the scripting engine. This property must be NULL if the ScriptFileName property is not NULL.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"xprotect_entries","description":"Database of the machine's XProtect signatures.","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"launch_type","description":"Launch services content type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identity","description":"XProtect identity (SHA1) of content","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Use this file name to match","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filetype","description":"Use this file type to match","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"optional","description":"Match any of the identities/patterns for this XProtect name","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"uses_pattern","description":"Uses a match pattern instead of identity","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"xprotect_meta","description":"Database of the machine's XProtect browser-related signatures.","platforms":["darwin"],"columns":[{"name":"identifier","description":"Browser plugin or extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Either plugin or extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Developer identity (SHA1) of extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"min_version","description":"The minimum allowed plugin version.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"xprotect_reports","description":"Database of XProtect matches (if user generated/sent an XProtect report).","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_action","description":"Action taken by user after prompted","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Quarantine alert time","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"yara","description":"Triggers one-off YARA query for files at the specified path. Requires one of `sig_group`, `sigfile`, or `sigrule`.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"The path scanned","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"matches","description":"List of YARA matches","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sig_group","description":"Signature group used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sigfile","description":"Signature file used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sigrule","description":"Signature strings used","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sigurl","description":"Signature url","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"yara_events","description":"Track YARA matches for files specified in configuration data.","platforms":["darwin","linux","windows"],"columns":[{"name":"target_path","description":"The path scanned","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"matches","description":"List of YARA matches","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of the scan","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"ycloud_instance_metadata","description":"Yandex.Cloud instance metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"instance_id","description":"Unique identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"folder_id","description":"Folder identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cloud_id","description":"Cloud identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hostname","description":"Hostname of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_port_enabled","description":"Indicates if serial port is enabled for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"metadata_endpoint","description":"Endpoint used to fetch VM metadata","type":"text","notes":"","hidden":false,"required":false,"index":true}]},{"name":"yum_sources","description":"Current list of Yum repositories or software channels.","platforms":["linux"],"columns":[{"name":"name","description":"Repository name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"baseurl","description":"Repository base URL","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mirrorlist","description":"Mirrorlist URL","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether the repository is used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gpgcheck","description":"Whether packages are GPG checked","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gpgkey","description":"URL to GPG key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"host_users","description":"Local user accounts (including domain accounts that have logged on locally (Windows)).","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid","description":"Group ID (unsigned)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid_signed","description":"User ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"Default group ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional user description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"User's home directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shell","description":"User's configured default shell","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"User's UUID (Apple) or SID (Windows)","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Whether the account is roaming (domain), local, or a system profile","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"host_groups","description":"Local system groups.","platforms":["darwin","linux","windows"],"columns":[{"name":"gid","description":"Unsigned int64 group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid_signed","description":"A signed int64 version of gid","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Canonical local group name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"group_sid","description":"Unique group ID","type":"text","notes":"","hidden":true,"required":false,"index":true,"platforms":["windows","win32","cygwin"]},{"name":"comment","description":"Remarks or comments associated with the group","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"host_processes","description":"All running processes on the host system.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executed binary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root","description":"Process virtual root directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Unsigned user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Unsigned group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Unsigned effective user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Unsigned effective group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Unsigned saved user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Unsigned saved group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"on_disk","description":"The process path exists yes=1, no=0, unknown=-1","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"user_time","description":"CPU time in milliseconds spent in user space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_time","description":"CPU time in milliseconds spent in kernel space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_read","description":"Bytes read from disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_written","description":"Bytes written to disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start time in seconds since Epoch, in case of error -1","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"elevated_token","description":"Process uses elevated token yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"secure_process","description":"Process is secure (IUM) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"protection_type","description":"The protection type of the process","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"virtual_process","description":"Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"elapsed_time","description":"Elapsed time in seconds this process has been running.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"handle_count","description":"Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"percent_processor_time","description":"Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"upid","description":"A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"uppid","description":"The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_type","description":"Indicates the specific processor designed for installation.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_subtype","description":"Indicates the specific processor on which an entry may be used.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"translated","description":"Indicates whether the process is running under the Rosetta Translation Environment, yes=1, no=0, error=-1.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["darwin"]},{"name":"cgroup_path","description":"The full hierarchical path of the process's control group","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux"]}]}] \ No newline at end of file diff --git a/x-pack/plugins/osquery/public/common/schemas/osquery/v5.7.0.json b/x-pack/plugins/osquery/public/common/schemas/osquery/v5.7.0.json deleted file mode 100644 index 8649b18090b76..0000000000000 --- a/x-pack/plugins/osquery/public/common/schemas/osquery/v5.7.0.json +++ /dev/null @@ -1 +0,0 @@ -[{"name":"account_policy_data","description":"Additional macOS user account data from the AccountPolicy section of OpenDirectory.","platforms":["darwin"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the account was first created","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"failed_login_count","description":"The number of failed login attempts using an incorrect password. Count resets after a correct password is entered.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"failed_login_timestamp","description":"The time of the last failed login attempt. Resets after a correct password is entered","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"password_last_set_time","description":"The time the password was last changed","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"acpi_tables","description":"Firmware ACPI functional table common metadata and content.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"ACPI table name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of compiled table data","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table content","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ad_config","description":"macOS Active Directory configuration.","platforms":["darwin"],"columns":[{"name":"name","description":"The macOS-specific configuration name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain","description":"Active Directory trust domain","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option","description":"Canonical name of option","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Variable typed option value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"alf","description":"macOS application layer firewall (ALF) service details.","platforms":["darwin"],"columns":[{"name":"allow_signed_enabled","description":"1 If allow signed mode is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"firewall_unload","description":"1 If firewall unloading enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"global_state","description":"1 If the firewall is enabled with exceptions, 2 if the firewall is configured to block all incoming connections, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logging_enabled","description":"1 If logging mode is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logging_option","description":"Firewall logging option","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"stealth_enabled","description":"1 If stealth mode is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Application Layer Firewall version","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"alf_exceptions","description":"macOS application layer firewall (ALF) service exceptions.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to the executable that is excepted","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Firewall exception state","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"alf_explicit_auths","description":"ALF services explicitly allowed to perform networking.","platforms":["darwin"],"columns":[{"name":"process","description":"Process name explicitly allowed","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"app_schemes","description":"macOS application schemes and handlers (e.g., http, file, mailto).","platforms":["darwin"],"columns":[{"name":"scheme","description":"Name of the scheme/protocol","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"handler","description":"Application label for the handler","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this handler is the OS default, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"external","description":"1 if this handler does NOT exist on macOS by default, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protected","description":"1 if this handler is protected (reserved) by macOS, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apparmor_events","description":"Track AppArmor events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Raw audit message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"apparmor","description":"Apparmor Status like ALLOWED, DENIED etc.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"operation","description":"Permission requested by the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process PID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"profile","description":"Apparmor profile name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"denied_mask","description":"Denied permissions for the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"capname","description":"Capability requested by the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ouid","description":"Object owner's user ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"capability","description":"Capability number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"requested_mask","description":"Requested access mask","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"info","description":"Additional information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error","description":"Error information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"namespace","description":"AppArmor namespace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"AppArmor label","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apparmor_profiles","description":"Track active AppArmor profiles.","platforms":["linux"],"columns":[{"name":"path","description":"Unique, aa-status compatible, policy identifier.","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Policy name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"attach","description":"Which executable(s) a profile will attach to.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"How the policy is applied.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"A unique hash that identifies this policy.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"appcompat_shims","description":"Application Compatibility shims are a way to persist malware. This table presents the AppCompat Shim information from the registry in a nice format. See http://files.brucon.org/2015/Tomczak_and_Ballenthin_Shims_for_the_Win.pdf for more details.","platforms":["windows"],"columns":[{"name":"executable","description":"Name of the executable that is being shimmed. This is pulled from the registry.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the SDB database.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the SDB.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Install time of the SDB","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the SDB database.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdb_id","description":"Unique GUID of the SDB.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apps","description":"macOS applications installed in known search paths (e.g., /Applications).","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the Name.app folder","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute and full Name.app path","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"bundle_executable","description":"Info properties CFBundleExecutable label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_identifier","description":"Info properties CFBundleIdentifier label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_name","description":"Info properties CFBundleName label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_short_version","description":"Info properties CFBundleShortVersionString label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_version","description":"Info properties CFBundleVersion label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_package_type","description":"Info properties CFBundlePackageType label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"environment","description":"Application-set environment variables","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"element","description":"Does the app identify as a background agent","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"compiler","description":"Info properties DTCompiler label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Info properties CFBundleDevelopmentRegion label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Info properties CFBundleDisplayName label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"info_string","description":"Info properties CFBundleGetInfoString label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"minimum_system_version","description":"Minimum version of macOS required for the app to run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The UTI that categorizes the app for the App Store","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"applescript_enabled","description":"Info properties NSAppleScriptEnabled label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"copyright","description":"Info properties NSHumanReadableCopyright label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"The time that the app was last used","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"apt_sources","description":"Current list of APT repositories or software channels.","platforms":["linux"],"columns":[{"name":"name","description":"Repository name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Source file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"base_uri","description":"Repository base URI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"release","description":"Release name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Repository source version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Repository maintainer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"components","description":"Repository components","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architectures","description":"Repository architectures","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"arp_cache","description":"Address resolution cache, both static and dynamic (from ARP, NDP).","platforms":["darwin","linux","windows"],"columns":[{"name":"address","description":"IPv4 address target","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address of broadcasted address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"interface","description":"Interface of the network for the MAC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permanent","description":"1 for true, 0 for false","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"asl","description":"Queries the Apple System Log data structure for system events.","platforms":["darwin"],"columns":[{"name":"time","description":"Unix timestamp. Set automatically","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"time_nano_sec","description":"Nanosecond time.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Sender's address (set by the server).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sender","description":"Sender's identification string. Default is process name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"facility","description":"Sender's facility. Default is 'user'.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Sending process ID encoded as a string. Set automatically.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"GID that sent the log message (set by the server).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"UID that sent the log message (set by the server).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"Log level number. See levels in asl.h.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message text.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ref_pid","description":"Reference PID for messages proxied by launchd","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ref_proc","description":"Reference process for messages proxied by launchd","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extra","description":"Extra columns, in JSON format. Queries against this column are performed entirely in SQLite, so do not benefit from efficient querying via asl.h.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"atom_packages","description":"Lists all atom packages in a directory or globally installed in a system.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Package supplied description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Package's package.json path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License for package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"homepage","description":"Package supplied homepage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the plugin","type":"bigint","notes":"","hidden":false,"required":false,"index":true}]},{"name":"augeas","description":"Configuration files parsed by augeas.","platforms":["darwin","linux"],"columns":[{"name":"node","description":"The node path of the configuration item","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"value","description":"The value of the configuration item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"The label of the configuration item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path to the configuration file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authenticode","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["windows"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"original_program_name","description":"The original program name that the publisher has signed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The certificate serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_name","description":"The certificate issuer name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_name","description":"The certificate subject name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"result","description":"The signature check result","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authorization_mechanisms","description":"macOS Authorization mechanisms database.","platforms":["darwin"],"columns":[{"name":"label","description":"Label of the authorization right","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"plugin","description":"Authorization plugin name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mechanism","description":"Name of the mechanism that will be called","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"privileged","description":"If privileged it will run as root, else as an anonymous user","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"entry","description":"The whole string entry","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authorizations","description":"macOS Authorization rights database.","platforms":["darwin"],"columns":[{"name":"label","description":"Item name, usually in reverse domain format","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"modified","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"allow_root","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"timeout","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tries","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authenticate_user","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shared","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"session_owner","description":"Label top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"authorized_keys","description":"A line-delimited authorized_keys table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local owner of authorized_keys file","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"algorithm","description":"Key type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Key encoded as base64","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"options","description":"Optional list of login options","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional comment","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to the authorized_keys file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"autoexec","description":"Aggregate of executables that will automatically execute on the target machine. This is an amalgamation of other tables like services, scheduled_tasks, startup_items and more.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the executable","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of the program","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Source table of the autoexec item","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_metadata","description":"Azure instance metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"location","description":"Azure Region the VM is running in","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"offer","description":"Offer information for the VM image (Azure image gallery VMs only)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Publisher of the VM image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sku","description":"SKU for the VM image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the VM image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Linux or Windows","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_update_domain","description":"Update domain the VM is running in","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_fault_domain","description":"Fault domain the VM is running in","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vm_id","description":"Unique identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"vm_size","description":"VM size","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subscription_id","description":"Azure subscription for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resource_group_name","description":"Resource group for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"placement_group_id","description":"Placement group for the VM scale set","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vm_scale_set_name","description":"VM scale set name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"azure_instance_tags","description":"Azure instance tags.","platforms":["darwin","linux","windows"],"columns":[{"name":"vm_id","description":"Unique identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"The tag key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"The tag value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"background_activities_moderator","description":"Background Activities Moderator (BAM) tracks application execution.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"battery","description":"Provides information about the internal battery of a Macbook.","platforms":["darwin"],"columns":[{"name":"manufacturer","description":"The battery manufacturer's name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacture_date","description":"The date the battery was manufactured UNIX Epoch","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The battery's model number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"The battery's unique serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cycle_count","description":"The number of charge/discharge cycles","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"health","description":"One of the following: \"Good\" describes a well-performing battery, \"Fair\" describes a functional battery with limited capacity, or \"Poor\" describes a battery that's not capable of providing power","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"condition","description":"One of the following: \"Normal\" indicates the condition of the battery is within normal tolerances, \"Service Needed\" indicates that the battery should be checked out by a licensed Mac repair service, \"Permanent Failure\" indicates the battery needs replacement","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"One of the following: \"AC Power\" indicates the battery is connected to an external power source, \"Battery Power\" indicates that the battery is drawing internal power, \"Off Line\" indicates the battery is off-line or no longer connected","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"charging","description":"1 if the battery is currently being charged by a power source. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"charged","description":"1 if the battery is currently completely charged. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"designed_capacity","description":"The battery's designed capacity in mAh","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"The battery's actual capacity when it is fully charged in mAh","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"current_capacity","description":"The battery's current charged capacity in mAh","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_remaining","description":"The percentage of battery remaining before it is drained","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"amperage","description":"The battery's current amperage in mA","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"voltage","description":"The battery's current voltage in mV","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes_until_empty","description":"The number of minutes until the battery is fully depleted. This value is -1 if this time is still being calculated","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes_to_full_charge","description":"The number of minutes until the battery is fully charged. This value is -1 if this time is still being calculated","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"bitlocker_info","description":"Retrieve bitlocker status of the machine.","platforms":["windows"],"columns":[{"name":"device_id","description":"ID of the encrypted drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"Drive letter of the encrypted drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"persistent_volume_id","description":"Persistent ID of the drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"conversion_status","description":"The bitlocker conversion status of the drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protection_status","description":"The bitlocker protection status of the drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"encryption_method","description":"The encryption type of the device.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The FVE metadata version of the drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"percentage_encrypted","description":"The percentage of the drive that is encrypted.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"lock_status","description":"The accessibility status of the drive from Windows.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"block_devices","description":"Block (buffered access) device file nodes: disks, ramdisks, and DMG containers.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Block device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Block device parent name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Block device vendor string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"Block device model string identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Block device size in blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Block device Universally Unique Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Block device type string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"Block device label string","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"bpf_process_events","description":"Track time/action process executions.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Binary path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"json_cmdline","description":"Command line arguments, in JSON format","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"bpf_socket_events","description":"Track network socket opens and closes.","platforms":["linux"],"columns":[{"name":"tid","description":"Thread ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cid","description":"Cgroup ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of the system call","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"probe_error","description":"Set to 1 if one or more buffers could not be captured","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"syscall","description":"System call name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The socket type","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"duration","description":"How much time was spent inside the syscall (nsecs)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ntime","description":"The nsecs uptime timestamp as obtained from BPF","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"browser_plugins","description":"All C/NPAPI browser plugin details for all users. C/NPAPI has been deprecated on all major browsers. To query for plugins on modern browsers, try: `chrome_extensions` `firefox_addons` `safari_extensions`.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the plugin","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Plugin display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Plugin identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Plugin short version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Build SDK used to compile plugin","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Plugin description text","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"development_region","description":"Plugin language-localization","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"native","description":"Plugin requires native execution","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"disabled","description":"Is the plugin disabled. 1 = Disabled","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"carbon_black_info","description":"Returns info about a Carbon Black sensor install.","platforms":["darwin","linux","windows"],"columns":[{"name":"sensor_id","description":"Sensor ID of the Carbon Black sensor","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"config_name","description":"Sensor group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_store_files","description":"If the sensor is configured to send back binaries to the Carbon Black server","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_module_loads","description":"If the sensor is configured to capture module loads","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_module_info","description":"If the sensor is configured to collect metadata of binaries","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_file_mods","description":"If the sensor is configured to collect file modification events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_reg_mods","description":"If the sensor is configured to collect registry modification events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_net_conns","description":"If the sensor is configured to collect network connections","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_processes","description":"If the sensor is configured to process events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_cross_processes","description":"If the sensor is configured to cross process events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_emet_events","description":"If the sensor is configured to EMET events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_data_file_writes","description":"If the sensor is configured to collect non binary file writes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_process_user_context","description":"If the sensor is configured to collect the user running a process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"collect_sensor_operations","description":"Unknown","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_mb","description":"Event file disk quota in MB","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"log_file_disk_quota_percentage","description":"Event file disk quota in a percentage","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protection_disabled","description":"If the sensor is configured to report tamper events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sensor_ip_addr","description":"IP address of the sensor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sensor_backend_server","description":"Carbon Black server","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"event_queue","description":"Size in bytes of Carbon Black event files on disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"binary_queue","description":"Size in bytes of binaries waiting to be sent to Carbon Black server","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"carves","description":"List the set of completed and in-progress carves. If carve=1 then the query is treated as a new carve request.","platforms":["darwin","linux","windows"],"columns":[{"name":"time","description":"Time at which the carve was kicked off","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"A SHA256 sum of the carved archive","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the carved archive","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the requested carve","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the carve, can be STARTING, PENDING, SUCCESS, or FAILED","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"carve_guid","description":"Identifying value of the carve session","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"request_id","description":"Identifying value of the carve request (e.g., scheduled query name, distributed request, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"carve","description":"Set this value to '1' to start a file carve","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"certificates","description":"Certificate Authorities installed in Keychains/ca-bundles.","platforms":["darwin","linux","windows"],"columns":[{"name":"common_name","description":"Certificate CommonName","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject","description":"Certificate distinguished name (deprecated, use subject2)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer","description":"Certificate issuer distinguished name (deprecated, use issuer2)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ca","description":"1 if CA: true (certificate is an authority) else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"self_signed","description":"1 if self-signed, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"not_valid_before","description":"Lower bound of valid date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"not_valid_after","description":"Certificate expiration data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signing_algorithm","description":"Signing algorithm used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_algorithm","description":"Key algorithm used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_strength","description":"Key size used for RSA/DSA, or curve name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Certificate key usage and extended key usage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_key_id","description":"SKID an optionally included SHA1","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authority_key_id","description":"AKID an optionally included SHA1","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the raw certificate contents","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Keychain or PEM bundle","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"Certificate serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"SID","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"store_location","description":"Certificate system store location","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"store","description":"Certificate system store","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"username","description":"Username","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"store_id","description":"Exists for service/user stores. Contains raw store id provided by WinAPI.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"issuer2","description":"Certificate issuer distinguished name","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"subject2","description":"Certificate distinguished name","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux","darwin"]}]},{"name":"chassis_info","description":"Display information pertaining to the chassis and its security status.","platforms":["windows"],"columns":[{"name":"audible_alarm","description":"If TRUE, the frame is equipped with an audible alarm.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"breach_description","description":"If provided, gives a more detailed description of a detected security breach.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"chassis_types","description":"A comma-separated list of chassis types, such as Desktop or Laptop.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"An extended description of the chassis if available.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"lock","description":"If TRUE, the frame is equipped with a lock.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_breach","description":"The physical status of the chassis such as Breach Successful, Breach Attempted, etc.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"smbios_tag","description":"The assigned asset tag number of the chassis.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sku","description":"The Stock Keeping Unit number if available.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"If available, gives various operational or nonoperational statuses such as OK, Degraded, and Pred Fail.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"visible_alarm","description":"If TRUE, the frame is equipped with a visual alarm.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"chocolatey_packages","description":"Chocolatey packages installed in a system.","platforms":["windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this package resides","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"chrome_extension_content_scripts","description":"Chrome browser extension content scripts.","platforms":["darwin","linux","windows"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"identifier","description":"Extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script","description":"The content script used by the extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"match","description":"The pattern that the script is matched against","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"chrome_extensions","description":"Chrome-based browser extensions.","platforms":["darwin","linux","windows"],"columns":[{"name":"browser_type","description":"The browser type (Valid values: chrome, chromium, opera, yandex, brave, edge, edge_beta)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The local user that owns the extension","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Extension display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile","description":"The name of the Chrome profile that contains this extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The profile path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"referenced_identifier","description":"Extension identifier, as specified by the preferences file. Empty if the extension is not in the profile.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier, computed from its manifest. Empty in case of error.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Extension-optional description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"default_locale","description":"Default locale supported by extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_locale","description":"Current locale supported by extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"persistent","description":"1 If extension is persistent across all tabs else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension folder","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"The permissions required by the extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions_json","description":"The JSON-encoded permissions required by the extension","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"optional_permissions","description":"The permissions optionally required by the extensions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"optional_permissions_json","description":"The JSON-encoded permissions optionally required by the extensions","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"manifest_hash","description":"The SHA256 hash of the manifest.json file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"referenced","description":"1 if this extension is referenced by the Preferences file of the profile","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"from_webstore","description":"True if this extension was installed from the web store","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"1 if this extension is enabled","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Extension install time, in its original Webkit format","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_timestamp","description":"Extension install time, converted to unix time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"manifest_json","description":"The manifest file of the extension","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"key","description":"The extension key, from the manifest file","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"connectivity","description":"Provides the overall system's network state.","platforms":["windows"],"columns":[{"name":"disconnected","description":"True if the all interfaces are not connected to any network","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_no_traffic","description":"True if any interface is connected via IPv4, but has seen no traffic","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_no_traffic","description":"True if any interface is connected via IPv6, but has seen no traffic","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_subnet","description":"True if any interface is connected to the local subnet via IPv4","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_local_network","description":"True if any interface is connected to a routed network via IPv4","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_internet","description":"True if any interface is connected to the Internet via IPv4","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_subnet","description":"True if any interface is connected to the local subnet via IPv6","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_local_network","description":"True if any interface is connected to a routed network via IPv6","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_internet","description":"True if any interface is connected to the Internet via IPv6","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"cpu_info","description":"Retrieve cpu hardware info of the machine.","platforms":["linux","windows"],"columns":[{"name":"device_id","description":"The DeviceID of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"processor_type","description":"The processor type, such as Central, Math, or Video.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_status","description":"The current operating status of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"number_of_cores","description":"The number of cores of the CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logical_processors","description":"The number of logical processors of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"address_width","description":"The width of the CPU address bus.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_clock_speed","description":"The current frequency of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_clock_speed","description":"The maximum possible frequency of the CPU.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"socket_designation","description":"The assigned socket on the board for the given CPU.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"availability","description":"The availability and status of the CPU.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"cpu_time","description":"Displays information from /proc/stat file about the time the cpu cores spent in different parts of the system.","platforms":["darwin","linux"],"columns":[{"name":"core","description":"Name of the cpu (core)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"Time spent in user mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Time spent in user mode with low priority (nice)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system","description":"Time spent in system mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"idle","description":"Time spent in the idle task","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"iowait","description":"Time spent waiting for I/O to complete","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"irq","description":"Time spent servicing interrupts","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"softirq","description":"Time spent servicing softirqs","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"steal","description":"Time spent in other operating systems when running in a virtualized environment","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"guest","description":"Time spent running a virtual CPU for a guest OS under the control of the Linux kernel","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"guest_nice","description":"Time spent running a niced guest ","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"cpuid","description":"Useful CPU features from the cpuid ASM call.","platforms":["darwin","linux","windows"],"columns":[{"name":"feature","description":"Present feature flags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Bit value or string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"output_register","description":"Register used to for feature value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"output_bit","description":"Bit in register value for feature value","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"input_eax","description":"Value of EAX used","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"crashes","description":"Application, System, and Mobile App crash logs.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of crash log","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID of the crashed process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Location of log file","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"identifier","description":"Identifier of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version info of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent PID of the crashed process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"responsible","description":"Process responsible for the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the crashed process","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"datetime","description":"Date/Time at which the crash occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"crashed_thread","description":"Thread ID which crashed","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Most recent frame from the stack trace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_type","description":"Exception type of the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_codes","description":"Exception codes from the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_notes","description":"Exception notes from the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registers","description":"The value of the system registers","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"crontab","description":"Line parsed values from system and user cron/tab.","platforms":["darwin","linux"],"columns":[{"name":"event","description":"The job @event name (rare)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"minute","description":"The exact minute for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hour","description":"The hour of the day for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"day_of_month","description":"The day of the month for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"month","description":"The month of the year for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"day_of_week","description":"The day of the week for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command","description":"Raw command string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"File parsed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"cups_destinations","description":"Returns all configured printers.","platforms":["darwin"],"columns":[{"name":"name","description":"Name of the printer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option_name","description":"Option name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option_value","description":"Option value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"cups_jobs","description":"Returns all completed print jobs from cups.","platforms":["darwin"],"columns":[{"name":"title","description":"Title of the printed job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"destination","description":"The printer the job was sent to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"The user who printed the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"format","description":"The format of the print job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the print job","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"completed_time","description":"When the job completed printing","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"processing_time","description":"How long the job took to process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"creation_time","description":"When the print request was initiated","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"curl","description":"Perform an http request and return stats about it.","platforms":["darwin","linux","windows"],"columns":[{"name":"url","description":"The url for the request","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"method","description":"The HTTP method for the request","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_agent","description":"The user-agent string to use for the request","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"response_code","description":"The HTTP status code for the response","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"round_trip_time","description":"Time taken to complete the request","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of bytes in the response","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"result","description":"The HTTP response body","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"curl_certificate","description":"Inspect TLS certificates by connecting to input hostnames.","platforms":["darwin","linux","windows"],"columns":[{"name":"hostname","description":"Hostname to CURL (domain[:port], e.g. osquery.io)","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"common_name","description":"Common name of company issued to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"organization","description":"Organization issued to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"organization_unit","description":"Organization unit issued to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Certificate serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_common_name","description":"Issuer common name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_organization","description":"Issuer organization","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_organization_unit","description":"Issuer organization unit","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"valid_from","description":"Period of validity start date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"valid_to","description":"Period of validity end date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256_fingerprint","description":"SHA-256 fingerprint","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1_fingerprint","description":"SHA1 fingerprint","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version Number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"signature_algorithm","description":"Signature Algorithm","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signature","description":"Signature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_key_identifier","description":"Subject Key Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authority_key_identifier","description":"Authority Key Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_usage","description":"Usage of key in certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extended_key_usage","description":"Extended usage of key in certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policies","description":"Certificate Policies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_alternative_names","description":"Subject Alternative Name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"issuer_alternative_names","description":"Issuer Alternative Name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"info_access","description":"Authority Information Access","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subject_info_access","description":"Subject Information Access","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_mappings","description":"Policy Mappings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"has_expired","description":"1 if the certificate has expired, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"basic_constraint","description":"Basic Constraints","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name_constraints","description":"Name Constraints","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_constraints","description":"Policy Constraints","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dump_certificate","description":"Set this value to '1' to dump certificate","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"timeout","description":"Set this value to the timeout in seconds to complete the TLS handshake (default 4s, use 0 for no timeout)","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"pem","description":"Certificate PEM format","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"deb_packages","description":"The installed DEB package database.","platforms":["linux"],"columns":[{"name":"name","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Package source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Package architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"revision","description":"Package revision","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Package status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"maintainer","description":"Package maintainer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"section","description":"Package section","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"priority","description":"Package priority","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"admindir","description":"libdpkg admindir. Defaults to /var/lib/dpkg","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"default_environment","description":"Default environment variables and values.","platforms":["windows"],"columns":[{"name":"variable","description":"Name of the environment variable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the environment variable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"expand","description":"1 if the variable needs expanding, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_file","description":"Similar to the file table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"partition","description":"A partition number","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"path","description":"A logical path within the device node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"uid","description":"Owning user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Creation time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_firmware","description":"A best-effort list of discovered firmware versions.","platforms":["darwin"],"columns":[{"name":"type","description":"Type of device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"The device name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"version","description":"Firmware version","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_hash","description":"Similar to the hash table, but use TSK and allow block address access.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided inode data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided inode data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided inode data","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"device_partitions","description":"Use TSK to enumerate details about partitions on a disk device.","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Absolute file path to device node","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"partition","description":"A partition number or description","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"offset","description":"","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Byte size of each block","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Number of blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Number of meta nodes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"disk_encryption","description":"Disk encryption status and information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Disk name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"uuid","description":"Disk Universally Unique Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"encrypted","description":"1 If encrypted: true (disk is encrypted), else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Description of cipher type and mode if available","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"encryption_status","description":"Disk encryption status with one of following values: encrypted | not encrypted | undefined","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Currently authenticated user if available","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"user_uuid","description":"UUID of authenticated user if available","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"filevault_status","description":"FileVault status with one of following values: on | off | unknown","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]}]},{"name":"disk_events","description":"Track DMG disk image events (appearance/disappearance) when opened.","platforms":["darwin"],"columns":[{"name":"action","description":"Appear or disappear","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the DMG file accessed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Disk event name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"Disk event BSD name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"UUID of the volume inside DMG if available","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of partition in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ejectable","description":"1 if ejectable, 0 if not","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mountable","description":"1 if mountable, 0 if not","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"writable","description":"1 if writable, 0 if not","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"content","description":"Disk event content","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"media_name","description":"Disk event media name string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Disk event vendor string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filesystem","description":"Filesystem if available","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"checksum","description":"UDIF Master checksum if available (CRC32)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of appearance/disappearance in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"disk_info","description":"Retrieve basic information about the physical disks of a system.","platforms":["windows"],"columns":[{"name":"partitions","description":"Number of detected partitions on disk.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_index","description":"Physical drive number of the disk.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The interface type of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"id","description":"The unique identifier of the drive on the system.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pnp_device_id","description":"The unique identifier of the drive on the system.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_size","description":"Size of the disk.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hard drive model.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"The label of the disk object.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"The serial number of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"The OS's description of the disk.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"dns_cache","description":"Enumerate the DNS cache using the undocumented DnsGetCacheDataTable function in dnsapi.dll.","platforms":["windows"],"columns":[{"name":"name","description":"DNS record name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"DNS record type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"DNS record flags","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"dns_resolvers","description":"Resolvers used by this host.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Address type index or order","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Address type: sortlist, nameserver, search","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Resolver IP/IPv6 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Address (sortlist) netmask length","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"options","description":"Resolver options","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"docker_container_envs","description":"Docker container environment variables.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Environment variable name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Environment variable value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_fs_changes","description":"Changes to files or directories on container's filesystem.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"path","description":"FIle or directory path relative to rootfs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"change_type","description":"Type of change: C:Modified, A:Added, D:Deleted","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_labels","description":"Docker container labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_mounts","description":"Docker container mounts.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Type of mount (bind, volume)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Optional mount name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"source","description":"Source path on host","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"destination","description":"Destination path inside container","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver providing the mount","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Mount options (rw, ro)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rw","description":"1 if read/write. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"propagation","description":"Mount propagation","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_networks","description":"Docker container networks.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Network name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"network_id","description":"Network ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"endpoint_id","description":"Endpoint ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Gateway","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ip_address","description":"IP address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ip_prefix_len","description":"IP subnet prefix length","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_gateway","description":"IPv6 gateway","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_prefix_len","description":"IPv6 subnet prefix length","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mac_address","description":"MAC address","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_ports","description":"Docker container ports.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Protocol (tcp, udp)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"port","description":"Port inside the container","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"host_ip","description":"Host IP address on which public port is listening","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host_port","description":"Host port","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_processes","description":"Docker container processes.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start in seconds since boot (non-sleeping)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"User name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Cumulative CPU time. [DD-]HH:MM:SS format","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu","description":"CPU utilization as percentage","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"mem","description":"Memory utilization as percentage","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_container_stats","description":"Docker container statistics. Queries on this table take at least one second.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"name","description":"Container name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"pids","description":"Number of processes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"read","description":"UNIX time when stats were read","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"preread","description":"UNIX time when stats were last read","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"interval","description":"Difference between read and preread in nano-seconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_read","description":"Total disk read bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_write","description":"Total disk write bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"num_procs","description":"Number of processors","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_total_usage","description":"Total CPU usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_kernelmode_usage","description":"CPU kernel mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_usermode_usage","description":"CPU user mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_cpu_usage","description":"CPU system usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"online_cpus","description":"Online CPUs","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_cpu_total_usage","description":"Last read total CPU usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_cpu_kernelmode_usage","description":"Last read CPU kernel mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_cpu_usermode_usage","description":"Last read CPU user mode usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_system_cpu_usage","description":"Last read CPU system usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pre_online_cpus","description":"Last read online CPUs","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_usage","description":"Memory usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_max_usage","description":"Memory maximum usage","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"Memory limit","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"network_rx_bytes","description":"Total network bytes read","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"network_tx_bytes","description":"Total network bytes transmitted","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_containers","description":"Docker containers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Container ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Container name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"image","description":"Docker image (name) used to launch this container","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"image_id","description":"Docker image ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command","description":"Command with arguments","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Container state (created, restarting, running, removing, paused, exited, dead)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Container status information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Identifier of the initial process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Container path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_entrypoint","description":"Container entrypoint(s)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"started_at","description":"Container start time as string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"finished_at","description":"Container finish time as string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"privileged","description":"Is the container privileged","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"security_options","description":"List of container security options","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"env_variables","description":"Container environmental variables","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"readonly_rootfs","description":"Is the root filesystem mounted as read only","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cgroup_namespace","description":"cgroup namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"ipc_namespace","description":"IPC namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mnt_namespace","description":"Mount namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"net_namespace","description":"Network namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"pid_namespace","description":"PID namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"user_namespace","description":"User namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"uts_namespace","description":"UTS namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"docker_image_history","description":"Docker image history information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of instruction in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"created_by","description":"Created by instruction","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of tags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Instruction comment","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_image_labels","description":"Docker image labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_image_layers","description":"Docker image layers information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"layer_id","description":"Layer ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"layer_order","description":"Layer Order (1 = base layer)","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_images","description":"Docker images information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size_bytes","description":"Size of image in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Comma-separated list of repository tags","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_info","description":"Docker system information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Docker system ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"containers","description":"Total number of containers","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"containers_running","description":"Number of containers currently running","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"containers_paused","description":"Number of containers in paused state","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"containers_stopped","description":"Number of containers in stopped state","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"images","description":"Number of images","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"storage_driver","description":"Storage driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_limit","description":"1 if memory limit support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_limit","description":"1 if swap limit support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_memory","description":"1 if kernel memory limit support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_period","description":"1 if CPU Completely Fair Scheduler (CFS) period support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_cfs_quota","description":"1 if CPU Completely Fair Scheduler (CFS) quota support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_shares","description":"1 if CPU share weighting support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_set","description":"1 if CPU set selection support is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_forwarding","description":"1 if IPv4 forwarding is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bridge_nf_iptables","description":"1 if bridge netfilter iptables is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bridge_nf_ip6tables","description":"1 if bridge netfilter ip6tables is enabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"oom_kill_disable","description":"1 if Out-of-memory kill is disabled. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logging_driver","description":"Logging driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cgroup_driver","description":"Control groups driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os_type","description":"Operating system type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpus","description":"Number of CPUs","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"memory","description":"Total memory","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"http_proxy","description":"HTTP proxy","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"https_proxy","description":"HTTPS proxy","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"no_proxy","description":"Comma-separated list of domain extensions proxy should not be used for","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the docker host","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"server_version","description":"Server version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root_dir","description":"Docker root directory","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_network_labels","description":"Docker network labels.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_networks","description":"Docker networks information.","platforms":["darwin","linux"],"columns":[{"name":"id","description":"Network ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Network name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Network driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Time of creation as UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"enable_ipv6","description":"1 if IPv6 is enabled on this network. 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"subnet","description":"Network subnet","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Network gateway","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_version","description":"Docker version information.","platforms":["darwin","linux"],"columns":[{"name":"version","description":"Docker version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"api_version","description":"API version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"min_api_version","description":"Minimum API version supported","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"git_commit","description":"Docker build git commit","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"go_version","description":"Go version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"Operating system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Hardware architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Kernel version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Build time","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_volume_labels","description":"Docker volume labels.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Label key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"value","description":"Optional label value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"docker_volumes","description":"Docker volumes information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Volume name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"driver","description":"Volume driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mount_point","description":"Mount point","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Volume type","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"drivers","description":"Details for in-use Windows device drivers. This does not display installed but unused drivers.","platforms":["windows"],"columns":[{"name":"device_id","description":"Device ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_name","description":"Device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"image","description":"Path to driver image file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Driver description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service","description":"Driver service name, if one exists","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service_key","description":"Driver service registry key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Driver version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inf","description":"Associated inf file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Device/driver class name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider","description":"Driver provider","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Device manufacturer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver_key","description":"Driver key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"date","description":"Driver date","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"signed","description":"Whether the driver is signed or not","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_metadata","description":"EC2 instance metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instance_type","description":"EC2 instance type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Hardware architecture of this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"region","description":"AWS region in which this instance launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"availability_zone","description":"Availability zone in which this instance launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Private IPv4 DNS hostname of the first interface of this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_ipv4","description":"Private IPv4 address of the first interface of this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC address for the first network interface of this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_groups","description":"Comma separated list of security group names","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iam_arn","description":"If there is an IAM role associated with the instance, contains instance profile ARN","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ami_id","description":"AMI ID used to launch this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reservation_id","description":"ID of the reservation","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"account_id","description":"AWS account ID which owns this EC2 instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ec2_instance_tags","description":"EC2 instance tag key value pairs.","platforms":["darwin","linux","windows"],"columns":[{"name":"instance_id","description":"EC2 instance ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Tag key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Tag value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"es_process_events","description":"Process execution events from EndpointSecurity.","platforms":["darwin"],"columns":[{"name":"version","description":"Version of EndpointSecurity event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seq_num","description":"Per event sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"global_seq_num","description":"Global sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"original_parent","description":"Original parent process ID in case of reparenting","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline_count","description":"Number of command line arguments","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective User ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective Group ID of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signing_id","description":"Signature identifier of the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"team_id","description":"Team identifier of thd process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Codesigning hash of the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_binary","description":"Indicates if the binary is Apple signed binary (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"exit_code","description":"Exit code of a process in case of an exit event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"child_pid","description":"Process ID of a child process in case of a fork event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"event_type","description":"Type of EndpointSecurity event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"codesigning_flags","description":"Codesigning flags matching one of these options, in a comma separated list: NOT_VALID, ADHOC, NOT_RUNTIME, INSTALLER. See kern/cs_blobs.h in XNU for descriptions.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"es_process_file_events","description":"Process execution events from EndpointSecurity.","platforms":["darwin"],"columns":[{"name":"version","description":"Version of EndpointSecurity event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seq_num","description":"Per event sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"global_seq_num","description":"Global sequence number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"The source or target filename for the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dest_filename","description":"Destination filename for the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"event_type","description":"Type of EndpointSecurity event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"etc_hosts","description":"Line-parsed /etc/hosts.","platforms":["darwin","linux","windows"],"columns":[{"name":"address","description":"IP address mapping","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hostnames","description":"Raw hosts mapping","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"etc_protocols","description":"Line-parsed /etc/protocols.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Protocol name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"number","description":"Protocol number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"alias","description":"Protocol alias","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Comment with protocol description","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"etc_services","description":"Line-parsed /etc/services.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"port","description":"Service port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Optional space separated list of other names for a service","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional comment for a service.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"event_taps","description":"Returns information about installed event taps.","platforms":["darwin"],"columns":[{"name":"enabled","description":"Is the Event Tap enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"event_tap_id","description":"Unique ID for the Tap","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"event_tapped","description":"The mask that identifies the set of events to be observed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"process_being_tapped","description":"The process ID of the target application","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"tapping_process","description":"The process ID of the application that created the event tap.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"extended_attributes","description":"Returns the extended attributes for files (similar to Windows ADS).","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute file path","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"directory","description":"Directory of file(s)","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the value generated from the extended attribute","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"The parsed information from the attribute","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"base64","description":"1 if the value is base64 encoded else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"fan_speed_sensors","description":"Fan speeds.","platforms":["darwin"],"columns":[{"name":"fan","description":"Fan number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Fan name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"actual","description":"Actual speed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimum speed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum speed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"target","description":"Target speed","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"file","description":"Interactive filesystem attributes and metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"Absolute file path","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"directory","description":"Directory of file(s)","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"filename","description":"Name portion of file path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"Device ID (optional)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block_size","description":"Block size of filesystem","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"btime","description":"(B)irth or (cr)eate time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hard_links","description":"Number of hard links","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"symlink","description":"1 if the path is a symlink, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"File status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"attributes","description":"File attrib string. See: https://ss64.com/nt/attrib.html","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"volume_serial","description":"Volume serial number","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"file_id","description":"file ID","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"file_version","description":"File version","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"product_version","description":"File product version","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"original_filename","description":"(Executable files only) Original filename","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"bsd_flags","description":"The BSD file flags (chflags). Possible values: NODUMP, UF_IMMUTABLE, UF_APPEND, OPAQUE, HIDDEN, ARCHIVED, SF_IMMUTABLE, SF_APPEND","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"file_events","description":"Track time/action changes to files specified in configuration data.","platforms":["darwin","linux"],"columns":[{"name":"target_path","description":"The path associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file defined in the config","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Filesystem inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Owning user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Owning group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Permission bits","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of file in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Last access time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last status change time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"md5","description":"The MD5 of the file after change","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"The SHA1 of the file after change","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"The SHA256 of the file after change","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hashed","description":"1 if the file was hashed, 0 if not, -1 if hashing failed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"firefox_addons","description":"Firefox browser extensions, webapps, and addons.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"The local user that owns the addon","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Addon display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Addon identifier","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"creator","description":"Addon-supported creator string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Extension, addon, webapp","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Addon-supplied version string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Addon-supplied description string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source_url","description":"URL that installed the addon","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"visible","description":"1 If the addon is shown in browser else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If the addon is active else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 If the addon is application-disabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"1 If the addon applies background updates else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"location","description":"Global, profile location","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to plugin bundle","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper","description":"macOS Gatekeeper Details.","platforms":["darwin"],"columns":[{"name":"assessments_enabled","description":"1 If a Gatekeeper is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"dev_id_enabled","description":"1 If a Gatekeeper allows execution from identified developers else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of Gatekeeper's gke.bundle","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"opaque_version","description":"Version of Gatekeeper's gkopaque.bundle","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"gatekeeper_approved_apps","description":"Gatekeeper apps a user has allowed to run.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of executable allowed to run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"requirement","description":"Code signing requirement language","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Last change time","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Last modification time","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"groups","description":"Local system groups.","platforms":["darwin","linux","windows"],"columns":[{"name":"gid","description":"Unsigned int64 group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid_signed","description":"A signed int64 version of gid","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Canonical local group name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"group_sid","description":"Unique group ID","type":"text","notes":"","hidden":true,"required":false,"index":true,"platforms":["windows","win32","cygwin"]},{"name":"comment","description":"Remarks or comments associated with the group","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"hardware_events","description":"Hardware (PCI/USB/HID) events from UDEV or IOKit.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"Remove, insert, change properties, etc","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Local device path assigned (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of hardware and hardware event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Driver claiming the device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Hardware device vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded Hardware vendor identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"Hardware device model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded Hardware model identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"Device serial (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"revision","description":"Device revision (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of hardware event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"hash","description":"Filesystem hash data.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"directory","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"md5","description":"MD5 hash of provided filesystem data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of provided filesystem data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 hash of provided filesystem data","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"homebrew_packages","description":"The installed homebrew package database.","platforms":["darwin"],"columns":[{"name":"name","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Package install path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Current 'linked' version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"prefix","description":"Homebrew install prefix","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"hvci_status","description":"Retrieve HVCI info of the machine.","platforms":["windows"],"columns":[{"name":"version","description":"The version number of the Device Guard build.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instance_identifier","description":"The instance ID of Device Guard.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vbs_status","description":"The status of the virtualization based security settings. Returns UNKNOWN if an error is encountered.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"code_integrity_policy_enforcement_status","description":"The status of the code integrity policy enforcement settings. Returns UNKNOWN if an error is encountered.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"umci_policy_status","description":"The status of the User Mode Code Integrity security settings. Returns UNKNOWN if an error is encountered.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ibridge_info","description":"Information about the Apple iBridge hardware controller.","platforms":["darwin"],"columns":[{"name":"boot_uuid","description":"Boot UUID of the iBridge controller","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"coprocessor_version","description":"The manufacturer and chip version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"firmware_version","description":"The build version of the firmware","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"unique_chip_id","description":"Unique id of the iBridge controller","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ie_extensions","description":"Internet Explorer browser extensions.","platforms":["windows"],"columns":[{"name":"name","description":"Extension display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registry_path","description":"Extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Version of the executable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executable","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"intel_me_info","description":"Intel ME/CSE Info.","platforms":["linux","windows"],"columns":[{"name":"version","description":"Intel ME version","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"interface_addresses","description":"Network interfaces and relevant metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"interface","description":"Interface name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mask","description":"Interface netmask","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"broadcast","description":"Broadcast address for the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"point_to_point","description":"PtP address for the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of address. One of dhcp, manual, auto, other, unknown","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"interface_details","description":"Detailed information and stats of network interfaces.","platforms":["darwin","linux","windows"],"columns":[{"name":"interface","description":"Interface name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mac","description":"MAC of interface (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Interface type (includes virtual)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Network MTU","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"metric","description":"Metric based on the speed of the interface","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags (netdevice) for the device","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipackets","description":"Input packets","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"opackets","description":"Output packets","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ibytes","description":"Input bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"obytes","description":"Output bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ierrors","description":"Input errors","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"oerrors","description":"Output errors","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"idrops","description":"Input drops","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"odrops","description":"Output drops","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"collisions","description":"Packet Collisions detected","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Time of last device modification (optional)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"link_speed","description":"Interface speed in Mb/s","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"pci_slot","description":"PCI slot number","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"friendly_name","description":"The friendly display name of the interface.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"description","description":"Short description of the object a one-line string.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"manufacturer","description":"Name of the network adapter's manufacturer.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"connection_id","description":"Name of the network connection as it appears in the Network Connections Control Panel program.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"connection_status","description":"State of the network adapter connection to the network.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"enabled","description":"Indicates whether the adapter is enabled or not.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"physical_adapter","description":"Indicates whether the adapter is a physical or a logical adapter.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"speed","description":"Estimate of the current bandwidth in bits per second.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"service","description":"The name of the service the network adapter uses.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_enabled","description":"If TRUE, the dynamic host configuration protocol (DHCP) server automatically assigns an IP address to the computer system when establishing a network connection.","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_lease_expires","description":"Expiration date and time for a leased IP address that was assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_lease_obtained","description":"Date and time the lease was obtained for the IP address assigned to the computer by the dynamic host configuration protocol (DHCP) server.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dhcp_server","description":"IP address of the dynamic host configuration protocol (DHCP) server.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_domain","description":"Organization name followed by a period and an extension that indicates the type of organization, such as 'microsoft.com'.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_domain_suffix_search_order","description":"Array of DNS domain suffixes to be appended to the end of host names during name resolution.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_host_name","description":"Host name used to identify the local computer for authentication by some utilities.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"dns_server_search_order","description":"Array of server IP addresses to be used in querying for DNS servers.","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"interface_ipv6","description":"IPv6 configuration and stats of network interfaces.","platforms":["darwin","linux"],"columns":[{"name":"interface","description":"Interface name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hop_limit","description":"Current Hop Limit","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"forwarding_enabled","description":"Enable IP forwarding","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"redirect_accept","description":"Accept ICMP redirect messages","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"rtadv_accept","description":"Accept ICMP Router Advertisement","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"iokit_devicetree","description":"The IOKit registry matching the DeviceTree plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Device node name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent device registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"device_path","description":"Device tree path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service","description":"1 if the device conforms to IOService else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the device is in a busy state else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The device reference count","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"depth","description":"Device nested depth","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"iokit_registry","description":"The full IOKit registry without selecting a plane.","platforms":["darwin"],"columns":[{"name":"name","description":"Default name of the node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"Best matching device class (most-specific category)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"id","description":"IOKit internal registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Parent registry ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"busy_state","description":"1 if the node is in a busy state else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"retain_count","description":"The node reference count","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"depth","description":"Node nested depth","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"iptables","description":"Linux IP packet filtering and NAT tool.","platforms":["linux"],"columns":[{"name":"filter_name","description":"Packet matching filter table name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"chain","description":"Size of module content.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy","description":"Policy that applies for this rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"target","description":"Target that applies for this rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Protocol number identification.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"src_port","description":"Protocol source port(s).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dst_port","description":"Protocol destination port(s).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"src_ip","description":"Source IP address.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"src_mask","description":"Source IP address mask.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iniface","description":"Input interface for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iniface_mask","description":"Input interface mask for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dst_ip","description":"Destination IP address.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dst_mask","description":"Destination IP address mask.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"outiface","description":"Output interface for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"outiface_mask","description":"Output interface mask for the rule.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"match","description":"Matching rule that applies.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"packets","description":"Number of matching packets for this rule.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes","description":"Number of matching bytes for this rule.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_extensions","description":"macOS's kernel extensions, both loaded and within the load search path.","platforms":["darwin"],"columns":[{"name":"idx","description":"Extension load tag or index","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"refs","description":"Reference count","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Bytes of wired memory used by extension","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension label","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"linked_against","description":"Indexes of extensions this extension is linked against","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Optional path to extension bundle","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_info","description":"Basic active kernel information.","platforms":["darwin","linux","windows"],"columns":[{"name":"version","description":"Kernel version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arguments","description":"Kernel arguments","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Kernel path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"Kernel device identifier","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_modules","description":"Linux kernel modules both loaded and within the load search path.","platforms":["linux"],"columns":[{"name":"name","description":"Module name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of module content","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"used_by","description":"Module reverse dependencies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Kernel module status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Kernel module address","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kernel_panics","description":"System kernel panic logs.","platforms":["darwin"],"columns":[{"name":"path","description":"Location of log file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Formatted time of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registers","description":"A space delimited line of register:value pairs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"frame_backtrace","description":"Backtrace of the crashed module","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"module_backtrace","description":"Modules appearing in the crashed module's backtrace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dependencies","description":"Module dependencies existing in crashed module's backtrace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Process name corresponding to crashed thread","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os_version","description":"Version of the operating system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"kernel_version","description":"Version of the system kernel","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"system_model","description":"Physical system model, for example 'MacBookPro12,1 (Mac-E43C1C25D4880AD6)'","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"System uptime at kernel panic in nanoseconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_loaded","description":"Last loaded module before panic","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_unloaded","description":"Last unloaded module before panic","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"keychain_acls","description":"Applications that have ACL entries in the keychain.","platforms":["darwin"],"columns":[{"name":"keychain_path","description":"The path of the keychain","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authorizations","description":"A space delimited set of authorization attributes","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path of the authorized application","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"The description included with the ACL entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"An optional label tag that may be included with the keychain entry","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"keychain_items","description":"Generic details about keychain items.","platforms":["darwin"],"columns":[{"name":"label","description":"Generic item name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional item description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"comment","description":"Optional keychain comment","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"account","description":"Optional item account","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"created","description":"Date item was created","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"modified","description":"Date of last modification","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Keychain item type (class)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to keychain containing item","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"known_hosts","description":"A line-delimited known_hosts table.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"The local user that owns the known_hosts file","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"parsed authorized keys line","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key_file","description":"Path to known_hosts file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"kva_speculative_info","description":"Display kernel virtual address and speculative execution information for the system.","platforms":["windows"],"columns":[{"name":"kva_shadow_enabled","description":"Kernel Virtual Address shadowing is enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kva_shadow_user_global","description":"User pages are marked as global.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kva_shadow_pcid","description":"Kernel VA PCID flushing optimization is enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"kva_shadow_inv_pcid","description":"Kernel VA INVPCID is enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bp_mitigations","description":"Branch Prediction mitigations are enabled.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bp_system_pol_disabled","description":"Branch Predictions are disabled via system policy.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bp_microcode_disabled","description":"Branch Predictions are disabled due to lack of microcode update.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_spec_ctrl_supported","description":"SPEC_CTRL MSR supported by CPU Microcode.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ibrs_support_enabled","description":"Windows uses IBRS.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"stibp_support_enabled","description":"Windows uses STIBP.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_pred_cmd_supported","description":"PRED_CMD MSR supported by CPU Microcode.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"last","description":"System logins and logouts.","platforms":["darwin","linux"],"columns":[{"name":"username","description":"Entry username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tty","description":"Entry terminal","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Entry type, according to ut_type types (utmp.h)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type_name","description":"Entry type name, according to ut_type types (utmp.h)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Entry hostname","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"launchd","description":"LaunchAgents and LaunchDaemons from default search paths.","platforms":["darwin"],"columns":[{"name":"path","description":"Path to daemon or agent plist","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"File name of plist (used by launchd)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"Daemon or agent service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"program","description":"Path to target program","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"run_at_load","description":"Should the program run on launch load","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"keep_alive","description":"Should the process be restarted if killed","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"on_demand","description":"Deprecated key, replaced by keep_alive","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"disabled","description":"Skip loading this daemon or agent on boot","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Run this daemon or agent as this username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Run this daemon or agent as this group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"stdout_path","description":"Pipe stdout to a target path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"stderr_path","description":"Pipe stderr to a target path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start_interval","description":"Frequency to run in seconds","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"program_arguments","description":"Command line arguments passed to program","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"watch_paths","description":"Key that launches daemon or agent if path is modified","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"queue_directories","description":"Similar to watch_paths but only with non-empty directories","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inetd_compatibility","description":"Run this daemon or agent as it was launched from inetd","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start_on_mount","description":"Run daemon or agent every time a filesystem is mounted","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root_directory","description":"Key used to specify a directory to chroot to before launch","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"working_directory","description":"Key used to specify a directory to chdir to before launch","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"process_type","description":"Key describes the intended purpose of the job","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"launchd_overrides","description":"Override keys, per user, for LaunchDaemons and Agents.","platforms":["darwin"],"columns":[{"name":"label","description":"Daemon or agent service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Name of the override key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Overridden value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID applied to the override, 0 applies to all","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to daemon or agent plist","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"listening_ports","description":"Processes with listening (bound) network sockets/ports.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"port","description":"Transport layer port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Specific address for bind","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"Socket file descriptor number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path for UNIX domain sockets","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"load_average","description":"Displays information about the system wide load averages.","platforms":["darwin","linux"],"columns":[{"name":"period","description":"Period over which the average is calculated.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"average","description":"Load average over the specified period.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"location_services","description":"Reports the status of the Location Services feature of the OS.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 if Location Services are enabled, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"logged_in_users","description":"Users with an active shell on the system.","platforms":["darwin","linux","windows"],"columns":[{"name":"type","description":"Login type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"User login name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tty","description":"Device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Remote hostname","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time entry was made","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"The user's unique security identifier","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"registry_hive","description":"HKEY_USERS registry hive","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"logical_drives","description":"Details for logical drives on the system. A logical drive generally represents a single partition.","platforms":["windows"],"columns":[{"name":"device_id","description":"The drive id, usually the drive name, e.g., 'C:'.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Deprecated (always 'Unknown').","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"The canonical description of the drive, e.g. 'Logical Fixed Disk', 'CD-ROM Disk'.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"free_space","description":"The amount of free space, in bytes, of the drive (-1 on failure).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"The total amount of space, in bytes, of the drive (-1 on failure).","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"file_system","description":"The file system of the drive.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"boot_partition","description":"True if Windows booted from this drive.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"logon_sessions","description":"Windows Logon Session.","platforms":["windows"],"columns":[{"name":"logon_id","description":"A locally unique identifier (LUID) that identifies a logon session.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"The account name of the security principal that owns the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_domain","description":"The name of the domain used to authenticate the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authentication_package","description":"The authentication package used to authenticate the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_type","description":"The logon method.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"session_id","description":"The Terminal Services session identifier.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_sid","description":"The user's security identifier (SID).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_time","description":"The time the session owner logged on.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_server","description":"The name of the server used to authenticate the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dns_domain_name","description":"The DNS name for the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"upn","description":"The user principal name (UPN) for the owner of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_script","description":"The script used for logging on.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_path","description":"The home directory for the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"home_directory","description":"The home directory for the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"home_directory_drive","description":"The drive location of the home directory of the logon session.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_certificates","description":"LXD certificates information.","platforms":["linux"],"columns":[{"name":"name","description":"Name of the certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fingerprint","description":"SHA256 hash of the certificate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"certificate","description":"Certificate content","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster","description":"LXD cluster information.","platforms":["linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether clustering enabled (1) or not (0) on this node","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_entity","description":"Type of configuration parameter for this node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_name","description":"Name of configuration parameter","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_key","description":"Config key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_value","description":"Config value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"member_config_description","description":"Config description","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_cluster_members","description":"LXD cluster members information.","platforms":["linux"],"columns":[{"name":"server_name","description":"Name of the LXD server node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"url","description":"URL of the node","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"database","description":"Whether the server is a database node (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Status of the node (Online/Offline)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the node (Online/Offline)","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_images","description":"LXD images information.","platforms":["linux"],"columns":[{"name":"id","description":"Image ID","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"architecture","description":"Target architecture for the image","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"OS on which image is based","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"release","description":"OS release version on which the image is based","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Image description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"aliases","description":"Comma-separated list of image aliases","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Filename of the image file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of image in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"auto_update","description":"Whether the image auto-updates (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cached","description":"Whether image is cached (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"public","description":"Whether image is public (1) or not (0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of image creation","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"expires_at","description":"ISO time of image expiration","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uploaded_at","description":"ISO time of image upload","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_used_at","description":"ISO time for the most recent use of this image in terms of container spawn","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_server","description":"Server for image update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_protocol","description":"Protocol used for image information update and image import from source server","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_certificate","description":"Certificate for update source server","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_source_alias","description":"Alias of image at update source server","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_config","description":"LXD instance configuration information.","platforms":["linux"],"columns":[{"name":"name","description":"Instance name","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"key","description":"Configuration parameter name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Configuration parameter value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_instance_devices","description":"LXD instance devices information.","platforms":["linux"],"columns":[{"name":"name","description":"Instance name","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"device","description":"Name of the device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_type","description":"Device type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Device info param name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Device info param value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_instances","description":"LXD instances information.","platforms":["linux"],"columns":[{"name":"name","description":"Instance name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"status","description":"Instance state (running, stopped, etc.)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"stateful","description":"Whether the instance is stateful(1) or not(0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ephemeral","description":"Whether the instance is ephemeral(1) or not(0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"created_at","description":"ISO time of creation","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"base_image","description":"ID of image used to launch this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"architecture","description":"Instance architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"os","description":"The OS of this instance","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Instance description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Instance's process ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"processes","description":"Number of processes running inside this instance","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_networks","description":"LXD network information.","platforms":["linux"],"columns":[{"name":"name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"managed","description":"1 if network created by LXD, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv4_address","description":"IPv4 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipv6_address","description":"IPv6 address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"used_by","description":"URLs for containers using this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_received","description":"Number of bytes received on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_sent","description":"Number of bytes sent on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"packets_received","description":"Number of packets received on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"packets_sent","description":"Number of packets sent on this network","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hwaddr","description":"Hardware address for this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Network status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mtu","description":"MTU size","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"lxd_storage_pools","description":"LXD storage pool information.","platforms":["linux"],"columns":[{"name":"name","description":"Name of the storage pool","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"Storage driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Storage pool source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of the storage pool","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"space_used","description":"Storage space used in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"space_total","description":"Total available storage space in bytes for this storage pool","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes_used","description":"Number of inodes used","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes_total","description":"Total number of inodes available in this storage pool","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"magic","description":"Magic number recognition library table.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Absolute path to target file","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"magic_db_files","description":"Colon(:) separated list of files where the magic db file can be found. By default one of the following is used: /usr/share/file/magic/magic, /usr/share/misc/magic or /usr/share/misc/magic.mgc","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Magic number data from libmagic","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mime_type","description":"MIME type data from libmagic","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mime_encoding","description":"MIME encoding data from libmagic","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"managed_policies","description":"The managed configuration policies from AD, MDM, MCX, etc.","platforms":["darwin"],"columns":[{"name":"domain","description":"System or manager-chosen domain key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Optional UUID assigned to policy set","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Policy key name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Policy value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Policy applies only this user","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manual","description":"1 if policy was loaded manually, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"md_devices","description":"Software RAID array settings.","platforms":["linux"],"columns":[{"name":"device_name","description":"md device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Current state of the array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"raid_level","description":"Current raid level of the array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"size of the array in blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"chunk_size","description":"chunk size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"raid_disks","description":"Number of configured RAID disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nr_raid_disks","description":"Number of partitions or disk devices to comprise the array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"working_disks","description":"Number of working disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active_disks","description":"Number of active disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"failed_disks","description":"Number of failed disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"spare_disks","description":"Number of idle disks in array","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"superblock_state","description":"State of the superblock","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"superblock_version","description":"Version of the superblock","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"superblock_update_time","description":"Unix timestamp of last update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"bitmap_on_mem","description":"Pages allocated in in-memory bitmap, if enabled","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bitmap_chunk_size","description":"Bitmap chunk size","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bitmap_external_file","description":"External referenced bitmap file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"recovery_progress","description":"Progress of the recovery activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"recovery_finish","description":"Estimated duration of recovery activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"recovery_speed","description":"Speed of recovery activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resync_progress","description":"Progress of the resync activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resync_finish","description":"Estimated duration of resync activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"resync_speed","description":"Speed of resync activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reshape_progress","description":"Progress of the reshape activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reshape_finish","description":"Estimated duration of reshape activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"reshape_speed","description":"Speed of reshape activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"check_array_progress","description":"Progress of the check array activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"check_array_finish","description":"Estimated duration of the check array activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"check_array_speed","description":"Speed of the check array activity","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"unused_devices","description":"Unused devices","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"other","description":"Other information associated with array from /proc/mdstat","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"md_drives","description":"Drive devices used for Software RAID.","platforms":["linux"],"columns":[{"name":"md_device_name","description":"md device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"drive_name","description":"Drive device name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"slot","description":"Slot position of disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the drive","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"md_personalities","description":"Software RAID setting supported by the kernel.","platforms":["linux"],"columns":[{"name":"name","description":"Name of personality supported by kernel","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"mdfind","description":"Run searches against the spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file returned from spotlight","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query","description":"The query that was run to find the file","type":"text","notes":"","hidden":false,"required":true,"index":false}]},{"name":"mdls","description":"Query file metadata in the Spotlight database.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of the file","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"key","description":"Name of the metadata key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Value stored in the metadata key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"valuetype","description":"CoreFoundation type of data stored in value","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"memory_array_mapped_addresses","description":"Data associated for address mapping of physical memory arrays.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_array_handle","description":"Handle of the memory array associated with this structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partition_width","description":"Number of memory devices that form a single row of memory for the address partition of this structure","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_arrays","description":"Data associated with collection of memory devices that operate to form a memory address.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"location","description":"Physical location of the memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"use","description":"Function for which the array is used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_error_correction","description":"Primary hardware error correction or detection method supported","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"max_capacity","description":"Maximum capacity of array in gigabytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_error_info_handle","description":"Handle, or instance number, associated with any error that was detected for the array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"number_memory_devices","description":"Number of memory devices on array","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_device_mapped_addresses","description":"Data associated for address mapping of physical memory devices.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_device_handle","description":"Handle of the memory device structure associated with this structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_array_mapped_address_handle","description":"Handle of the memory array mapped address to which this device range is mapped to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"starting_address","description":"Physical stating address, in kilobytes, of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ending_address","description":"Physical ending address of last kilobyte of a range of memory mapped to physical memory array","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partition_row_position","description":"Identifies the position of the referenced memory device in a row of the address partition","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"interleave_position","description":"The position of the device in a interleave, i.e. 0 indicates non-interleave, 1 indicates 1st interleave, 2 indicates 2nd interleave, etc.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"interleave_data_depth","description":"The max number of consecutive rows from memory device that are accessed in a single interleave transfer; 0 indicates device is non-interleave","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_devices","description":"Physical memory device (type 17) information retrieved from SMBIOS.","platforms":["darwin","linux","windows"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure in SMBIOS","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"array_handle","description":"The memory array that the device is attached to","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"form_factor","description":"Implementation form factor for this memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"total_width","description":"Total width, in bits, of this memory device, including any check or error-correction bits","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"data_width","description":"Data width, in bits, of this memory device","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size of memory device in Megabyte","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"set","description":"Identifies if memory device is one of a set of devices. A value of 0 indicates no set affiliation.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"device_locator","description":"String number of the string that identifies the physically-labeled socket or board position where the memory device is located","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bank_locator","description":"String number of the string that identifies the physically-labeled bank where the memory device is located","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_type","description":"Type of memory used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_type_details","description":"Additional details for memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"max_speed","description":"Max speed of memory device in megatransfers per second (MT/s)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"configured_clock_speed","description":"Configured speed of memory device in megatransfers per second (MT/s)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"Manufacturer ID string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_number","description":"Serial number of memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"asset_tag","description":"Manufacturer specific asset tag of memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"part_number","description":"Manufacturer specific serial number of memory device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"min_voltage","description":"Minimum operating voltage of device in millivolts","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_voltage","description":"Maximum operating voltage of device in millivolts","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"configured_voltage","description":"Configured operating voltage of device in millivolts","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_error_info","description":"Data associated with errors of a physical memory array.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_type","description":"type of error associated with current error status for array or device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_granularity","description":"Granularity to which the error can be resolved","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_operation","description":"Memory access operation that caused the error","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_syndrome","description":"Vendor specific ECC syndrome or CRC data associated with the erroneous access","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_array_error_address","description":"32 bit physical address of the error based on the addressing of the bus to which the memory array is connected","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_error_address","description":"32 bit physical address of the error relative to the start of the failing memory address, in bytes","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"error_resolution","description":"Range, in bytes, within which this error can be determined, when an error address is given","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_info","description":"Main memory information in bytes.","platforms":["linux"],"columns":[{"name":"memory_total","description":"Total amount of physical RAM, in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_free","description":"The amount of physical RAM, in bytes, left unused by the system","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"memory_available","description":"The amount of physical RAM, in bytes, available for starting new applications, without swapping","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"buffers","description":"The amount of physical RAM, in bytes, used for file buffers","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cached","description":"The amount of physical RAM, in bytes, used as cache memory","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_cached","description":"The amount of swap, in bytes, used as cache memory","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"The total amount of buffer or page cache memory, in bytes, that is in active use","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inactive","description":"The total amount of buffer or page cache memory, in bytes, that are free and available","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_total","description":"The total amount of swap available, in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_free","description":"The total amount of swap free, in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"memory_map","description":"OS memory region map.","platforms":["linux"],"columns":[{"name":"name","description":"Region name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start","description":"Start address of memory region","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"end","description":"End address of memory region","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"mounts","description":"System mounted devices and filesystems (not process specific).","platforms":["darwin","linux"],"columns":[{"name":"device","description":"Mounted device","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"device_alias","description":"Mounted device alias","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Mounted device path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Mounted device type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_size","description":"Block size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks","description":"Mounted device used blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_free","description":"Mounted device free blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"blocks_available","description":"Mounted device available blocks","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes","description":"Mounted device used inodes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inodes_free","description":"Mounted device free inodes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"Mounted device flags","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"msr","description":"Various pieces of data stored in the model specific register per processor. NOTE: the msr kernel module must be enabled, and osquery must be run as root.","platforms":["linux"],"columns":[{"name":"processor_number","description":"The processor number as reported in /proc/cpuinfo","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"turbo_disabled","description":"Whether the turbo feature is disabled.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"turbo_ratio_limit","description":"The turbo feature ratio limit.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_info","description":"Platform information.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"perf_ctl","description":"Performance setting for the processor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"perf_status","description":"Performance status for the processor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"feature_control","description":"Bitfield controlling enabled features.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"rapl_power_limit","description":"Run Time Average Power Limiting power limit.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"rapl_energy_status","description":"Run Time Average Power Limiting energy status.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"rapl_power_units","description":"Run Time Average Power Limiting power units.","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"nfs_shares","description":"NFS shares exported by the host.","platforms":["darwin"],"columns":[{"name":"share","description":"Filesystem path to the share","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"options","description":"Options string set on the export share","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"readonly","description":"1 if the share is exported readonly else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"npm_packages","description":"Node packages installed in a system.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Package-supplied description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Package-supplied author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"homepage","description":"Package supplied homepage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this module resides","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"Directory where node_modules are located","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"ntdomains","description":"Display basic NT domain information of a Windows machine.","platforms":["windows"],"columns":[{"name":"name","description":"The label by which the object is known.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"client_site_name","description":"The name of the site where the domain controller is configured.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dc_site_name","description":"The name of the site where the domain controller is located.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dns_forest_name","description":"The name of the root of the DNS tree.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain_controller_address","description":"The IP Address of the discovered domain controller..","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain_controller_name","description":"The name of the discovered domain controller.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"domain_name","description":"The name of the domain.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"The current status of the domain object.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ntfs_acl_permissions","description":"Retrieve NTFS ACL permission information for files and directories.","platforms":["windows"],"columns":[{"name":"path","description":"Path to the file or directory.","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"type","description":"Type of access mode for the access control entry.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"principal","description":"User or group to which the ACE applies.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"access","description":"Specific permissions that indicate the rights described by the ACE.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inherited_from","description":"The inheritance policy of the ACE.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ntfs_journal_events","description":"Track time/action changes to files specified in configuration data.","platforms":["windows"],"columns":[{"name":"action","description":"Change action (Write, Delete, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The category that the event originated from","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"old_path","description":"Old path (renames only)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"record_timestamp","description":"Journal record timestamp","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"record_usn","description":"The update sequence number that identifies the journal record","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"node_ref_number","description":"The ordinal that associates a journal record with a filename","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"parent_ref_number","description":"The ordinal that associates a journal record with a filename's parent directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"drive_letter","description":"The drive letter identifying the source journal","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"file_attributes","description":"File attributes","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partial","description":"Set to 1 if either path or old_path only contains the file or folder name","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of file event","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"nvram","description":"Apple NVRAM variable listing.","platforms":["darwin"],"columns":[{"name":"name","description":"Variable name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Data type (CFData, CFString, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Raw variable data","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"oem_strings","description":"OEM defined strings retrieved from SMBIOS.","platforms":["darwin","linux"],"columns":[{"name":"handle","description":"Handle, or instance number, associated with the Type 11 structure","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"number","description":"The string index of the structure","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"The value of the OEM string","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"office_mru","description":"View recently opened Office documents.","platforms":["windows"],"columns":[{"name":"application","description":"Associated Office application","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Office application version number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"File path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_opened_time","description":"Most recent opened time file was opened","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"os_version","description":"A single row containing the operating system name and version.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Distribution or product name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Pretty, suitable for presentation, OS version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"major","description":"Major release version","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minor","description":"Minor release version","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"patch","description":"Optional patch release","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"build","description":"Optional build-specific or variant string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform","description":"OS Platform or ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_like","description":"Closely related platforms","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"codename","description":"OS version codename","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"OS Architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_date","description":"The install date of the OS.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"osquery_events","description":"Information about the event publishers and subscribers.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Event publisher or subscriber name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the associated publisher","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Either publisher or subscriber","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subscriptions","description":"Number of subscriptions the publisher received or subscriber used","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"events","description":"Number of events emitted or received since osquery started","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"refreshes","description":"Publisher only: number of runloop restarts","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"1 if the publisher or subscriber is active else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_extensions","description":"List of active osquery extensions.","platforms":["darwin","linux","windows"],"columns":[{"name":"uuid","description":"The transient ID assigned for communication","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Extension's name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension's version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdk_version","description":"osquery SDK version used to build the extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the extension's Thrift connection or library path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"SDK extension type: core, extension, or module","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_flags","description":"Configurable flags that modify osquery's behavior.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Flag name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Flag type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Flag description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"default_value","description":"Flag default value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Flag value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shell_only","description":"Is the flag shell only?","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_info","description":"Top level information about the running version of osquery.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread/handle) ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instance_id","description":"Unique, long-lived ID per instance of osquery","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"osquery toolkit version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_hash","description":"Hash of the working configuration state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_valid","description":"1 if the config was loaded and considered valid, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"extensions","description":"osquery extensions status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_platform","description":"osquery toolkit build platform","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_distro","description":"osquery toolkit platform distribution name (os version)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"UNIX time in seconds when the process started","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"watcher","description":"Process (or thread/handle) ID of optional watcher process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"platform_mask","description":"The osquery platform bitmask","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_packs","description":"Information about the current query packs that are loaded in osquery.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"The given name for this query pack","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"platform","description":"Platforms this query is supported on","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Minimum osquery version that this query will run on","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shard","description":"Shard restriction limit, 1-100, 0 meaning no restriction","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"discovery_cache_hits","description":"The number of times that the discovery query used cached values since the last time the config was reloaded","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"discovery_executions","description":"The number of times that the discovery queries have been executed since the last time the config was reloaded","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"Whether this pack is active (the version, platform and discovery queries match) yes=1, no=0.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_registry","description":"List the osquery registry plugins.","platforms":["darwin","linux","windows"],"columns":[{"name":"registry","description":"Name of the osquery registry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the plugin item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_uuid","description":"Extension route UUID (0 for core)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"internal","description":"1 If the plugin is internal else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"1 If this plugin is active else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"osquery_schedule","description":"Information about the current queries that are scheduled in osquery.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"The given name for this query","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query","description":"The exact query to run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"interval","description":"The interval in seconds to run this query, not an exact interval","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"executions","description":"Number of times the query was executed","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_executed","description":"UNIX time stamp in seconds of the last completed execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"denylisted","description":"1 if the query is denylisted else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"output_size","description":"Cumulative total number of bytes generated by the resultant rows of the query","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wall_time","description":"Total wall time in seconds spent executing (deprecated), hidden=True","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wall_time_ms","description":"Total wall time in milliseconds spent executing","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_wall_time_ms","description":"Wall time in milliseconds of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"user_time","description":"Total user time in milliseconds spent executing","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_user_time","description":"User time in milliseconds of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_time","description":"Total system time in milliseconds spent executing","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_system_time","description":"System time in milliseconds of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"average_memory","description":"Average of the bytes of resident memory left allocated after collecting results","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_memory","description":"Resident memory in bytes left allocated after collecting results of the latest execution","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"package_bom","description":"macOS package bill of materials (BOM) file list.","platforms":["darwin"],"columns":[{"name":"filepath","description":"Package file or directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Expected user of file or directory","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Expected group of file or directory","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Expected permissions","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Timestamp the file was installed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of package bom","type":"text","notes":"","hidden":false,"required":true,"index":false}]},{"name":"package_install_history","description":"macOS package install history.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Label packageIdentifiers","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Label date as UNIX timestamp","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package display version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Install source: usually the installer process name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"content_type","description":"Package content_type (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"package_receipts","description":"macOS package receipt details.","platforms":["darwin"],"columns":[{"name":"package_id","description":"Package domain identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"package_filename","description":"Filename of original .pkg file","type":"text","notes":"","hidden":true,"required":false,"index":true},{"name":"version","description":"Installed package version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"location","description":"Optional relative install path on volume","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_time","description":"Timestamp of install time","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"installer_name","description":"Name of installer process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of receipt plist","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"password_policy","description":"Password Policies for macOS.","platforms":["darwin"],"columns":[{"name":"uid","description":"User ID for the policy, -1 for policies that are global","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"policy_identifier","description":"Policy Identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_content","description":"Policy content","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"policy_description","description":"Policy description","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"patches","description":"Lists all the patches applied. Note: This does not include patches applied via MSI or downloaded from Windows Update (e.g. Service Packs).","platforms":["windows"],"columns":[{"name":"csname","description":"The name of the host the patch is installed on.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hotfix_id","description":"The KB ID of the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"caption","description":"Short description of the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Fuller description of the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fix_comments","description":"Additional comments about the patch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"installed_by","description":"The system context in which the patch as installed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the patch was installed. Lack of a value does not indicate that the patch was not installed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"installed_on","description":"The date when the patch was installed.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"pci_devices","description":"PCI devices active on the host system.","platforms":["darwin","linux"],"columns":[{"name":"pci_slot","description":"PCI Device used slot","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pci_class","description":"PCI Device class","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"PCI Device used driver","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"PCI Device vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded PCI Device vendor identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"PCI Device model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded PCI Device model identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pci_class_id","description":"PCI Device class ID in hex format","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"pci_subclass_id","description":"PCI Device subclass in hex format","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"pci_subclass","description":"PCI Device subclass","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_vendor_id","description":"Vendor ID of PCI device subsystem","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_vendor","description":"Vendor of PCI device subsystem","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_model_id","description":"Model ID of PCI device subsystem","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"subsystem_model","description":"Device description of PCI device subsystem","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"physical_disk_performance","description":"Provides provides raw data from performance counters that monitor hard or fixed disk drives on the system.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the physical disk","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_read","description":"Average number of bytes transferred from the disk during read operations","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_bytes_per_write","description":"Average number of bytes transferred to the disk during write operations","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_read_queue_length","description":"Average number of read requests that were queued for the selected disk during the sample interval","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_write_queue_length","description":"Average number of write requests that were queued for the selected disk during the sample interval","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_read","description":"Average time, in seconds, of a read operation of data from the disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"avg_disk_sec_per_write","description":"Average time, in seconds, of a write operation of data to the disk","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"current_disk_queue_length","description":"Number of requests outstanding on the disk at the time the performance data is collected","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_disk_read_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read requests","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_disk_write_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing write requests","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_disk_time","description":"Percentage of elapsed time that the selected disk drive is busy servicing read or write requests","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"percent_idle_time","description":"Percentage of time during the sample interval that the disk was idle","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"pipes","description":"Named and Anonymous pipes.","platforms":["windows"],"columns":[{"name":"pid","description":"Process ID of the process to which the pipe belongs","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of the pipe","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"instances","description":"Number of instances of the named pipe","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"max_instances","description":"The maximum number of instances creatable for this pipe","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"The flags indicating whether this pipe connection is a server or client end, and if the pipe for sending messages or bytes","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"platform_info","description":"Information about EFI/UEFI/ROM and platform/boot.","platforms":["darwin","linux","windows"],"columns":[{"name":"vendor","description":"Platform code vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Platform code version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"date","description":"Self-reported platform code update date","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"revision","description":"BIOS major and minor revision","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"extra","description":"Platform-specific additional information","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"firmware_type","description":"The type of firmware (uefi, bios, iboot, openfirmware, unknown).","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"Relative address of firmware mapping","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"size","description":"Size in bytes of firmware","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]},{"name":"volume_size","description":"(Optional) size of firmware volume","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]}]},{"name":"plist","description":"Read and parse a plist file.","platforms":["darwin"],"columns":[{"name":"key","description":"Preference top-level key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subkey","description":"Intermediate key path, includes lists/dicts","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"(required) read preferences from a plist","type":"text","notes":"","hidden":false,"required":true,"index":false}]},{"name":"portage_keywords","description":"A summary about portage configurations like keywords, mask and unmask.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"keyword","description":"The keyword applied to the package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mask","description":"If the package is masked","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"unmask","description":"If the package is unmasked","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"portage_packages","description":"List of currently installed packages.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The version which are affected by the use flags, empty means all","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"slot","description":"The slot used by package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"build_time","description":"Unix time when package was built","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"repository","description":"From which repository the ebuild was used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eapi","description":"The eapi for the ebuild","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"The size of the package","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"world","description":"If package is in the world file","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"portage_use","description":"List of enabled portage USE values for specific package.","platforms":["linux"],"columns":[{"name":"package","description":"Package name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"The version of the installed package","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"use","description":"USE flag which has been enabled for package","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"power_sensors","description":"Machine power (currents, voltages, wattages, etc) sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on macOS","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"category","description":"The sensor category: currents, voltage, wattage","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of power source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Power in Watts","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"powershell_events","description":"Powershell script blocks reconstructed to their full script content, this table requires script block logging to be enabled.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received by the osquery event publisher","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the Powershell script event occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_block_id","description":"The unique GUID of the powershell script to which this block belongs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_block_count","description":"The total number of script blocks for this script","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"script_text","description":"The text content of the Powershell script","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_name","description":"The name of the Powershell script","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_path","description":"The path for the Powershell script","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cosine_similarity","description":"How similar the Powershell script is to a provided 'normal' character frequency","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"preferences","description":"macOS defaults and managed preferences.","platforms":["darwin"],"columns":[{"name":"domain","description":"Application ID usually in com.name.product format","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Preference top-level key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"subkey","description":"Intemediate key path, includes lists/dicts","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"String value of most CF types","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"forced","description":"1 if the value is forced/managed, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"(optional) read preferences for a specific user","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"'current' or 'any' host, where 'current' takes precedence","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"prefetch","description":"Prefetch files show metadata related to file execution.","platforms":["windows"],"columns":[{"name":"path","description":"Prefetch file path.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Executable filename.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hash","description":"Prefetch CRC hash.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Most recent time application was run.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"other_run_times","description":"Other execution times in prefetch file.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"run_count","description":"Number of times the application has been run.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Application file size.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"volume_serial","description":"Volume serial number.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"volume_creation","description":"Volume creation time.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_files_count","description":"Number of files accessed.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_directories_count","description":"Number of directories accessed.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_files","description":"Files accessed by application within ten seconds of launch.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_directories","description":"Directories accessed by application within ten seconds of launch.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_envs","description":"A key/value table of environment variables for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"key","description":"Environment variable name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Environment variable value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_events","description":"Track time/action process executions.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"File mode permissions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Command line arguments (argv)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline_size","description":"Actual size (bytes) of command line arguments","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"env","description":"Environment variables delimited by spaces","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"env_count","description":"Number of environment variables","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"env_size","description":"Actual size (bytes) of environment list","type":"bigint","notes":"","hidden":true,"required":false,"index":false},{"name":"cwd","description":"The process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID at process start","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"File owner user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_gid","description":"File owner group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"File last access in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"File modification in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"File last metadata change in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"btime","description":"File creation in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"overflows","description":"List of structures that overflowed","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"parent","description":"Process parent's PID, or -1 if cannot be determined.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"status","description":"OpenBSM Attribute: Status of the process","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"fsuid","description":"Filesystem user ID at process start","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"suid","description":"Saved user ID at process start","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"fsgid","description":"Filesystem group ID at process start","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"sgid","description":"Saved group ID at process start","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"syscall","description":"Syscall name: fork, vfork, clone, execve, execveat","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"process_file_events","description":"A File Integrity Monitor implementation using the audit service.","platforms":["linux"],"columns":[{"name":"operation","description":"Operation type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ppid","description":"Parent process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"executable","description":"The executable path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partial","description":"True if this is a partial event (i.e.: this process existed before we started osquery)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"The current working directory of the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"The path associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"dest_path","description":"The canonical path associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"The uid of the process performing the action","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"The gid of the process performing the action","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Effective user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Effective group ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fsuid","description":"Filesystem user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fsgid","description":"Filesystem group ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Saved user ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Saved group ID of the process using the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"process_memory_map","description":"Process memory mapped files and pseudo device/regions.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"start","description":"Virtual start address (hex)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"end","description":"Virtual end address (hex)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"r=read, w=write, x=execute, p=private (cow)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"offset","description":"Offset into mapped path","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"device","description":"MA:MI Major/minor device ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Mapped path inode, 0 means uninitialized (BSS)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to mapped file or mapped type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pseudo","description":"1 If path is a pseudo path, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_namespaces","description":"Linux namespaces for processes running on the host system.","platforms":["linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"cgroup_namespace","description":"cgroup namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ipc_namespace","description":"ipc namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mnt_namespace","description":"mnt namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"net namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_namespace","description":"pid namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_namespace","description":"user namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uts_namespace","description":"uts namespace inode","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_open_files","description":"File descriptors for each process.","platforms":["darwin","linux"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"fd","description":"Process-specific file descriptor number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Filesystem path of descriptor","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_open_pipes","description":"Pipes and partner processes for each process.","platforms":["linux"],"columns":[{"name":"pid","description":"Process ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"File descriptor","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"Pipe open mode (r/w)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Pipe inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Pipe Type: named vs unnamed/anonymous","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"partner_pid","description":"Process ID of partner process sharing a particular pipe","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"partner_fd","description":"File descriptor of shared pipe at partner's end","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"partner_mode","description":"Mode of shared pipe at partner's end","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"process_open_sockets","description":"Processes which have open network sockets on the system.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"fd","description":"Socket file descriptor number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"socket","description":"Socket handle or inode number","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"Network protocol (IPv4, IPv6)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"Transport protocol (TCP/UDP)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"local_address","description":"Socket local address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Socket remote address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Socket local port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Socket remote port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"For UNIX sockets (family=AF_UNIX), the domain path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"TCP socket state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"net_namespace","description":"The inode number of the network namespace","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"processes","description":"All running processes on the host system.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executed binary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root","description":"Process virtual root directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Unsigned user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Unsigned group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Unsigned effective user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Unsigned effective group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Unsigned saved user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Unsigned saved group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"on_disk","description":"The process path exists yes=1, no=0, unknown=-1","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"user_time","description":"CPU time in milliseconds spent in user space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_time","description":"CPU time in milliseconds spent in kernel space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_read","description":"Bytes read from disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_written","description":"Bytes written to disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start time in seconds since Epoch, in case of error -1","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"elevated_token","description":"Process uses elevated token yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"secure_process","description":"Process is secure (IUM) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"protection_type","description":"The protection type of the process","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"virtual_process","description":"Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"elapsed_time","description":"Elapsed time in seconds this process has been running.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"handle_count","description":"Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"percent_processor_time","description":"Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"upid","description":"A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"uppid","description":"The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_type","description":"Indicates the specific processor designed for installation.","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_subtype","description":"Indicates the specific processor on which an entry may be used.","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"translated","description":"Indicates whether the process is running under the Rosetta Translation Environment, yes=1, no=0, error=-1.","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"cgroup_path","description":"The full hierarchical path of the process's control group","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"programs","description":"Represents products as they are installed by Windows Installer. A product generally correlates to one installation package on Windows. Some fields may be blank as Windows installation details are left to the discretion of the product author.","platforms":["windows"],"columns":[{"name":"name","description":"Commonly used product name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Product version information.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_location","description":"The installation location directory of the product.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_source","description":"The installation source of the product.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"language","description":"The language of the product.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"publisher","description":"Name of the product supplier.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uninstall_string","description":"Path and filename of the uninstaller.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Date that this product was installed on the system. ","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifying_number","description":"Product identification such as a serial number on software, or a die number on a hardware chip.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"prometheus_metrics","description":"Retrieve metrics from a Prometheus server.","platforms":["darwin","linux"],"columns":[{"name":"target_name","description":"Address of prometheus target","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"metric_name","description":"Name of collected Prometheus metric","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"metric_value","description":"Value of collected Prometheus metric","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"timestamp_ms","description":"Unix timestamp of collected data in MS","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"python_packages","description":"Python packages installed in a system.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Package display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Package-supplied version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"summary","description":"Package-supplied summary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional package author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"license","description":"License under which package is launched","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path at which this module resides","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"Directory where Python modules are located","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"quicklook_cache","description":"Files and thumbnails within macOS's Quicklook Cache.","platforms":["darwin"],"columns":[{"name":"path","description":"Path of file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rowid","description":"Quicklook file rowid key","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"fs_id","description":"Quicklook file fs_id key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"volume_id","description":"Parsed volume ID from fs_id","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"inode","description":"Parsed file ID (inode) from fs_id","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"Parsed version date field","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Parsed version size field","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"label","description":"Parsed version 'gen' field","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_hit_date","description":"Apple date format for last thumbnail cache hit","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"hit_count","description":"Number of cache hits on thumbnail","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"icon_mode","description":"Thumbnail icon mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"cache_path","description":"Path to cache data","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"registry","description":"All of the Windows registry hives.","platforms":["windows"],"columns":[{"name":"key","description":"Name of the key to search for","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Full path to the value","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of the registry value entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of the registry value, or 'subkey' if item is a subkey","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Data content of registry value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mtime","description":"timestamp of the most recent registry write","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"routes","description":"The active route table for the host system.","platforms":["darwin","linux","windows"],"columns":[{"name":"destination","description":"Destination IP address","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"netmask","description":"Netmask length","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"gateway","description":"Route gateway","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Route source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"flags","description":"Flags to describe route","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"interface","description":"Route local interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mtu","description":"Maximum Transmission Unit for the route","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"metric","description":"Cost of route. Lowest is preferred","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of route","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hopcount","description":"Max hops expected","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["linux","darwin"]}]},{"name":"rpm_package_files","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"package","description":"RPM package name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"path","description":"File path within the package","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"username","description":"File default username from info DB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"File default groupname from info DB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"File permissions mode from info DB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Expected file size in bytes from RPM info DB","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sha256","description":"SHA256 file digest from RPM info DB","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"rpm_packages","description":"RPM packages that are currently installed on the host system.","platforms":["linux"],"columns":[{"name":"name","description":"RPM package name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"version","description":"Package version","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"release","description":"Package release","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"source","description":"Source RPM package name (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Package size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sha1","description":"SHA1 hash of the package contents","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Architecture(s) supported","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"epoch","description":"Package epoch value","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"install_time","description":"When the package was installed","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"Package vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"package_group","description":"Package group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]},{"name":"mount_namespace_id","description":"Mount namespace id","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"running_apps","description":"macOS applications currently running on the host system.","platforms":["darwin"],"columns":[{"name":"pid","description":"The pid of the application","type":"integer","notes":"","hidden":false,"required":false,"index":true},{"name":"bundle_identifier","description":"The bundle identifier of the application","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"is_active","description":"(DEPRECATED)","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"safari_extensions","description":"Safari browser extension details for all users.","platforms":["darwin"],"columns":[{"name":"uid","description":"The local user that owns the extension","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Extension display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"Extension long version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sdk","description":"Bundle SDK used to compile extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_url","description":"Extension-supplied update URI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"author","description":"Optional extension author","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Optional developer identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional extension description text","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to extension XAR bundle","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sandboxes","description":"macOS application sandboxes container details.","platforms":["darwin"],"columns":[{"name":"label","description":"UTI-format bundle or label ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"Sandbox owner","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Application sandboxings enabled on container","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"build_id","description":"Sandbox-specific identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"Application bundle used by the sandbox","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to sandbox container directory","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"scheduled_tasks","description":"Lists all of the tasks in the Windows task scheduler.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the scheduled task","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Actions executed by the scheduled task","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to the executable to be run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether or not the scheduled task is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"State of the scheduled task","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hidden","description":"Whether or not the task is visible in the UI","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_time","description":"Timestamp the task last ran","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"next_run_time","description":"Timestamp the task is scheduled to run next","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_message","description":"Exit status message of the last task run","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_run_code","description":"Exit status code of the last task run","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"screenlock","description":"macOS screenlock status. Note: only fetches results for osquery's current logged-in user context. The user must also have recently logged in.","platforms":["darwin"],"columns":[{"name":"enabled","description":"1 If a password is required after sleep or the screensaver begins; else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"grace_period","description":"The amount of time in seconds the screen must be asleep or the screensaver on before a password is required on-wake. 0 = immediately; -1 = no password is required on-wake","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"seccomp_events","description":"A virtual table that tracks seccomp events.","platforms":["linux"],"columns":[{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit user ID (loginuid) of the user who started the analyzed process","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"User ID of the user who started the analyzed process","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Group ID of the user who started the analyzed process","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ses","description":"Session ID of the session from which the analyzed process was invoked","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID","type":"unsigned_bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"comm","description":"Command-line name of the command that was used to invoke the analyzed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exe","description":"The path to the executable that was used to invoke the analyzed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sig","description":"Signal value sent to process by seccomp","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"Information about the CPU architecture","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"syscall","description":"Type of the system call","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"compat","description":"Is system call in compatibility mode","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ip","description":"Instruction pointer value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"code","description":"The seccomp action","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"secureboot","description":"Secure Boot UEFI Settings.","platforms":["linux","windows"],"columns":[{"name":"secure_boot","description":"Whether secure boot is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"setup_mode","description":"Whether setup mode is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"security_profile_info","description":"Information on the security profile of a given system by listing the system Account and Audit Policies. This table mimics the exported securitypolicy output from the secedit tool.","platforms":["windows"],"columns":[{"name":"minimum_password_age","description":"Determines the minimum number of days that a password must be used before the user can change it","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"maximum_password_age","description":"Determines the maximum number of days that a password can be used before the client requires the user to change it","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minimum_password_length","description":"Determines the least number of characters that can make up a password for a user account","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"password_complexity","description":"Determines whether passwords must meet a series of strong-password guidelines","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"password_history_size","description":"Number of unique new passwords that must be associated with a user account before an old password can be reused","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"lockout_bad_count","description":"Number of failed logon attempts after which a user account MUST be locked out","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"logon_to_change_password","description":"Determines if logon session is required to change the password","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"force_logoff_when_expire","description":"Determines whether SMB client sessions with the SMB server will be forcibly disconnected when the client's logon hours expire","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"new_administrator_name","description":"Determines the name of the Administrator account on the local computer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"new_guest_name","description":"Determines the name of the Guest account on the local computer","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"clear_text_password","description":"Determines whether passwords MUST be stored by using reversible encryption","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"lsa_anonymous_name_lookup","description":"Determines if an anonymous user is allowed to query the local LSA policy","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enable_admin_account","description":"Determines whether the Administrator account on the local computer is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enable_guest_account","description":"Determines whether the Guest account on the local computer is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_system_events","description":"Determines whether the operating system MUST audit System Change, System Startup, System Shutdown, Authentication Component Load, and Loss or Excess of Security events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_logon_events","description":"Determines whether the operating system MUST audit each instance of a user attempt to log on or log off this computer","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_object_access","description":"Determines whether the operating system MUST audit each instance of user attempts to access a non-Active Directory object that has its own SACL specified","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_privilege_use","description":"Determines whether the operating system MUST audit each instance of user attempts to exercise a user right","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_policy_change","description":"Determines whether the operating system MUST audit each instance of user attempts to change user rights assignment policy, audit policy, account policy, or trust policy","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_account_manage","description":"Determines whether the operating system MUST audit each event of account management on a computer","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_process_tracking","description":"Determines whether the operating system MUST audit process-related events","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_ds_access","description":"Determines whether the operating system MUST audit each instance of user attempts to access an Active Directory object that has its own system access control list (SACL) specified","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"audit_account_logon","description":"Determines whether the operating system MUST audit each time this computer validates the credentials of an account","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"selinux_events","description":"Track SELinux events.","platforms":["linux"],"columns":[{"name":"type","description":"Event type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"selinux_settings","description":"Track active SELinux settings.","platforms":["linux"],"columns":[{"name":"scope","description":"Where the key is located inside the SELinuxFS mount point.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"key","description":"Key or class name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Active value.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"services","description":"Lists all installed Windows services and their relevant data.","platforms":["windows"],"columns":[{"name":"name","description":"Service name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service_type","description":"Service Type: OWN_PROCESS, SHARE_PROCESS and maybe Interactive (can interact with the desktop)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"display_name","description":"Service Display name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Service Current status: STOPPED, START_PENDING, STOP_PENDING, RUNNING, CONTINUE_PENDING, PAUSE_PENDING, PAUSED","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"the Process ID of the service","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"start_type","description":"Service start type: BOOT_START, SYSTEM_START, AUTO_START, DEMAND_START, DISABLED","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"win32_exit_code","description":"The error code that the service uses to report an error that occurs when it is starting or stopping","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"service_exit_code","description":"The service-specific error code that the service returns when an error occurs while the service is starting or stopping","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to Service Executable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"module_path","description":"Path to ServiceDll","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Service Description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_account","description":"The name of the account that the service process will be logged on as when it runs. This name can be of the form Domain\\UserName. If the account belongs to the built-in domain, the name can be of the form .\\UserName.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shadow","description":"Local system users encrypted passwords and related information. Please note, that you usually need superuser rights to access `/etc/shadow`.","platforms":["linux"],"columns":[{"name":"password_status","description":"Password status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hash_alg","description":"Password hashing algorithm","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_change","description":"Date of last password change (starting from UNIX epoch date)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"min","description":"Minimal number of days between password changes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"max","description":"Maximum number of days between password changes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"warning","description":"Number of days before password expires to warn user about it","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Number of days after password expires until account is blocked","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"expire","description":"Number of days since UNIX epoch date until account is disabled","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"flag","description":"Reserved","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":true}]},{"name":"shared_folders","description":"Folders available to others via SMB or AFP.","platforms":["darwin"],"columns":[{"name":"name","description":"The shared name of the folder as it appears to other users","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Absolute path of shared folder on the local system","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shared_memory","description":"OS shared memory regions.","platforms":["linux"],"columns":[{"name":"shmid","description":"Shared memory segment ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"owner_uid","description":"User ID of owning process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"creator_uid","description":"User ID of creator process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID to last use the segment","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"creator_pid","description":"Process ID that created the segment","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"atime","description":"Attached time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"dtime","description":"Detached time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"ctime","description":"Changed time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Memory segment permissions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Size in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"attached","description":"Number of attached processes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Destination/attach status","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"locked","description":"1 if segment is locked else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shared_resources","description":"Displays shared resources on a computer system running Windows. This may be a disk drive, printer, interprocess communication, or other sharable device.","platforms":["windows"],"columns":[{"name":"description","description":"A textual description of the object","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"install_date","description":"Indicates when the object was installed. Lack of a value does not indicate that the object is not installed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"String that indicates the current status of the object.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"allow_maximum","description":"Number of concurrent users for this resource has been limited. If True, the value in the MaximumAllowed property is ignored.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"maximum_allowed","description":"Limit on the maximum number of users allowed to use this resource concurrently. The value is only valid if the AllowMaximum property is set to FALSE.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Alias given to a path set up as a share on a computer system running Windows.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Local path of the Windows share.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of resource being shared. Types include: disk drives, print queues, interprocess communications (IPC), and general devices.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"type_name","description":"Human readable value for the 'type' column","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sharing_preferences","description":"macOS Sharing preferences.","platforms":["darwin"],"columns":[{"name":"screen_sharing","description":"1 If screen sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"file_sharing","description":"1 If file sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"printer_sharing","description":"1 If printer sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_login","description":"1 If remote login is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_management","description":"1 If remote management is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_apple_events","description":"1 If remote apple events are enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"internet_sharing","description":"1 If internet sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bluetooth_sharing","description":"1 If bluetooth sharing is enabled for any user else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disc_sharing","description":"1 If CD or DVD sharing is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"content_caching","description":"1 If content caching is enabled else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shell_history","description":"A line-delimited (command) table of per-user .*_history data.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"Shell history owner","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Entry timestamp. It could be absent, default value is 0.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"command","description":"Unparsed date/line/command history line","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"history_file","description":"Path to the .*_history for this user","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shellbags","description":"Shows directories accessed via Windows Explorer.","platforms":["windows"],"columns":[{"name":"sid","description":"User SID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Shellbags source Registry file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Directory name.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"Directory Modified time.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"created_time","description":"Directory Created time.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"accessed_time","description":"Directory Accessed time.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mft_entry","description":"Directory master file table entry.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"mft_sequence","description":"Directory master file table sequence.","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"shimcache","description":"Application Compatibility Cache, contains artifacts of execution.","platforms":["windows"],"columns":[{"name":"entry","description":"Execution order.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"This is the path to the executed file.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"modified_time","description":"File Modified time.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"execution_flag","description":"Boolean Execution flag, 1 for execution, 0 for no execution, -1 for missing (this flag does not exist on Windows 10 and higher).","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"signature","description":"File (executable, bundle, installer, disk) code signing status.","platforms":["darwin"],"columns":[{"name":"path","description":"Must provide a path or directory","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"hash_resources","description":"Set to 1 to also hash resources, or 0 otherwise. Default is 1","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"arch","description":"If applicable, the arch of the signed code","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signed","description":"1 If the file is signed else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"The signing identifier sealed into the signature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cdhash","description":"Hash of the application Code Directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"team_identifier","description":"The team signing identifier sealed into the signature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"authority","description":"Certificate Common Name","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sip_config","description":"Apple's System Integrity Protection (rootless) status.","platforms":["darwin"],"columns":[{"name":"config_flag","description":"The System Integrity Protection config flag","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if this configuration is enabled, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled_nvram","description":"1 if this configuration is enabled, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"smbios_tables","description":"BIOS (DMI) structure common details and content.","platforms":["darwin","linux"],"columns":[{"name":"number","description":"Table entry number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Table entry type","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Table entry description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"handle","description":"Table entry handle","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"header_size","description":"Header size in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Table entry size in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"md5","description":"MD5 hash of table entry","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"smc_keys","description":"Apple's system management controller keys.","platforms":["darwin"],"columns":[{"name":"key","description":"4-character key","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"SMC-reported type literal type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"size","description":"Reported size of data in bytes","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"A type-encoded representation of the key value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hidden","description":"1 if this key is normally hidden, otherwise 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"socket_events","description":"Track network socket opens and closes.","platforms":["darwin","linux"],"columns":[{"name":"action","description":"The socket action (bind, listen, close)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of executed file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fd","description":"The file description for the process socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Either 'succeeded', 'failed', 'in_progress' (connect() on non-blocking socket) or 'no_client' (null accept() on non-blocking socket)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"family","description":"The Internet protocol family ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"The network protocol ID","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"local_address","description":"Local address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_address","description":"Remote address associated with socket","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_port","description":"Local network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_port","description":"Remote network protocol port number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"socket","description":"The local path (UNIX domain socket only)","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"success","description":"Deprecated. Use the 'status' column instead","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"ssh_configs","description":"A table of parsed ssh_configs.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"The local owner of the ssh_config file","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"block","description":"The host or match block","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"option","description":"The option and value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssh_config_file","description":"Path to the ssh_config file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"startup_items","description":"Applications and binaries set as user/login startup items.","platforms":["darwin","linux","windows"],"columns":[{"name":"name","description":"Name of startup item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of startup item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"args","description":"Arguments provided to startup executable","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Startup Item or Login Item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Directory or plist containing startup item","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"status","description":"Startup status; either enabled or disabled","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"The user associated with the startup item","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"sudoers","description":"Rules for running commands as other users via sudo.","platforms":["darwin","linux"],"columns":[{"name":"source","description":"Source file containing the given rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"header","description":"Symbol for given rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rule_details","description":"Rule definition","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"suid_bin","description":"suid binaries in common locations.","platforms":["darwin","linux"],"columns":[{"name":"path","description":"Binary path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Binary owner username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Binary owner group","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"permissions","description":"Binary permissions","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"syslog_events","description":"","platforms":["linux"],"columns":[{"name":"time","description":"Current unix epoch time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Time known to syslog","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"host","description":"Hostname configured for syslog","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"severity","description":"Syslog severity","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"facility","description":"Syslog facility","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tag","description":"The syslog tag","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"The syslog message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"system_controls","description":"sysctl names, values, and settings information.","platforms":["darwin","linux"],"columns":[{"name":"name","description":"Full sysctl MIB name","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"oid","description":"Control MIB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subsystem","description":"Subsystem ID, control type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_value","description":"Value of setting","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"config_value","description":"The MIB value set in /etc/sysctl.conf","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Data type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"field_name","description":"Specific attribute of opaque type","type":"text","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]}]},{"name":"system_extensions","description":"macOS (>= 10.15) system extension table.","platforms":["darwin"],"columns":[{"name":"path","description":"Original path of system extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"UUID","description":"Extension unique id","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"System extension state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identifier","description":"Identifier name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"System extension version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"System extension category","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bundle_path","description":"System extension bundle path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"team","description":"Signing team ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mdm_managed","description":"1 if managed by MDM system extension payload configuration, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"system_info","description":"System information for identification.","platforms":["darwin","linux","windows"],"columns":[{"name":"hostname","description":"Network hostname including domain","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"Unique ID provided by the system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_type","description":"CPU type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_subtype","description":"CPU subtype","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_brand","description":"CPU brand string, contains vendor and model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_physical_cores","description":"Number of physical CPU cores in to the system","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_logical_cores","description":"Number of logical CPU cores available to the system","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"cpu_microcode","description":"Microcode version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"physical_memory","description":"Total physical memory in bytes","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_vendor","description":"Hardware vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_model","description":"Hardware model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_version","description":"Hardware version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hardware_serial","description":"Device serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_vendor","description":"Board vendor","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_model","description":"Board model","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_version","description":"Board version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"board_serial","description":"Board serial number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Friendly computer name (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_hostname","description":"Local hostname (optional)","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"systemd_units","description":"Track systemd units.","platforms":["linux"],"columns":[{"name":"id","description":"Unique unit identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Unit description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"load_state","description":"Reflects whether the unit definition was properly loaded","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"active_state","description":"The high-level unit activation state, i.e. generalization of SUB","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sub_state","description":"The low-level unit activation state, values depend on unit type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"following","description":"The name of another unit that this unit follows in state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"object_path","description":"The object path for this unit","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"job_id","description":"Next queued job id","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"job_type","description":"Job type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"job_path","description":"The object path for the job","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"fragment_path","description":"The unit file path this unit was read from, if there is any","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user","description":"The configured user, if any","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source_path","description":"Path to the (possibly generated) unit configuration file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"temperature_sensors","description":"Machine's temperature sensors.","platforms":["darwin"],"columns":[{"name":"key","description":"The SMC key on macOS","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"Name of temperature source","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"celsius","description":"Temperature in Celsius","type":"double","notes":"","hidden":false,"required":false,"index":false},{"name":"fahrenheit","description":"Temperature in Fahrenheit","type":"double","notes":"","hidden":false,"required":false,"index":false}]},{"name":"time","description":"Track current date and time in UTC.","platforms":["darwin","linux","windows"],"columns":[{"name":"weekday","description":"Current weekday in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"year","description":"Current year in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"month","description":"Current month in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"day","description":"Current day in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"hour","description":"Current hour in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Current minutes in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Current seconds in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"timezone","description":"Timezone for reported time (hardcoded to UTC)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_timezone","description":"Current local timezone in of the system","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"unix_time","description":"Current UNIX time in UTC","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"timestamp","description":"Current timestamp (log format) in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"Current date and time (ISO format) in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"iso_8601","description":"Current time (ISO format) in UTC","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"win_timestamp","description":"Timestamp value in 100 nanosecond units","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]}]},{"name":"time_machine_backups","description":"Backups to drives using TimeMachine.","platforms":["darwin"],"columns":[{"name":"destination_id","description":"Time Machine destination ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"backup_date","description":"Backup Date","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"time_machine_destinations","description":"Locations backed up to using Time Machine.","platforms":["darwin"],"columns":[{"name":"alias","description":"Human readable name of drive","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"destination_id","description":"Time Machine destination ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"consistency_scan_date","description":"Consistency scan date","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"root_volume_uuid","description":"Root UUID of backup volume","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_available","description":"Bytes available on volume","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"bytes_used","description":"Bytes used on volume","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"encryption","description":"Last known encrypted state","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"tpm_info","description":"A table that lists the TPM related information.","platforms":["windows"],"columns":[{"name":"activated","description":"TPM is activated","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"TPM is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"owned","description":"TPM is owned","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer_version","description":"TPM version","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer_id","description":"TPM manufacturers ID","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer_name","description":"TPM manufacturers name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"product_name","description":"Product name of the TPM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"physical_presence_version","description":"Version of the Physical Presence Interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"spec_version","description":"Trusted Computing Group specification that the TPM supports","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"ulimit_info","description":"System resource usage limits.","platforms":["darwin","linux"],"columns":[{"name":"type","description":"System resource to be limited","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"soft_limit","description":"Current limit value","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hard_limit","description":"Maximum limit value","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"unified_log","description":"Queries the OSLog framework for entries in the system log. The maximum number of rows returned is limited for performance issues. This table introduces a new idiom for extracting sequential data in batches using multiple queries, ordered by timestamp. To trigger it, the user should include the condition \"timestamp > -1\", and the table will handle pagination.","platforms":["darwin"],"columns":[{"name":"timestamp","description":"unix timestamp associated with the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"storage","description":"the storage category for the entry","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"composed message","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"activity","description":"the activity ID associate with the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"process","description":"the name of the process that made the entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"the pid of the process that made the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sender","description":"the name of the binary image that made the entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tid","description":"the tid of the thread that made the entry","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"the category of the os_log_t used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subsystem","description":"the subsystem of the os_log_t used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"the severity level of the entry","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"max_rows","description":"the max number of rows returned (defaults to 100)","type":"integer","notes":"","hidden":true,"required":false,"index":false}]},{"name":"uptime","description":"Track time passed since last boot. Some systems track this as calendar time, some as runtime.","platforms":["darwin","linux","windows"],"columns":[{"name":"days","description":"Days of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"hours","description":"Hours of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minutes","description":"Minutes of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"seconds","description":"Seconds of uptime","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"total_seconds","description":"Total uptime seconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"usb_devices","description":"USB devices that are actively plugged into the host system.","platforms":["darwin","linux"],"columns":[{"name":"usb_address","description":"USB Device used address","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"usb_port","description":"USB Device used port","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor","description":"USB Device vendor string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"vendor_id","description":"Hex encoded USB Device vendor identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"USB Device version number","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"USB Device model string","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model_id","description":"Hex encoded USB Device model identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial","description":"USB Device serial connection","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"USB Device class","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"subclass","description":"USB Device subclass","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"USB Device protocol","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"removable","description":"1 If USB device is removable else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"user_events","description":"Track user events from the audit framework.","platforms":["darwin","linux"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"auid","description":"Audit User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"message","description":"Message from the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"The file description for the process socket","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Supplied path from event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"address","description":"The Internet protocol address or family ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"terminal","description":"The network protocol ID","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of execution in UNIX time","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uptime","description":"Time of execution in system uptime","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"user_groups","description":"Local system user group relationships.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid","description":"Group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true}]},{"name":"user_interaction_events","description":"Track user interaction events from macOS' event tapping framework.","platforms":["darwin"],"columns":[{"name":"time","description":"Time","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"user_ssh_keys","description":"Returns the private keys in the users ~/.ssh directory and whether or not they are encrypted.","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"The local user that owns the key file","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to key file","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"encrypted","description":"1 if key is encrypted, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"key_type","description":"The type of the private key. One of [rsa, dsa, dh, ec, hmac, cmac], or the empty string.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"userassist","description":"UserAssist Registry Key tracks when a user executes an application from Windows Explorer.","platforms":["windows"],"columns":[{"name":"path","description":"Application file path.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_execution_time","description":"Most recent time application was executed.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of times the application has been executed.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sid","description":"User SID.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"users","description":"Local user accounts (including domain accounts that have logged on locally (Windows)).","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid","description":"Group ID (unsigned)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid_signed","description":"User ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"Default group ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional user description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"User's home directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shell","description":"User's configured default shell","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"User's UUID (Apple) or SID (Windows)","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Whether the account is roaming (domain), local, or a system profile","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"video_info","description":"Retrieve video card information of the machine.","platforms":["windows"],"columns":[{"name":"color_depth","description":"The amount of bits per pixel to represent color.","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"driver","description":"The driver of the device.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"driver_date","description":"The date listed on the installed driver.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"driver_version","description":"The version of the installed driver.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"manufacturer","description":"The manufacturer of the gpu.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"model","description":"The model of the gpu.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"series","description":"The series of the gpu.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"video_mode","description":"The current resolution of the display.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"virtual_memory_info","description":"Darwin Virtual Memory statistics.","platforms":["darwin"],"columns":[{"name":"free","description":"Total number of free pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"active","description":"Total number of active pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"inactive","description":"Total number of inactive pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"speculative","description":"Total number of speculative pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"throttled","description":"Total number of throttled pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"wired","description":"Total number of wired down pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"purgeable","description":"Total number of purgeable pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"faults","description":"Total number of calls to vm_faults.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"copy","description":"Total number of copy-on-write pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"zero_fill","description":"Total number of zero filled pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"reactivated","description":"Total number of reactivated pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"purged","description":"Total number of purged pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"file_backed","description":"Total number of file backed pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"anonymous","description":"Total number of anonymous pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uncompressed","description":"Total number of uncompressed pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"compressor","description":"The number of pages used to store compressed VM pages.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"decompressed","description":"The total number of pages that have been decompressed by the VM compressor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"compressed","description":"The total number of pages that have been compressed by the VM compressor.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"page_ins","description":"The total number of requests for pages from a pager.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"page_outs","description":"Total number of pages paged out.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_ins","description":"The total number of compressed pages that have been swapped out to disk.","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"swap_outs","description":"The total number of compressed pages that have been swapped back in from disk.","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wifi_networks","description":"macOS known/remembered Wi-Fi networks list.","platforms":["darwin"],"columns":[{"name":"ssid","description":"SSID octets of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"last_connected","description":"Last time this network was connected to as a unix_time","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"passpoint","description":"1 if Passpoint is supported, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"possibly_hidden","description":"1 if network is possibly a hidden network, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"roaming","description":"1 if roaming is supported, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"roaming_profile","description":"Describe the roaming profile, usually one of Single, Dual or Multi","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"auto_login","description":"1 if auto login is enabled, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"temporarily_disabled","description":"1 if this network is temporarily disabled, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"disabled","description":"1 if this network is disabled, 0 otherwise","type":"integer","notes":"","hidden":true,"required":false,"index":false},{"name":"add_reason","description":"Shows why this network was added, via menubar or command line or something else ","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"added_at","description":"Time this network was added as a unix_time","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"captive_portal","description":"1 if this network has a captive portal, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"captive_login_date","description":"Time this network logged in to a captive portal as unix_time","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"was_captive_network","description":"1 if this network was previously a captive network, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"auto_join","description":"1 if this network set to join automatically, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"personal_hotspot","description":"1 if this network is a personal hotspot, 0 otherwise","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wifi_status","description":"macOS current WiFi status.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"security_type","description":"Type of security on this network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"transmit_rate","description":"The current transmit rate","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mode","description":"The current operating mode for the Wi-Fi interface","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wifi_survey","description":"Scan for nearby WiFi networks.","platforms":["darwin"],"columns":[{"name":"interface","description":"Name of the interface","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssid","description":"SSID octets of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"bssid","description":"The current basic service set identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"network_name","description":"Name of the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"country_code","description":"The country code (ISO/IEC 3166-1:1997) for the network","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"rssi","description":"The current received signal strength indication (dbm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"noise","description":"The current noise measurement (dBm)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel","description":"Channel number","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_width","description":"Channel width","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"channel_band","description":"Channel band","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"winbaseobj","description":"Lists named Windows objects in the default object directories, across all terminal services sessions. Example Windows ojbect types include Mutexes, Events, Jobs and Semaphors.","platforms":["windows"],"columns":[{"name":"session_id","description":"Terminal Services Session Id","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"object_name","description":"Object Name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"object_type","description":"Object Type","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_crashes","description":"Extracted information from Windows crash logs (Minidumps).","platforms":["windows"],"columns":[{"name":"datetime","description":"Timestamp (log format) of the crash","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"module","description":"Path of the crashed module within the process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path of the executable file for the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID of the crashed process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID of the crashed thread","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"version","description":"File version info of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"process_uptime","description":"Uptime of the process in seconds","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"stack_trace","description":"Multiple stack frames from the stack trace","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_code","description":"The Windows exception code","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_message","description":"The NTSTATUS error message associated with the exception code","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"exception_address","description":"Address (in hex) where the exception occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"registers","description":"The values of the system registers","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command_line","description":"Command-line string passed to the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"current_directory","description":"Current working directory of the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username of the user who ran the crashed process","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"machine_name","description":"Name of the machine where the crash happened","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"major_version","description":"Windows major version of the machine","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"minor_version","description":"Windows minor version of the machine","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"build_number","description":"Windows build number of the crashing machine","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Type of crash log","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"crash_path","description":"Path of the log file","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_eventlog","description":"Table for querying all recorded Windows event logs.","platforms":["windows"],"columns":[{"name":"channel","description":"Source or channel of the event","type":"text","notes":"","hidden":false,"required":true,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"Severity level associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid","description":"Process ID which emitted the event record","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"tid","description":"Thread ID which emitted the event record","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"time_range","description":"System time to selectively filter the events","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"timestamp","description":"Timestamp to selectively filter the events","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"xpath","description":"The custom query to filter events","type":"text","notes":"","hidden":true,"required":true,"index":false}]},{"name":"windows_events","description":"Windows Event logs.","platforms":["windows"],"columns":[{"name":"time","description":"Timestamp the event was received","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"datetime","description":"System time at which the event occurred","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"source","description":"Source or channel of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_name","description":"Provider name of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"provider_guid","description":"Provider guid of the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"computer_name","description":"Hostname of system where event was generated","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eventid","description":"Event ID of the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"task","description":"Task value associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"level","description":"The severity level associated with the event","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"keywords","description":"A bitmask of the keywords defined in the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"data","description":"Data associated with the event","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"windows_firewall_rules","description":"Provides the list of Windows firewall rules.","platforms":["windows"],"columns":[{"name":"name","description":"Friendly name of the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"app_name","description":"Friendly name of the application to which the rule applies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Action for the rule or default setting","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"1 if the rule is enabled","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"grouping","description":"Group to which an individual rule belongs","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"direction","description":"Direction of traffic for which the rule applies","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"protocol","description":"IP protocol of the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_addresses","description":"Local addresses for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_addresses","description":"Remote addresses for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"local_ports","description":"Local ports for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remote_ports","description":"Remote ports for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"icmp_types_codes","description":"ICMP types and codes for the rule","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_domain","description":"1 if the rule profile type is domain","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_private","description":"1 if the rule profile type is private","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"profile_public","description":"1 if the rule profile type is public","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"service_name","description":"Service name property of the application","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_optional_features","description":"Lists names and installation states of windows features. Maps to Win32_OptionalFeature WMI class.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the feature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"caption","description":"Caption of feature in settings UI","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Installation state value. 1 == Enabled, 2 == Disabled, 3 == Absent","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"statename","description":"Installation state name. 'Enabled','Disabled','Absent'","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_security_center","description":"The health status of Window Security features. Health values can be \"Good\", \"Poor\". \"Snoozed\", \"Not Monitored\", and \"Error\".","platforms":["windows"],"columns":[{"name":"firewall","description":"The health of the monitored Firewall (see windows_security_products)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"autoupdate","description":"The health of the Windows Autoupdate feature","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"antivirus","description":"The health of the monitored Antivirus solution (see windows_security_products)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"antispyware","description":"Deprecated (always 'Good').","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"internet_settings","description":"The health of the Internet Settings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"windows_security_center_service","description":"The health of the Windows Security Center Service","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_account_control","description":"The health of the User Account Control (UAC) capability in Windows","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_security_products","description":"Enumeration of registered Windows security products.","platforms":["windows"],"columns":[{"name":"type","description":"Type of security product","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of product","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"State of protection","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state_timestamp","description":"Timestamp for the product state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"remediation_path","description":"Remediation path","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"signatures_up_to_date","description":"1 if product signatures are up to date, else 0","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"windows_update_history","description":"Provides the history of the windows update events.","platforms":["windows"],"columns":[{"name":"client_app_id","description":"Identifier of the client application that processed an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"date","description":"Date and the time an update was applied","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hresult","description":"HRESULT value that is returned from the operation on an update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"operation","description":"Operation on an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"result_code","description":"Result of an operation on an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"server_selection","description":"Value that indicates which server provided an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"service_id","description":"Service identifier of an update service that is not a Windows update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"support_url","description":"Hyperlink to the language-specific support information for an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"title","description":"Title of an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_id","description":"Revision-independent identifier of an update","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"update_revision","description":"Revision number of an update","type":"bigint","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_bios_info","description":"Lists important information from the system bios.","platforms":["windows"],"columns":[{"name":"name","description":"Name of the Bios setting","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"value","description":"Value of the Bios setting","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_cli_event_consumers","description":"WMI CommandLineEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique name of a consumer.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"command_line_template","description":"Standard string template that specifies the process to be started. This property can be NULL, and the ExecutablePath property is used as the command line.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"executable_path","description":"Module to execute. The string can specify the full path and file name of the module to execute, or it can specify a partial name. If a partial name is specified, the current drive and current directory are assumed.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_event_filters","description":"Lists WMI event filters.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier of an event filter.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query","description":"Windows Management Instrumentation Query Language (WQL) event query that specifies the set of events for consumer notification, and the specific conditions for notification.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"query_language","description":"Query language that the query is written in.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_filter_consumer_binding","description":"Lists the relationship between event consumers and filters.","platforms":["windows"],"columns":[{"name":"consumer","description":"Reference to an instance of __EventConsumer that represents the object path to a logical consumer, the recipient of an event.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filter","description":"Reference to an instance of __EventFilter that represents the object path to an event filter which is a query that specifies the type of event to be received.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"wmi_script_event_consumers","description":"WMI ActiveScriptEventConsumer, which can be used for persistence on Windows. See https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instrumentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf for more details.","platforms":["windows"],"columns":[{"name":"name","description":"Unique identifier for the event consumer. ","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"scripting_engine","description":"Name of the scripting engine to use, for example, 'VBScript'. This property cannot be NULL.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_file_name","description":"Name of the file from which the script text is read, intended as an alternative to specifying the text of the script in the ScriptText property.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"script_text","description":"Text of the script that is expressed in a language known to the scripting engine. This property must be NULL if the ScriptFileName property is not NULL.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"class","description":"The name of the class.","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"relative_path","description":"Relative path to the class or instance.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"xprotect_entries","description":"Database of the machine's XProtect signatures.","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"launch_type","description":"Launch services content type","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"identity","description":"XProtect identity (SHA1) of content","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filename","description":"Use this file name to match","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"filetype","description":"Use this file type to match","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"optional","description":"Match any of the identities/patterns for this XProtect name","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"uses_pattern","description":"Uses a match pattern instead of identity","type":"integer","notes":"","hidden":false,"required":false,"index":false}]},{"name":"xprotect_meta","description":"Database of the machine's XProtect browser-related signatures.","platforms":["darwin"],"columns":[{"name":"identifier","description":"Browser plugin or extension identifier","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"type","description":"Either plugin or extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"developer_id","description":"Developer identity (SHA1) of extension","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"min_version","description":"The minimum allowed plugin version.","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"xprotect_reports","description":"Database of XProtect matches (if user generated/sent an XProtect report).","platforms":["darwin"],"columns":[{"name":"name","description":"Description of XProtected malware","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"user_action","description":"Action taken by user after prompted","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Quarantine alert time","type":"text","notes":"","hidden":false,"required":false,"index":false}]},{"name":"yara","description":"Triggers one-off YARA query for files at the specified path. Requires one of `sig_group`, `sigfile`, or `sigrule`.","platforms":["darwin","linux","windows"],"columns":[{"name":"path","description":"The path scanned","type":"text","notes":"","hidden":false,"required":true,"index":true},{"name":"matches","description":"List of YARA matches","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"sig_group","description":"Signature group used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sigfile","description":"Signature file used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sigrule","description":"Signature strings used","type":"text","notes":"","hidden":true,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"sigurl","description":"Signature url","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"yara_events","description":"Track YARA matches for files specified in configuration data.","platforms":["darwin","linux","windows"],"columns":[{"name":"target_path","description":"The path scanned","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"category","description":"The category of the file","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"action","description":"Change action (UPDATE, REMOVE, etc)","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"transaction_id","description":"ID used during bulk update","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"matches","description":"List of YARA matches","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"count","description":"Number of YARA matches","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"strings","description":"Matching strings","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"tags","description":"Matching tags","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"time","description":"Time of the scan","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"eid","description":"Event ID","type":"text","notes":"","hidden":true,"required":false,"index":false}]},{"name":"ycloud_instance_metadata","description":"Yandex.Cloud instance metadata.","platforms":["darwin","linux","windows"],"columns":[{"name":"instance_id","description":"Unique identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"folder_id","description":"Folder identifier for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"name","description":"Name of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Description of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"hostname","description":"Hostname of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"zone","description":"Availability zone of the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"ssh_public_key","description":"SSH public key. Only available if supplied at instance launch time","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"serial_port_enabled","description":"Indicates if serial port is enabled for the VM","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"metadata_endpoint","description":"Endpoint used to fetch VM metadata","type":"text","notes":"","hidden":false,"required":false,"index":true}]},{"name":"yum_sources","description":"Current list of Yum repositories or software channels.","platforms":["linux"],"columns":[{"name":"name","description":"Repository name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"baseurl","description":"Repository base URL","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"mirrorlist","description":"Mirrorlist URL","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"enabled","description":"Whether the repository is used","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gpgcheck","description":"Whether packages are GPG checked","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"gpgkey","description":"URL to GPG key","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"host_users","description":"Local user accounts (including domain accounts that have logged on locally (Windows)).","platforms":["darwin","linux","windows"],"columns":[{"name":"uid","description":"User ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid","description":"Group ID (unsigned)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"uid_signed","description":"User ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid_signed","description":"Default group ID as int64 signed (Apple)","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"username","description":"Username","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"description","description":"Optional user description","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"directory","description":"User's home directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"shell","description":"User's configured default shell","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uuid","description":"User's UUID (Apple) or SID (Windows)","type":"text","notes":"","hidden":false,"required":false,"index":true},{"name":"type","description":"Whether the account is roaming (domain), local, or a system profile","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"host_groups","description":"Local system groups.","platforms":["darwin","linux","windows"],"columns":[{"name":"gid","description":"Unsigned int64 group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"gid_signed","description":"A signed int64 version of gid","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"groupname","description":"Canonical local group name","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"group_sid","description":"Unique group ID","type":"text","notes":"","hidden":true,"required":false,"index":true,"platforms":["windows","win32","cygwin"]},{"name":"comment","description":"Remarks or comments associated with the group","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"is_hidden","description":"IsHidden attribute set in OpenDirectory","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"pid_with_namespace","description":"Pids that contain a namespace","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]},{"name":"host_processes","description":"All running processes on the host system.","platforms":["darwin","linux","windows"],"columns":[{"name":"pid","description":"Process (or thread) ID","type":"bigint","notes":"","hidden":false,"required":false,"index":true},{"name":"name","description":"The process path or shorthand argv[0]","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"path","description":"Path to executed binary","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cmdline","description":"Complete argv","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"state","description":"Process state","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"cwd","description":"Process current working directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"root","description":"Process virtual root directory","type":"text","notes":"","hidden":false,"required":false,"index":false},{"name":"uid","description":"Unsigned user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"gid","description":"Unsigned group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"euid","description":"Unsigned effective user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"egid","description":"Unsigned effective group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"suid","description":"Unsigned saved user ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"sgid","description":"Unsigned saved group ID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"on_disk","description":"The process path exists yes=1, no=0, unknown=-1","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"wired_size","description":"Bytes of unpageable memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"resident_size","description":"Bytes of private memory used by process","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"total_size","description":"Total virtual memory size","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"user_time","description":"CPU time in milliseconds spent in user space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"system_time","description":"CPU time in milliseconds spent in kernel space","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_read","description":"Bytes read from disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"disk_bytes_written","description":"Bytes written to disk","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"start_time","description":"Process start time in seconds since Epoch, in case of error -1","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"parent","description":"Process parent's PID","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"pgroup","description":"Process group","type":"bigint","notes":"","hidden":false,"required":false,"index":false},{"name":"threads","description":"Number of threads used by process","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"nice","description":"Process nice level (-20 to 20, default 0)","type":"integer","notes":"","hidden":false,"required":false,"index":false},{"name":"elevated_token","description":"Process uses elevated token yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"secure_process","description":"Process is secure (IUM) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"protection_type","description":"The protection type of the process","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"virtual_process","description":"Process is virtual (e.g. System, Registry, vmmem) yes=1, no=0","type":"integer","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"elapsed_time","description":"Elapsed time in seconds this process has been running.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"handle_count","description":"Total number of handles that the process has open. This number is the sum of the handles currently opened by each thread in the process.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"percent_processor_time","description":"Returns elapsed time that all of the threads of this process used the processor to execute instructions in 100 nanoseconds ticks.","type":"bigint","notes":"","hidden":true,"required":false,"index":false,"platforms":["windows","win32","cygwin"]},{"name":"upid","description":"A 64bit pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"uppid","description":"The 64bit parent pid that is never reused. Returns -1 if we couldn't gather them from the system.","type":"bigint","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_type","description":"Indicates the specific processor designed for installation.","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"cpu_subtype","description":"Indicates the specific processor on which an entry may be used.","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"translated","description":"Indicates whether the process is running under the Rosetta Translation Environment, yes=1, no=0, error=-1.","type":"integer","notes":"","hidden":false,"required":false,"index":false,"platforms":["darwin"]},{"name":"cgroup_path","description":"The full hierarchical path of the process's control group","type":"text","notes":"","hidden":true,"required":false,"index":false,"platforms":["linux"]}]}] \ No newline at end of file diff --git a/x-pack/plugins/osquery/public/components/osquery_schema_link.tsx b/x-pack/plugins/osquery/public/components/osquery_schema_link.tsx index 09e1be0923e45..23d5f4874db51 100644 --- a/x-pack/plugins/osquery/public/components/osquery_schema_link.tsx +++ b/x-pack/plugins/osquery/public/components/osquery_schema_link.tsx @@ -11,7 +11,7 @@ import React from 'react'; export const OsquerySchemaLink = React.memo(() => ( - + diff --git a/x-pack/plugins/osquery/public/editor/osquery_tables.ts b/x-pack/plugins/osquery/public/editor/osquery_tables.ts index 5b2e990fcccca..18a74cb6ac9b6 100644 --- a/x-pack/plugins/osquery/public/editor/osquery_tables.ts +++ b/x-pack/plugins/osquery/public/editor/osquery_tables.ts @@ -17,7 +17,7 @@ let osqueryTables: TablesJSON | null = null; export const getOsqueryTables = () => { if (!osqueryTables) { // eslint-disable-next-line @typescript-eslint/no-var-requires - osqueryTables = normalizeTables(require('../common/schemas/osquery/v5.7.0.json')); + osqueryTables = normalizeTables(require('../common/schemas/osquery/v5.10.2.json')); } return osqueryTables; diff --git a/x-pack/plugins/osquery/public/form/timeout_field.tsx b/x-pack/plugins/osquery/public/form/timeout_field.tsx index a9ad26d11e173..5ef6627ba2c43 100644 --- a/x-pack/plugins/osquery/public/form/timeout_field.tsx +++ b/x-pack/plugins/osquery/public/form/timeout_field.tsx @@ -8,14 +8,7 @@ import React, { useCallback, useMemo } from 'react'; import deepEqual from 'fast-deep-equal'; import { useController } from 'react-hook-form'; import type { EuiFieldNumberProps } from '@elastic/eui'; -import { - EuiFieldNumber, - EuiFlexGroup, - EuiFlexItem, - EuiFormRow, - EuiIconTip, - EuiText, -} from '@elastic/eui'; +import { EuiFieldNumber, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiIconTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -81,16 +74,6 @@ const TimeoutFieldComponent = ({ euiFieldProps }: TimeoutFieldProps) => { fullWidth error={error?.message} isInvalid={hasError} - labelAppend={ - - - - - - } > { }); cy.wait('@getTopNFunctions'); cy.wait('@getTopNFunctions'); - cy.get('[data-test-subj="topNFunctionsGrid"] .euiDataGridRow').should('have.length.gt', 1); - cy.get('[data-test-subj="TopNFunctionsComparisonGrid"] .euiDataGridRow').should( - 'have.length.gt', - 1 - ); - cy.get( - '[data-test-subj="topNFunctionsGrid"] [data-test-subj="profilingStackFrameSummaryLink"]' - ).contains('vmlinux'); - cy.get( - '[data-test-subj="TopNFunctionsComparisonGrid"] [data-test-subj="profilingStackFrameSummaryLink"]' - ).contains('vmlinux'); + cy.get('[data-test-subj="frame"]').contains('vmlinux'); + cy.get('[data-test-subj="comparison_frame"]').contains('vmlinux'); cy.addKqlFilter({ key: 'process.thread.name', @@ -190,12 +181,8 @@ describe('Differential Functions page', () => { }); cy.wait('@getTopNFunctions'); cy.wait('@getTopNFunctions'); - cy.get( - '[data-test-subj="topNFunctionsGrid"] [data-test-subj="profilingStackFrameSummaryLink"]' - ).contains('libsystemd-shared-237.so'); - cy.get( - '[data-test-subj="TopNFunctionsComparisonGrid"] [data-test-subj="profilingStackFrameSummaryLink"]' - ).contains('libjvm.so'); + cy.get('[data-test-subj="frame"]').contains('libsystemd-shared-237.so'); + cy.get('[data-test-subj="comparison_frame"]').contains('libjvm.so'); }); }); }); diff --git a/x-pack/plugins/profiling/public/components/contexts/profiling_dependencies/mock_profiling_dependencies_storybook.tsx b/x-pack/plugins/profiling/public/components/contexts/profiling_dependencies/mock_profiling_dependencies_storybook.tsx index 9e4ebc0afeae8..3508f3f090c6a 100644 --- a/x-pack/plugins/profiling/public/components/contexts/profiling_dependencies/mock_profiling_dependencies_storybook.tsx +++ b/x-pack/plugins/profiling/public/components/contexts/profiling_dependencies/mock_profiling_dependencies_storybook.tsx @@ -43,6 +43,7 @@ const mockPlugin = { }; const mockCore = { + uiSettings: { get: () => {} }, application: { currentAppId$: new Observable(), getUrlForApp: (appId: string) => '', diff --git a/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/get_columns.tsx b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/get_columns.tsx new file mode 100644 index 0000000000000..71ead9cd75a85 --- /dev/null +++ b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/get_columns.tsx @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { EuiDataGridColumn, EuiDataGridColumnCellAction } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { TopNComparisonFunctionSortField, TopNFunctionSortField } from '@kbn/profiling-utils'; +import React from 'react'; +import { CPULabelWithHint } from '../cpu_label_with_hint'; +import { LabelWithHint } from '../label_with_hint'; + +export const getColumns = ( + compareFrameAction: EuiDataGridColumnCellAction +): EuiDataGridColumn[] => [ + { + id: TopNFunctionSortField.Rank, + actions: { showHide: false }, + displayAsText: 'Rank', + initialWidth: 65, + schema: 'numeric', + }, + { + id: TopNFunctionSortField.Frame, + actions: { showHide: false }, + displayAsText: i18n.translate('xpack.profiling.functionsView.functionColumnLabel', { + defaultMessage: 'Function', + }), + cellActions: [compareFrameAction], + }, + { + id: TopNFunctionSortField.Samples, + initialWidth: 120, + schema: 'numeric', + actions: { showHide: false }, + display: ( + + ), + }, + { + id: TopNFunctionSortField.SelfCPU, + actions: { showHide: false }, + schema: 'numeric', + initialWidth: 120, + display: ( + + ), + }, + { + id: TopNFunctionSortField.TotalCPU, + actions: { showHide: false }, + schema: 'numeric', + initialWidth: 120, + display: ( + + ), + }, + { + id: TopNComparisonFunctionSortField.ComparisonRank, + actions: { showHide: false }, + schema: 'numeric', + displayAsText: 'Rank', + initialWidth: 69, + displayHeaderCellProps: { className: 'thickBorderLeft' }, + }, + { + id: TopNComparisonFunctionSortField.ComparisonFrame, + actions: { showHide: false }, + displayAsText: i18n.translate('xpack.profiling.functionsView.functionColumnLabel', { + defaultMessage: 'Function', + }), + cellActions: [compareFrameAction], + }, + { + id: TopNComparisonFunctionSortField.ComparisonSamples, + actions: { showHide: false }, + schema: 'numeric', + initialWidth: 120, + display: ( + + ), + }, + { + id: TopNComparisonFunctionSortField.ComparisonSelfCPU, + actions: { showHide: false }, + schema: 'numeric', + initialWidth: 120, + display: ( + + ), + }, + { + id: TopNComparisonFunctionSortField.ComparisonTotalCPU, + actions: { showHide: false }, + schema: 'numeric', + initialWidth: 120, + display: ( + + ), + }, + { + displayAsText: 'Diff', + actions: { showHide: false }, + id: TopNComparisonFunctionSortField.ComparisonDiff, + initialWidth: 70, + isSortable: false, + }, +]; diff --git a/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/get_compare_frame_action.tsx b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/get_compare_frame_action.tsx new file mode 100644 index 0000000000000..32f6bc826d986 --- /dev/null +++ b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/get_compare_frame_action.tsx @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiBasicTable, + EuiDataGridColumnCellAction, + EuiDataGridColumnCellActionProps, + EuiPopover, + EuiPopoverTitle, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; +import { getCalleeFunction } from '@kbn/profiling-utils'; +import { getFrameIdentification, isComparisonColumn, SelectedFrame } from '.'; +import { IFunctionRow } from '../topn_functions/utils'; + +interface Props { + baseRows: IFunctionRow[]; + comparisonRows: IFunctionRow[]; + selectedFrame?: SelectedFrame; + onClick: (selectedFrame?: SelectedFrame) => void; +} + +export const getCompareFrameAction = + ({ baseRows, comparisonRows, selectedFrame, onClick }: Props): EuiDataGridColumnCellAction => + ({ rowIndex, columnId, Component }: EuiDataGridColumnCellActionProps) => { + const isComparison = isComparisonColumn(columnId); + const currentRow = isComparison ? comparisonRows[rowIndex] : baseRows[rowIndex]; + if (currentRow === undefined) { + return null; + } + const currentFrameId = getFrameIdentification(currentRow.frame); + + const isOpen = selectedFrame + ? selectedFrame.currentFrameId === currentFrameId && + selectedFrame.isComparison === isComparison + : false; + + const compareRow = isComparison + ? baseRows.find((item) => getFrameIdentification(item.frame) === currentFrameId) + : comparisonRows.find((item) => getFrameIdentification(item.frame) === currentFrameId); + + return ( + { + onClick({ currentFrameId, isComparison }); + }} + iconType="inspect" + > + {i18n.translate('xpack.profiling.compareFrame.component.findLabel', { + defaultMessage: 'Find corresponding frame', + })} + + } + isOpen={isOpen} + closePopover={() => { + onClick(undefined); + }} + anchorPosition="upRight" + css={css` + .euiPopover__anchor { + align-items: start; + display: flex; + } + `} + > + {compareRow ? ( +
    + + {isComparison + ? i18n.translate('xpack.profiling.diffTopNFunctions.baseLineFunction', { + defaultMessage: 'Baseline function', + }) + : i18n.translate('xpack.profiling.diffTopNFunctions.comparisonLineFunction', { + defaultMessage: 'Comparison function', + })} + + + {getCalleeFunction(compareRow.frame)} + + value.samples.toLocaleString(), + }, + { + field: 'selfCPUPerc', + name: 'Self CPU', + render: (_, value) => `${value.selfCPUPerc.toFixed(2)}%`, + }, + { + field: 'totalCPUPerc', + name: 'Total CPU', + render: (_, value) => `${value.totalCPUPerc.toFixed(2)}%`, + }, + ]} + /> +
    + ) : ( + + {i18n.translate('xpack.profiling.diffTopNFunctions.noCorrespondingValueFound', { + defaultMessage: 'No corresponding value found', + })} + + )} +
    + ); + }; diff --git a/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx new file mode 100644 index 0000000000000..a006a4724a9bf --- /dev/null +++ b/x-pack/plugins/profiling/public/components/differential_topn_functions_grid/index.tsx @@ -0,0 +1,265 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiDataGrid, + EuiDataGridCellValueElementProps, + EuiDataGridColumn, + EuiDataGridSorting, + useEuiTheme, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { i18n } from '@kbn/i18n'; +import { + getCalleeFunction, + StackFrameMetadata, + TopNComparisonFunctionSortField, + TopNFunctions, + TopNFunctionSortField, +} from '@kbn/profiling-utils'; +import { orderBy } from 'lodash'; +import React, { useEffect, useMemo, useState } from 'react'; +import { useCalculateImpactEstimate } from '../../hooks/use_calculate_impact_estimates'; +import { FunctionRow } from '../topn_functions/function_row'; +import { getFunctionsRows, IFunctionRow } from '../topn_functions/utils'; +import { getColumns } from './get_columns'; +import { getCompareFrameAction } from './get_compare_frame_action'; + +const removeComparisonFromId = (id: string) => id.replace('comparison_', ''); +export const isComparisonColumn = (id: string) => id.startsWith('comparison_'); + +type SortDirection = 'asc' | 'desc'; + +function sortRows(data: IFunctionRow[], sortField: string, sortDirection: SortDirection) { + switch (sortField) { + case TopNFunctionSortField.Frame: + return orderBy(data, (row) => getCalleeFunction(row.frame), sortDirection); + case TopNFunctionSortField.SelfCPU: + return orderBy(data, (row) => row.selfCPUPerc, sortDirection); + case TopNFunctionSortField.TotalCPU: + return orderBy(data, (row) => row.totalCPUPerc, sortDirection); + default: + return orderBy(data, sortField, sortDirection); + } +} + +export type OnChangeSortParams = + | { sortField: TopNFunctionSortField; sortDirection: SortDirection } + | { + comparisonSortField: TopNComparisonFunctionSortField; + comparisonSortDirection: SortDirection; + }; + +export function getFrameIdentification(frame: StackFrameMetadata) { + return [ + frame.SourceFilename, + frame.FunctionName, + frame.ExeFileName, + frame.FileID, + frame.AddressOrLine, + ].join('|'); +} + +export interface SelectedFrame { + currentFrameId?: string; + isComparison: boolean; +} + +interface Props { + base?: TopNFunctions; + baselineScaleFactor?: number; + comparison?: TopNFunctions; + comparisonScaleFactor?: number; + onChangePage: (nextPage: number) => void; + onChangeSort: (sorting: OnChangeSortParams) => void; + onFrameClick?: (functionName: string) => void; + pageIndex: number; + sortDirection: 'asc' | 'desc'; + sortField: TopNFunctionSortField; + comparisonSortDirection: 'asc' | 'desc'; + comparisonSortField: TopNComparisonFunctionSortField; + totalSeconds: number; +} + +export function DifferentialTopNFunctionsGrid({ + base, + baselineScaleFactor, + comparison, + comparisonScaleFactor, + onChangePage, + onChangeSort, + pageIndex, + sortDirection, + sortField, + totalSeconds, + onFrameClick, + comparisonSortDirection, + comparisonSortField, +}: Props) { + const calculateImpactEstimates = useCalculateImpactEstimate(); + const [selectedFrame, setSelectedFrame] = useState(); + const theme = useEuiTheme(); + + const totalCount = useMemo(() => { + if (!base || !base.TotalCount) { + return 0; + } + + return base.TotalCount; + }, [base]); + + function onSort(newSortingColumns: EuiDataGridSorting['columns']) { + // As newSortingColumns is an array and we only sort by a single field for both base and comparison + // I need to look for the item that is not the same as in the URL to identify what's the side being sorted. + const sortingItem = newSortingColumns.reverse().find((item) => { + const isComparison = isComparisonColumn(item.id); + if (isComparison) { + return !(comparisonSortField === item.id && comparisonSortDirection === item.direction); + } + return !(sortField === item.id && sortDirection === item.direction); + }); + if (sortingItem) { + const isComparison = isComparisonColumn(sortingItem.id); + onChangeSort( + isComparison + ? { + comparisonSortDirection: sortingItem.direction, + comparisonSortField: sortingItem.id as TopNComparisonFunctionSortField, + } + : { + sortDirection: sortingItem.direction, + sortField: sortingItem.id as TopNFunctionSortField, + } + ); + } + } + + const { baseRows, comparisonRows } = useMemo(() => { + return { + baseRows: getFunctionsRows({ + calculateImpactEstimates, + topNFunctions: base, + totalSeconds: 900, + }), + comparisonRows: getFunctionsRows({ + baselineScaleFactor, + calculateImpactEstimates, + comparisonScaleFactor, + comparisonTopNFunctions: base, + topNFunctions: comparison, + totalSeconds, + }), + }; + }, [ + base, + baselineScaleFactor, + calculateImpactEstimates, + comparison, + comparisonScaleFactor, + totalSeconds, + ]); + + const columns: EuiDataGridColumn[] = useMemo(() => { + const compareFrameAction = getCompareFrameAction({ + baseRows, + comparisonRows, + onClick: setSelectedFrame, + selectedFrame, + }); + return getColumns(compareFrameAction); + }, [baseRows, comparisonRows, selectedFrame]); + + const sortedBaseRows = useMemo(() => { + return sortRows(baseRows, sortField, sortDirection); + }, [baseRows, sortDirection, sortField]); + + const sortedComparisonRows = useMemo(() => { + return sortRows( + comparisonRows, + removeComparisonFromId(comparisonSortField), + comparisonSortDirection + ); + }, [comparisonRows, comparisonSortDirection, comparisonSortField]); + + const [visibleColumns, setVisibleColumns] = useState(columns.map(({ id }) => id)); + + function CellValue({ rowIndex, columnId, setCellProps }: EuiDataGridCellValueElementProps) { + const isComparison = isComparisonColumn(columnId); + const data = isComparison ? sortedComparisonRows[rowIndex] : sortedBaseRows[rowIndex]; + + useEffect(() => { + // Add thick border to divide the baseline and comparison columns + if (isComparison && columnId === TopNComparisonFunctionSortField.ComparisonRank) { + setCellProps({ + style: { borderLeft: theme.euiTheme.border.thick }, + }); + } else if (columnId === TopNFunctionSortField.TotalCPU) { + setCellProps({ + style: { borderRight: theme.euiTheme.border.thin }, + }); + } + }, [columnId, isComparison, setCellProps]); + + if (data === undefined) { + return null; + } + + return ( +
    + +
    + ); + } + + const rowCount = Math.min(Math.max(sortedBaseRows.length, sortedComparisonRows.length), 100); + + return ( + {}, + onChangePage, + pageSizeOptions: [], + }} + rowHeightsOptions={{ defaultHeight: 'auto' }} + toolbarVisibility={{ + showColumnSelector: false, + showKeyboardShortcuts: false, + showDisplaySelector: false, + showSortSelector: false, + }} + /> + ); +} diff --git a/x-pack/plugins/profiling/public/components/profiling_app_page_template/profiling_search_bar.tsx b/x-pack/plugins/profiling/public/components/profiling_app_page_template/profiling_search_bar.tsx index f1c52e6db5d0c..c41468f5dbff8 100644 --- a/x-pack/plugins/profiling/public/components/profiling_app_page_template/profiling_search_bar.tsx +++ b/x-pack/plugins/profiling/public/components/profiling_app_page_template/profiling_search_bar.tsx @@ -12,19 +12,10 @@ import React, { useEffect, useState } from 'react'; import { INDEX_EVENTS } from '../../../common'; import { useProfilingDependencies } from '../contexts/profiling_dependencies/use_profiling_dependencies'; -export function ProfilingSearchBar({ - kuery, - rangeFrom, - rangeTo, - onQuerySubmit, - onRefresh, - onRefreshClick, - showSubmitButton = true, - dataTestSubj = 'profilingUnifiedSearchBar', -}: { +interface Props { kuery: string; - rangeFrom: string; - rangeTo: string; + rangeFrom?: string; + rangeTo?: string; onQuerySubmit: ( payload: { dateRange: TimeRange; @@ -32,11 +23,26 @@ export function ProfilingSearchBar({ }, isUpdate?: boolean ) => void; - onRefresh: Required>['onRefresh']; + onRefresh?: Required>['onRefresh']; onRefreshClick: () => void; showSubmitButton?: boolean; dataTestSubj?: string; -}) { + showDatePicker?: boolean; + showQueryMenu?: boolean; +} + +export function ProfilingSearchBar({ + kuery, + rangeFrom, + rangeTo, + onQuerySubmit, + onRefresh, + onRefreshClick, + showSubmitButton = true, + dataTestSubj = 'profilingUnifiedSearchBar', + showDatePicker = true, + showQueryMenu = true, +}: Props) { const { start: { dataViews }, } = useProfilingDependencies(); @@ -67,7 +73,7 @@ export function ProfilingSearchBar({ onQuerySubmit({ dateRange, query }); }} showQueryInput - showDatePicker + showDatePicker={showDatePicker} showFilterBar={false} showSaveQuery={false} submitButtonStyle={!showSubmitButton ? 'iconOnly' : 'auto'} @@ -78,6 +84,7 @@ export function ProfilingSearchBar({ onRefresh={onRefresh} displayStyle="inPage" dataTestSubj={dataTestSubj} + showQueryMenu={showQueryMenu} /> ); } diff --git a/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx b/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx index 6cf0159dcdc01..d2421e704ac0b 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx +++ b/x-pack/plugins/profiling/public/components/topn_functions/function_row.tsx @@ -112,7 +112,7 @@ function DiffColumn({ diff, setCellProps }: DiffColumnProps) { const dangerColor = useEuiBackgroundColor('danger'); useEffect(() => { - if (diff && diff.rank > 0) { + if (diff && diff.rank !== 0) { const color = diff.rank > 0 ? 'success' : 'danger'; setCellProps({ style: { backgroundColor: color === 'success' ? successColor : dangerColor }, diff --git a/x-pack/plugins/profiling/public/components/topn_functions/utils.ts b/x-pack/plugins/profiling/public/components/topn_functions/utils.ts index 788c7397fa79d..e09b404b5c60c 100644 --- a/x-pack/plugins/profiling/public/components/topn_functions/utils.ts +++ b/x-pack/plugins/profiling/public/components/topn_functions/utils.ts @@ -33,6 +33,7 @@ export function scaleValue({ value, scaleFactor = 1 }: { value: number; scaleFac } export interface IFunctionRow { + id: string; rank: number; frame: StackFrameMetadata; samples: number; @@ -106,6 +107,7 @@ export function getFunctionsRows({ const scaledDiffSamples = scaledSelfCPU - comparisonScaledSelfCPU; return { + id: comparisonRow.Id, rank: topN.Rank - comparisonRow.Rank, samples: scaledDiffSamples, selfCPU: comparisonRow.CountExclusive, @@ -120,6 +122,7 @@ export function getFunctionsRows({ } return { + id: topN.Id, rank: topN.Rank, frame: topN.Frame, samples: scaledSelfCPU, diff --git a/x-pack/plugins/profiling/public/embeddables/functions/embeddable_functions.tsx b/x-pack/plugins/profiling/public/embeddables/functions/embeddable_functions.tsx index 4cfbe7ceddbb8..9a198ae66e262 100644 --- a/x-pack/plugins/profiling/public/embeddables/functions/embeddable_functions.tsx +++ b/x-pack/plugins/profiling/public/embeddables/functions/embeddable_functions.tsx @@ -9,12 +9,12 @@ import { EMBEDDABLE_FUNCTIONS } from '@kbn/observability-shared-plugin/public'; import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { AsyncEmbeddableComponent } from '../async_embeddable_component'; -import { EmbeddableFunctionsEmbeddableInput } from './embeddable_functions_factory'; -import { EmbeddableFunctionsGrid } from './embeddable_functions_grid'; import { ProfilingEmbeddableProvider, ProfilingEmbeddablesDependencies, } from '../profiling_embeddable_provider'; +import { EmbeddableFunctionsEmbeddableInput } from './embeddable_functions_factory'; +import { EmbeddableFunctionsGrid } from './embeddable_functions_grid'; export class EmbeddableFunctions extends Embeddable< EmbeddableFunctionsEmbeddableInput, diff --git a/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx b/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx index d4db1e2d9fb77..b8defbdfa4acb 100644 --- a/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx +++ b/x-pack/plugins/profiling/public/embeddables/profiling_embeddable_provider.tsx @@ -9,6 +9,7 @@ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public'; import React, { ReactChild, useMemo } from 'react'; import { CoreSetup, CoreStart } from '@kbn/core/public'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; import { ProfilingDependenciesContextProvider } from '../components/contexts/profiling_dependencies/profiling_dependencies_context'; import { ProfilingPluginPublicSetupDeps, ProfilingPluginPublicStartDeps } from '../types'; import { Services } from '../services'; @@ -21,6 +22,8 @@ export interface ProfilingEmbeddablesDependencies { profilingFetchServices: Services; } +const storage = new Storage(localStorage); + export type GetProfilingEmbeddableDependencies = () => Promise; interface Props { @@ -44,13 +47,17 @@ export function ProfilingEmbeddableProvider({ deps, children }: Props) { [deps] ); + const i18nCore = deps.coreStart.i18n; + return ( - - - - {children} - - - + + + + + {children} + + + + ); } diff --git a/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts b/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts index d7b2e947144bd..2c229414960a6 100644 --- a/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts +++ b/x-pack/plugins/profiling/public/embeddables/register_embeddables.ts @@ -9,10 +9,12 @@ import { EmbeddableSetup } from '@kbn/embeddable-plugin/public'; import { EMBEDDABLE_FLAMEGRAPH, EMBEDDABLE_FUNCTIONS, + EMBEDDABLE_PROFILING_SEARCH_BAR, } from '@kbn/observability-shared-plugin/public'; import { EmbeddableFlamegraphFactory } from './flamegraph/embeddable_flamegraph_factory'; import { EmbeddableFunctionsFactory } from './functions/embeddable_functions_factory'; import { GetProfilingEmbeddableDependencies } from './profiling_embeddable_provider'; +import { EmbeddableSearchBarFactory } from './search_bar/embeddable_search_bar_factory'; export function registerEmbeddables( embeddable: EmbeddableSetup, @@ -26,4 +28,8 @@ export function registerEmbeddables( EMBEDDABLE_FUNCTIONS, new EmbeddableFunctionsFactory(getProfilingEmbeddableDependencies) ); + embeddable.registerEmbeddableFactory( + EMBEDDABLE_PROFILING_SEARCH_BAR, + new EmbeddableSearchBarFactory(getProfilingEmbeddableDependencies) + ); } 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 new file mode 100644 index 0000000000000..cbc773abfc0f7 --- /dev/null +++ b/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar.tsx @@ -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 { css } from '@emotion/react'; +import { Embeddable, EmbeddableOutput, IContainer } from '@kbn/embeddable-plugin/public'; +import { EMBEDDABLE_PROFILING_SEARCH_BAR } from '@kbn/observability-shared-plugin/public'; +import React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; +import { ProfilingSearchBar } from '../../components/profiling_app_page_template/profiling_search_bar'; +import { + ProfilingEmbeddableProvider, + ProfilingEmbeddablesDependencies, +} from '../profiling_embeddable_provider'; +import { EmbeddableSearchBarEmbeddableInput } from './embeddable_search_bar_factory'; + +export class EmbeddableSearchBar extends Embeddable< + EmbeddableSearchBarEmbeddableInput, + EmbeddableOutput +> { + readonly type = EMBEDDABLE_PROFILING_SEARCH_BAR; + private _domNode?: HTMLElement; + + constructor( + private deps: ProfilingEmbeddablesDependencies, + initialInput: EmbeddableSearchBarEmbeddableInput, + parent?: IContainer + ) { + super(initialInput, {}, parent); + } + + render(domNode: HTMLElement) { + this._domNode = domNode; + const { showDatePicker, kuery, onQuerySubmit, onRefresh, rangeFrom, rangeTo } = this.input; + + render( + +
    + { + onQuerySubmit({ + dateRange, + query: typeof query?.query === 'string' ? query.query : '', + }); + }} + onRefresh={onRefresh} + onRefreshClick={onRefresh} + showQueryMenu={false} + rangeFrom={rangeFrom} + rangeTo={rangeTo} + /> +
    +
    , + domNode + ); + } + + public destroy() { + if (this._domNode) { + unmountComponentAtNode(this._domNode); + } + } + + reload() { + if (this._domNode) { + this.render(this._domNode); + } + } +} diff --git a/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar_factory.ts b/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar_factory.ts new file mode 100644 index 0000000000000..cc7443976e1b1 --- /dev/null +++ b/x-pack/plugins/profiling/public/embeddables/search_bar/embeddable_search_bar_factory.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { + EmbeddableFactoryDefinition, + EmbeddableInput, + IContainer, +} from '@kbn/embeddable-plugin/public'; +import { + EmbeddableProfilingSearchBarProps, + EMBEDDABLE_PROFILING_SEARCH_BAR, +} from '@kbn/observability-shared-plugin/public'; +import type { GetProfilingEmbeddableDependencies } from '../profiling_embeddable_provider'; + +export type EmbeddableSearchBarEmbeddableInput = EmbeddableProfilingSearchBarProps & + EmbeddableInput; + +export class EmbeddableSearchBarFactory + implements EmbeddableFactoryDefinition +{ + readonly type = EMBEDDABLE_PROFILING_SEARCH_BAR; + + constructor(private getProfilingEmbeddableDependencies: GetProfilingEmbeddableDependencies) {} + + async isEditable() { + return false; + } + + async create(input: EmbeddableSearchBarEmbeddableInput, parent?: IContainer) { + const { EmbeddableSearchBar } = await import('./embeddable_search_bar'); + const deps = await this.getProfilingEmbeddableDependencies(); + return new EmbeddableSearchBar(deps, input, parent); + } + + getDisplayName() { + return 'Universal Profiling Search bar'; + } +} diff --git a/x-pack/plugins/profiling/public/routing/index.tsx b/x-pack/plugins/profiling/public/routing/index.tsx index cb92422a94076..9df36e393c389 100644 --- a/x-pack/plugins/profiling/public/routing/index.tsx +++ b/x-pack/plugins/profiling/public/routing/index.tsx @@ -6,33 +6,35 @@ */ import { i18n } from '@kbn/i18n'; import { toNumberRt } from '@kbn/io-ts-utils'; -import { createRouter, Outlet } from '@kbn/typed-react-router-config'; -import * as t from 'io-ts'; -import React from 'react'; import { StackTracesDisplayOption, - TopNType, + TopNComparisonFunctionSortField, + topNComparisonFunctionSortFieldRt, TopNFunctionSortField, topNFunctionSortFieldRt, + TopNType, } from '@kbn/profiling-utils'; +import { createRouter, Outlet } from '@kbn/typed-react-router-config'; +import * as t from 'io-ts'; +import React from 'react'; import { indexLifecyclePhaseRt, IndexLifecyclePhaseSelectOption, } from '../../common/storage_explorer'; import { ComparisonMode, NormalizationMode } from '../components/normalization_menu'; import { RedirectTo } from '../components/redirect_to'; +import { AddDataTabs, AddDataView } from '../views/add_data_view'; +import { DeleteDataView } from '../views/delete_data_view'; import { FlameGraphsView } from '../views/flamegraphs'; import { DifferentialFlameGraphsView } from '../views/flamegraphs/differential_flamegraphs'; import { FlameGraphView } from '../views/flamegraphs/flamegraph'; import { FunctionsView } from '../views/functions'; import { DifferentialTopNFunctionsView } from '../views/functions/differential_topn'; import { TopNFunctionsView } from '../views/functions/topn'; -import { AddDataTabs, AddDataView } from '../views/add_data_view'; +import { Settings } from '../views/settings'; import { StackTracesView } from '../views/stack_traces_view'; import { StorageExplorerView } from '../views/storage_explorer'; import { RouteBreadcrumb } from './route_breadcrumb'; -import { DeleteDataView } from '../views/delete_data_view'; -import { Settings } from '../views/settings'; const routes = { '/settings': { @@ -253,6 +255,8 @@ const routes = { t.literal(NormalizationMode.Scale), t.literal(NormalizationMode.Time), ]), + comparisonSortField: topNComparisonFunctionSortFieldRt, + comparisonSortDirection: t.union([t.literal('asc'), t.literal('desc')]), }), t.partial({ baseline: toNumberRt, @@ -267,6 +271,8 @@ const routes = { comparisonRangeTo: 'now', comparisonKuery: '', normalizationMode: NormalizationMode.Time, + comparisonSortField: TopNComparisonFunctionSortField.ComparisonRank, + comparisonSortDirection: 'asc', }, }, }, diff --git a/x-pack/plugins/profiling/public/types.ts b/x-pack/plugins/profiling/public/types.ts index e583a4962dc68..cc949254e2707 100644 --- a/x-pack/plugins/profiling/public/types.ts +++ b/x-pack/plugins/profiling/public/types.ts @@ -25,6 +25,10 @@ import { ObservabilityAIAssistantPluginStart, } from '@kbn/observability-ai-assistant-plugin/public'; import { EmbeddableSetup } from '@kbn/embeddable-plugin/public'; +import type { + UnifiedSearchPublicPluginStart, + UnifiedSearchPluginSetup, +} from '@kbn/unified-search-plugin/public'; export interface ProfilingPluginPublicSetupDeps { observability: ObservabilityPublicSetup; @@ -36,6 +40,7 @@ export interface ProfilingPluginPublicSetupDeps { licensing: LicensingPluginSetup; share: SharePluginSetup; embeddable: EmbeddableSetup; + unifiedSearch: UnifiedSearchPluginSetup; } export interface ProfilingPluginPublicStartDeps { @@ -46,4 +51,5 @@ export interface ProfilingPluginPublicStartDeps { data: DataPublicPluginStart; charts: ChartsPluginStart; share: SharePluginStart; + unifiedSearch: UnifiedSearchPublicPluginStart; } diff --git a/x-pack/plugins/profiling/public/views/add_data_view/index.tsx b/x-pack/plugins/profiling/public/views/add_data_view/index.tsx index 556e29c1ba240..27e3ac639757a 100644 --- a/x-pack/plugins/profiling/public/views/add_data_view/index.tsx +++ b/x-pack/plugins/profiling/public/views/add_data_view/index.tsx @@ -541,7 +541,7 @@ docker.elastic.co/observability/profiling-agent:${stackVersion} /root/pf-host-ag title={ diff --git a/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx b/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx index cf538642afce8..0c5c45f60fcb7 100644 --- a/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx +++ b/x-pack/plugins/profiling/public/views/functions/differential_topn/index.tsx @@ -4,28 +4,21 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { - EuiDataGridRefProps, - EuiDataGridSorting, - EuiFlexGroup, - EuiFlexItem, - EuiHorizontalRule, - EuiPanel, - EuiSpacer, -} from '@elastic/eui'; -import { TopNFunctionSortField } from '@kbn/profiling-utils'; -import React, { useRef } from 'react'; -import { GridOnScrollProps } from 'react-window'; +import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiPanel, EuiSpacer } from '@elastic/eui'; +import React from 'react'; import { AsyncComponent } from '../../../components/async_component'; import { useProfilingDependencies } from '../../../components/contexts/profiling_dependencies/use_profiling_dependencies'; import { FramesSummary } from '../../../components/frames_summary'; +import { + DifferentialTopNFunctionsGrid, + OnChangeSortParams, +} from '../../../components/differential_topn_functions_grid'; import { NormalizationMenu, NormalizationMode, NormalizationOptions, } from '../../../components/normalization_menu'; import { PrimaryAndComparisonSearchBar } from '../../../components/primary_and_comparison_search_bar'; -import { TopNFunctionsGrid } from '../../../components/topn_functions'; import { AsyncStatus } from '../../../hooks/use_async'; import { useProfilingParams } from '../../../hooks/use_profiling_params'; import { useProfilingRouter } from '../../../hooks/use_profiling_router'; @@ -34,8 +27,6 @@ import { useTimeRange } from '../../../hooks/use_time_range'; import { useTimeRangeAsync } from '../../../hooks/use_time_range_async'; export function DifferentialTopNFunctionsView() { - const baseGridRef = useRef(null); - const comparisonGridRef = useRef(null); const { query } = useProfilingParams('/functions/differential'); const { rangeFrom, @@ -50,6 +41,8 @@ export function DifferentialTopNFunctionsView() { baseline = 1, comparison = 1, pageIndex = 0, + comparisonSortDirection, + comparisonSortField, } = query; const timeRange = useTimeRange({ rangeFrom, rangeTo }); @@ -147,20 +140,6 @@ export function DifferentialTopNFunctionsView() { }); } - function handleBaseGridScroll(scroll: GridOnScrollProps) { - if (comparisonGridRef?.current?.scrollTo) { - comparisonGridRef.current.scrollTo({ - scrollTop: scroll.scrollTop, - }); - } - } - - function handleComparisonGridScroll(scroll: GridOnScrollProps) { - if (baseGridRef?.current?.scrollTo) { - baseGridRef.current.scrollTo({ scrollTop: scroll.scrollTop }); - } - } - function handlePageChange(nextPage: number) { profilingRouter.push('/functions/differential', { path: {}, @@ -168,14 +147,10 @@ export function DifferentialTopNFunctionsView() { }); } - function handleSortChange(sorting: EuiDataGridSorting['columns'][0]) { + function handleOnSort(sorting: OnChangeSortParams) { profilingRouter.push('/functions/differential', { path: {}, - query: { - ...query, - sortField: sorting.id as TopNFunctionSortField, - sortDirection: sorting.direction, - }, + query: { ...query, ...sorting }, }); } @@ -223,50 +198,27 @@ export function DifferentialTopNFunctionsView() { - - - - - - - {comparisonTimeRange.inSeconds.start && comparisonTimeRange.inSeconds.end ? ( - - - - - - ) : null} - + + + diff --git a/x-pack/plugins/profiling/public/views/functions/index.tsx b/x-pack/plugins/profiling/public/views/functions/index.tsx index 1131056d9a9b8..2e4ddb32bc030 100644 --- a/x-pack/plugins/profiling/public/views/functions/index.tsx +++ b/x-pack/plugins/profiling/public/views/functions/index.tsx @@ -8,6 +8,7 @@ import { EuiPageHeaderContentProps } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; +import { TopNComparisonFunctionSortField } from '@kbn/profiling-utils'; import { NormalizationMode } from '../../components/normalization_menu'; import { ProfilingAppPageTemplate } from '../../components/profiling_app_page_template'; import { RedirectTo } from '../../components/redirect_to'; @@ -51,6 +52,12 @@ export function FunctionsView({ children }: { children: React.ReactElement }) { comparisonKuery: query.kuery, normalizationMode: 'normalizationMode' in query ? query.normalizationMode : NormalizationMode.Time, + comparisonSortField: + 'comparisonSortField' in query + ? query.comparisonSortField + : TopNComparisonFunctionSortField.ComparisonRank, + comparisonSortDirection: + 'comparisonSortDirection' in query ? query.comparisonSortDirection : 'asc', }, }), }, diff --git a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_setup_trust/confirm_modal.tsx b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_setup_trust/confirm_modal.tsx index 08ef4377338d1..1d9e9f1900f09 100644 --- a/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_setup_trust/confirm_modal.tsx +++ b/x-pack/plugins/remote_clusters/public/application/sections/components/remote_cluster_setup_trust/confirm_modal.tsx @@ -70,6 +70,9 @@ export const ConfirmTrustSetupModal = ({ closeModal, onSubmit }: ModalProps) => label={i18n.translate('xpack.remoteClusters.clusterWizard.trustStep.modal.checkbox', { defaultMessage: 'Yes, I have setup trust', })} + labelProps={{ + 'data-test-subj': 'remoteClusterTrustCheckboxLabel', + }} checked={hasSetupTrust} onChange={() => setHasSetupTrust(!hasSetupTrust)} data-test-subj="remoteClusterTrustCheckbox" diff --git a/x-pack/plugins/reporting/public/lib/default_status_context.tsx b/x-pack/plugins/reporting/public/lib/default_status_context.tsx new file mode 100644 index 0000000000000..23609e7e0a6ab --- /dev/null +++ b/x-pack/plugins/reporting/public/lib/default_status_context.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ClientConfigType } from '@kbn/reporting-public'; +import React, { createContext, FunctionComponent } from 'react'; +import { IlmPolicyStatusContextProvider } from './ilm_policy_status_context'; + +const PolicyStatusContext = createContext(undefined); + +interface PolicyStatusContextProviderProps { + config: ClientConfigType; +} + +export const PolicyStatusContextProvider: FunctionComponent = ({ + children, + ...props +}) => { + return props.config.statefulSettings.enabled ? ( + {children} + ) : ( + {children} + ); +}; diff --git a/x-pack/plugins/reporting/public/lib/reporting_api_client/hooks.ts b/x-pack/plugins/reporting/public/lib/reporting_api_client/hooks.ts index 5ede6e11ee78a..6668e9efe881f 100644 --- a/x-pack/plugins/reporting/public/lib/reporting_api_client/hooks.ts +++ b/x-pack/plugins/reporting/public/lib/reporting_api_client/hooks.ts @@ -13,5 +13,6 @@ export const useCheckIlmPolicyStatus = (): UseRequestResponse diff --git a/x-pack/plugins/reporting/public/management/default/report_listing_default.tsx b/x-pack/plugins/reporting/public/management/default/report_listing_default.tsx new file mode 100644 index 0000000000000..a2b09ccd3c177 --- /dev/null +++ b/x-pack/plugins/reporting/public/management/default/report_listing_default.tsx @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; + +import { EuiPageHeader, EuiSpacer } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { ListingPropsInternal } from '..'; +import { ReportListingTable } from '../report_listing_table'; + +/** + * Used in non-stateful (Serverless) + * Does not render controls for features only applicable in Stateful + */ +export const ReportListingDefault: FC = (props) => { + const { apiClient, capabilities, config, navigateToUrl, toasts, urlService, ...listingProps } = + props; + return ( + <> + + } + description={ + + } + /> + + + + ); +}; diff --git a/x-pack/plugins/reporting/public/management/index.ts b/x-pack/plugins/reporting/public/management/index.ts index 4b9074267dd49..bdd6d0a9916b7 100644 --- a/x-pack/plugins/reporting/public/management/index.ts +++ b/x-pack/plugins/reporting/public/management/index.ts @@ -8,20 +8,21 @@ import type { ApplicationStart, ToastsSetup } from '@kbn/core/public'; import type { LicensingPluginStart } from '@kbn/licensing-plugin/public'; import type { ClientConfigType } from '@kbn/reporting-public'; -import type { UseIlmPolicyStatusReturn } from '../lib/ilm_policy_status_context'; import type { ReportingAPIClient } from '../lib/reporting_api_client'; import type { SharePluginSetup } from '../shared_imports'; export interface ListingProps { apiClient: ReportingAPIClient; - capabilities: ApplicationStart['capabilities']; license$: LicensingPluginStart['license$']; config: ClientConfigType; redirect: ApplicationStart['navigateToApp']; navigateToUrl: ApplicationStart['navigateToUrl']; toasts: ToastsSetup; urlService: SharePluginSetup['url']; - ilmPolicyContextValue: UseIlmPolicyStatusReturn; } +export type ListingPropsInternal = ListingProps & { + capabilities: ApplicationStart['capabilities']; +}; + export { ReportListing } from './report_listing'; diff --git a/x-pack/plugins/reporting/public/management/mount_management_section.tsx b/x-pack/plugins/reporting/public/management/mount_management_section.tsx index 60cd66d952780..575d9e7c8d7cc 100644 --- a/x-pack/plugins/reporting/public/management/mount_management_section.tsx +++ b/x-pack/plugins/reporting/public/management/mount_management_section.tsx @@ -15,10 +15,10 @@ import { ILicense } from '@kbn/licensing-plugin/public'; import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import type { ClientConfigType } from '@kbn/reporting-public'; import { ReportListing } from '.'; -import { IlmPolicyStatusContextProvider } from '../lib/ilm_policy_status_context'; import { InternalApiClientProvider, ReportingAPIClient } from '../lib/reporting_api_client'; import type { ManagementAppMountParams, SharePluginSetup } from '../shared_imports'; import { KibanaContextProvider } from '../shared_imports'; +import { PolicyStatusContextProvider } from '../lib/default_status_context'; export async function mountManagementSection( coreSetup: CoreSetup, @@ -41,8 +41,9 @@ export async function mountManagementSection( }} > - + - + diff --git a/x-pack/plugins/reporting/public/management/report_listing.tsx b/x-pack/plugins/reporting/public/management/report_listing.tsx index 31976dd196a9a..024d75b04ae10 100644 --- a/x-pack/plugins/reporting/public/management/report_listing.tsx +++ b/x-pack/plugins/reporting/public/management/report_listing.tsx @@ -5,529 +5,26 @@ * 2.0. */ -import { Component, Fragment, default as React } from 'react'; -import { Subscription } from 'rxjs'; - -import { - EuiBasicTable, - EuiBasicTableColumn, - EuiFlexGroup, - EuiFlexItem, - EuiIconTip, - EuiLink, - EuiLoadingSpinner, - EuiPageHeader, - EuiSpacer, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { ILicense } from '@kbn/licensing-plugin/public'; -import { durationToNumber } from '@kbn/reporting-common'; +import React from 'react'; import { ListingProps as Props } from '.'; -import { REPORT_TABLE_ID, REPORT_TABLE_ROW_ID } from '../../common/constants'; -import { prettyPrintJobType } from '../../common/job_utils'; -import { Poller } from '../../common/poller'; -import { useIlmPolicyStatus } from '../lib/ilm_policy_status_context'; -import { Job } from '../lib/job'; -import { checkLicense } from '../lib/license_check'; import { useInternalApiClient } from '../lib/reporting_api_client'; import { useKibana } from '../shared_imports'; -import { - IlmPolicyLink, - MigrateIlmPolicyCallOut, - ReportDeleteButton, - ReportDiagnostic, - ReportInfoFlyout, - ReportStatusIndicator, -} from './components'; -import { guessAppIconTypeFromObjectType } from './utils'; import './report_listing.scss'; +import { ReportListingStateful } from './stateful/report_listing_stateful'; +import { ReportListingDefault } from './default/report_listing_default'; -type TableColumn = EuiBasicTableColumn; - -interface State { - page: number; - total: number; - jobs: Job[]; - selectedJobs: Job[]; - isLoading: boolean; - showLinks: boolean; - enableLinks: boolean; - badLicenseMessage: string; - selectedJob: undefined | Job; -} - -class ReportListingUi extends Component { - private isInitialJobsFetch: boolean; - private licenseSubscription?: Subscription; - private mounted?: boolean; - private poller?: Poller; - - constructor(props: Props) { - super(props); - - this.state = { - page: 0, - total: 0, - jobs: [], - selectedJobs: [], - isLoading: false, - showLinks: false, - enableLinks: false, - badLicenseMessage: '', - selectedJob: undefined, - }; - - this.isInitialJobsFetch = true; - } - - public render() { - const { - apiClient, - toasts, - ilmPolicyContextValue, - urlService, - navigateToUrl, - capabilities, - config, - } = this.props; - const ilmLocator = urlService.locators.get('ILM_LOCATOR_ID'); - const hasIlmPolicy = ilmPolicyContextValue.status !== 'policy-not-found'; - const showIlmPolicyLink = Boolean(ilmLocator && hasIlmPolicy); - return ( - <> - - } - description={ - - } - /> - - {config.statefulSettings.enabled ? : null} - - -
    {this.renderTable()}
    - - - - {capabilities?.management?.data?.index_lifecycle_management && ( - - {ilmPolicyContextValue.isLoading ? ( - - ) : ( - showIlmPolicyLink && ( - - ) - )} - - )} - - - - - - ); - } - - public componentWillUnmount() { - this.mounted = false; - this.poller?.stop(); - - if (this.licenseSubscription) { - this.licenseSubscription.unsubscribe(); - } - } - - public componentDidMount() { - this.mounted = true; - const { config, license$ } = this.props; - const pollFrequencyInMillis = durationToNumber(config.poll.jobsRefresh.interval); - this.poller = new Poller({ - functionToPoll: () => { - return this.fetchJobs(); - }, - pollFrequencyInMillis, - trailing: false, - continuePollingOnError: true, - pollFrequencyErrorMultiplier: config.poll.jobsRefresh.intervalErrorMultiplier, - }); - this.poller.start(); - this.licenseSubscription = license$.subscribe(this.licenseHandler); - } - - private licenseHandler = (license: ILicense) => { - const { - enableLinks, - showLinks, - message: badLicenseMessage, - } = checkLicense(license.check('reporting', 'basic')); - - this.setState({ - enableLinks, - showLinks, - badLicenseMessage, - }); - }; - - private onSelectionChange = (jobs: Job[]) => { - this.setState((current) => ({ ...current, selectedJobs: jobs })); - }; - - private removeJob = (job: Job) => { - const { jobs } = this.state; - const filtered = jobs.filter((j) => j.id !== job.id); - this.setState((current) => ({ ...current, jobs: filtered })); - }; - - private renderDeleteButton = () => { - const { selectedJobs } = this.state; - if (selectedJobs.length === 0) return undefined; - - const performDelete = async () => { - for (const job of selectedJobs) { - try { - await this.props.apiClient.deleteReport(job.id); - this.removeJob(job); - this.props.toasts.addSuccess( - i18n.translate('xpack.reporting.listing.table.deleteConfim', { - defaultMessage: `The {reportTitle} report was deleted`, - values: { - reportTitle: job.title, - }, - }) - ); - } catch (error) { - this.props.toasts.addDanger( - i18n.translate('xpack.reporting.listing.table.deleteFailedErrorMessage', { - defaultMessage: `The report was not deleted: {error}`, - values: { error }, - }) - ); - throw error; - } - } - }; - - return ( - - ); - }; - - private onTableChange = ({ page }: { page: { index: number } }) => { - const { index: pageIndex } = page; - this.setState(() => ({ page: pageIndex }), this.fetchJobs); - }; - - private fetchJobs = async () => { - // avoid page flicker when poller is updating table - only display loading screen on first load - if (this.isInitialJobsFetch) { - this.setState(() => ({ isLoading: true })); - } - - let jobs: Job[]; - let total: number; - try { - jobs = await this.props.apiClient.list(this.state.page); - total = await this.props.apiClient.total(); - this.isInitialJobsFetch = false; - } catch (fetchError) { - if (!this.licenseAllowsToShowThisPage()) { - this.props.toasts.addDanger(this.state.badLicenseMessage); - this.props.redirect('management'); - return; - } - - if (fetchError.message === 'Failed to fetch') { - this.props.toasts.addDanger( - fetchError.message || - i18n.translate('xpack.reporting.listing.table.requestFailedErrorMessage', { - defaultMessage: 'Request failed', - }) - ); - } - if (this.mounted) { - this.setState(() => ({ isLoading: false, jobs: [], total: 0 })); - } - return; - } - - if (this.mounted) { - this.setState(() => ({ - isLoading: false, - total, - jobs, - })); - } - }; - - private licenseAllowsToShowThisPage = () => { - return this.state.showLinks && this.state.enableLinks; - }; - - /** - * Widths like this are not the best, but the auto-layout does not play well with text in links. We can update - * this with something that works better on all screen sizes. This works for desktop, mobile fallback is provided on a - * per column basis. - */ - private readonly tableColumnWidths = { - type: '5%', - title: '30%', - status: '20%', - createdAt: '25%', - content: '10%', - actions: '10%', - }; - - private renderTable() { - const { tableColumnWidths } = this; - const tableColumns: TableColumn[] = [ - { - field: 'type', - width: tableColumnWidths.type, - name: i18n.translate('xpack.reporting.listing.tableColumns.typeTitle', { - defaultMessage: 'Type', - }), - render: (_type: string, job) => { - return ( -
    - -
    - ); - }, - mobileOptions: { - show: true, - render: (job) => { - return
    {job.objectType}
    ; - }, - }, - }, - { - field: 'title', - name: i18n.translate('xpack.reporting.listing.tableColumns.reportTitle', { - defaultMessage: 'Title', - }), - width: tableColumnWidths.title, - render: (objectTitle: string, job) => { - return ( -
    - this.setState({ selectedJob: job })} - > - {objectTitle || - i18n.translate('xpack.reporting.listing.table.noTitleLabel', { - defaultMessage: 'Untitled', - })} - -
    - ); - }, - mobileOptions: { - header: false, - width: '100%', // This is not recognized by EUI types but has an effect, leaving for now - } as unknown as { header: boolean }, - }, - { - field: 'status', - width: tableColumnWidths.status, - name: i18n.translate('xpack.reporting.listing.tableColumns.statusTitle', { - defaultMessage: 'Status', - }), - render: (_status: string, job) => { - return ( - - - - ); - }, - mobileOptions: { - show: false, - }, - }, - { - field: 'created_at', - width: tableColumnWidths.createdAt, - name: i18n.translate('xpack.reporting.listing.tableColumns.createdAtTitle', { - defaultMessage: 'Created at', - }), - render: (_createdAt: string, job) => ( -
    {job.getCreatedAtDate()}
    - ), - mobileOptions: { - show: false, - }, - }, - { - field: 'content', - width: tableColumnWidths.content, - name: i18n.translate('xpack.reporting.listing.tableColumns.content', { - defaultMessage: 'Content', - }), - render: (_status: string, job) => prettyPrintJobType(job.jobtype), - mobileOptions: { - show: false, - }, - }, - { - name: i18n.translate('xpack.reporting.listing.tableColumns.actionsTitle', { - defaultMessage: 'Actions', - }), - width: tableColumnWidths.actions, - actions: [ - { - isPrimary: true, - 'data-test-subj': 'reportDownloadLink', - type: 'icon', - icon: 'download', - name: i18n.translate('xpack.reporting.listing.table.downloadReportButtonLabel', { - defaultMessage: 'Download report', - }), - description: i18n.translate('xpack.reporting.listing.table.downloadReportDescription', { - defaultMessage: 'Download this report in a new tab.', - }), - onClick: (job) => this.props.apiClient.downloadReport(job.id), - enabled: (job) => job.isDownloadReady, - }, - { - name: i18n.translate( - 'xpack.reporting.listing.table.viewReportingInfoActionButtonLabel', - { - defaultMessage: 'View report info', - } - ), - description: i18n.translate( - 'xpack.reporting.listing.table.viewReportingInfoActionButtonDescription', - { - defaultMessage: 'View additional information about this report.', - } - ), - type: 'icon', - icon: 'iInCircle', - onClick: (job) => this.setState({ selectedJob: job }), - }, - { - name: i18n.translate('xpack.reporting.listing.table.openInKibanaAppLabel', { - defaultMessage: 'Open in Kibana', - }), - 'data-test-subj': 'reportOpenInKibanaApp', - description: i18n.translate( - 'xpack.reporting.listing.table.openInKibanaAppDescription', - { - defaultMessage: 'Open the Kibana app where this report was generated.', - } - ), - available: (job) => job.canLinkToKibanaApp, - type: 'icon', - icon: 'popout', - onClick: (job) => { - const href = this.props.apiClient.getKibanaAppHref(job); - window.open(href, '_blank'); - window.focus(); - }, - }, - ], - }, - ]; - - const pagination = { - pageIndex: this.state.page, - pageSize: 10, - totalItemCount: this.state.total, - showPerPageOptions: false, - }; - - const selection = { - itemId: 'id', - onSelectionChange: this.onSelectionChange, - }; - - return ( - - {this.state.selectedJobs.length > 0 && ( - - - {this.renderDeleteButton()} - - - - )} - ({ 'data-test-subj': REPORT_TABLE_ROW_ID })} - /> - {!!this.state.selectedJob && ( - this.setState({ selectedJob: undefined })} - job={this.state.selectedJob} - /> - )} - - ); - } -} - -export const ReportListing = ( - props: Omit< - Props, - 'ilmPolicyContextValue' | 'intl' | 'apiClient' | 'capabilities' | 'configAllowsImages' - > -) => { - const ilmPolicyStatusValue = useIlmPolicyStatus(); +export const ReportListing = (props: Props) => { const { apiClient } = useInternalApiClient(); const { services: { application: { capabilities }, }, } = useKibana(); - return ( - + return props.config.statefulSettings.enabled ? ( + + ) : ( + ); }; diff --git a/x-pack/plugins/reporting/public/management/report_listing_table.tsx b/x-pack/plugins/reporting/public/management/report_listing_table.tsx new file mode 100644 index 0000000000000..61b9e7d541928 --- /dev/null +++ b/x-pack/plugins/reporting/public/management/report_listing_table.tsx @@ -0,0 +1,440 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Component, Fragment, default as React } from 'react'; +import { Subscription } from 'rxjs'; + +import { + EuiBasicTable, + EuiBasicTableColumn, + EuiFlexGroup, + EuiFlexItem, + EuiIconTip, + EuiLink, + EuiSpacer, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ILicense } from '@kbn/licensing-plugin/public'; +import { durationToNumber } from '@kbn/reporting-common'; + +import { REPORT_TABLE_ID, REPORT_TABLE_ROW_ID } from '../../common/constants'; +import { prettyPrintJobType } from '../../common/job_utils'; +import { Poller } from '../../common/poller'; +import { Job } from '../lib/job'; +import { checkLicense } from '../lib/license_check'; +import { ReportDeleteButton, ReportInfoFlyout, ReportStatusIndicator } from './components'; +import { guessAppIconTypeFromObjectType } from './utils'; +import { ListingPropsInternal } from '.'; + +type TableColumn = EuiBasicTableColumn; + +interface State { + page: number; + total: number; + jobs: Job[]; + selectedJobs: Job[]; + isLoading: boolean; + showLinks: boolean; + enableLinks: boolean; + badLicenseMessage: string; + selectedJob: undefined | Job; +} + +export class ReportListingTable extends Component { + private isInitialJobsFetch: boolean; + private licenseSubscription?: Subscription; + private mounted?: boolean; + private poller?: Poller; + + constructor(props: ListingPropsInternal) { + super(props); + + this.state = { + page: 0, + total: 0, + jobs: [], + selectedJobs: [], + isLoading: false, + showLinks: false, + enableLinks: false, + badLicenseMessage: '', + selectedJob: undefined, + }; + + this.isInitialJobsFetch = true; + } + + public componentWillUnmount() { + this.mounted = false; + this.poller?.stop(); + + if (this.licenseSubscription) { + this.licenseSubscription.unsubscribe(); + } + } + + public componentDidMount() { + this.mounted = true; + const { config, license$ } = this.props; + const pollFrequencyInMillis = durationToNumber(config.poll.jobsRefresh.interval); + this.poller = new Poller({ + functionToPoll: () => { + return this.fetchJobs(); + }, + pollFrequencyInMillis, + trailing: false, + continuePollingOnError: true, + pollFrequencyErrorMultiplier: config.poll.jobsRefresh.intervalErrorMultiplier, + }); + this.poller.start(); + this.licenseSubscription = license$.subscribe(this.licenseHandler); + } + + private licenseHandler = (license: ILicense) => { + const { + enableLinks, + showLinks, + message: badLicenseMessage, + } = checkLicense(license.check('reporting', 'basic')); + + this.setState({ + enableLinks, + showLinks, + badLicenseMessage, + }); + }; + + private onSelectionChange = (jobs: Job[]) => { + this.setState((current) => ({ ...current, selectedJobs: jobs })); + }; + + private removeJob = (job: Job) => { + const { jobs } = this.state; + const filtered = jobs.filter((j) => j.id !== job.id); + this.setState((current) => ({ ...current, jobs: filtered })); + }; + + private renderDeleteButton = () => { + const { selectedJobs } = this.state; + if (selectedJobs.length === 0) return undefined; + + const performDelete = async () => { + for (const job of selectedJobs) { + try { + await this.props.apiClient.deleteReport(job.id); + this.removeJob(job); + this.props.toasts.addSuccess( + i18n.translate('xpack.reporting.listing.table.deleteConfim', { + defaultMessage: `The {reportTitle} report was deleted`, + values: { + reportTitle: job.title, + }, + }) + ); + } catch (error) { + this.props.toasts.addDanger( + i18n.translate('xpack.reporting.listing.table.deleteFailedErrorMessage', { + defaultMessage: `The report was not deleted: {error}`, + values: { error }, + }) + ); + throw error; + } + } + }; + + return ( + + ); + }; + + private onTableChange = ({ page }: { page: { index: number } }) => { + const { index: pageIndex } = page; + this.setState(() => ({ page: pageIndex }), this.fetchJobs); + }; + + private fetchJobs = async () => { + // avoid page flicker when poller is updating table - only display loading screen on first load + if (this.isInitialJobsFetch) { + this.setState(() => ({ isLoading: true })); + } + + let jobs: Job[]; + let total: number; + try { + jobs = await this.props.apiClient.list(this.state.page); + total = await this.props.apiClient.total(); + this.isInitialJobsFetch = false; + } catch (fetchError) { + if (!this.licenseAllowsToShowThisPage()) { + this.props.toasts.addDanger(this.state.badLicenseMessage); + this.props.redirect('management'); + return; + } + + if (fetchError.message === 'Failed to fetch') { + this.props.toasts.addDanger( + fetchError.message || + i18n.translate('xpack.reporting.listing.table.requestFailedErrorMessage', { + defaultMessage: 'Request failed', + }) + ); + } + if (this.mounted) { + this.setState(() => ({ isLoading: false, jobs: [], total: 0 })); + } + return; + } + + if (this.mounted) { + this.setState(() => ({ + isLoading: false, + total, + jobs, + })); + } + }; + + private licenseAllowsToShowThisPage = () => { + return this.state.showLinks && this.state.enableLinks; + }; + + /** + * Widths like this are not the best, but the auto-layout does not play well with text in links. We can update + * this with something that works better on all screen sizes. This works for desktop, mobile fallback is provided on a + * per column basis. + */ + private readonly tableColumnWidths = { + type: '5%', + title: '30%', + status: '20%', + createdAt: '25%', + content: '10%', + actions: '10%', + }; + + public render() { + const { tableColumnWidths } = this; + const tableColumns: TableColumn[] = [ + { + field: 'type', + width: tableColumnWidths.type, + name: i18n.translate('xpack.reporting.listing.tableColumns.typeTitle', { + defaultMessage: 'Type', + }), + render: (_type: string, job) => { + return ( +
    + +
    + ); + }, + mobileOptions: { + show: true, + render: (job) => { + return
    {job.objectType}
    ; + }, + }, + }, + { + field: 'title', + name: i18n.translate('xpack.reporting.listing.tableColumns.reportTitle', { + defaultMessage: 'Title', + }), + width: tableColumnWidths.title, + render: (objectTitle: string, job) => { + return ( +
    + this.setState({ selectedJob: job })} + > + {objectTitle || + i18n.translate('xpack.reporting.listing.table.noTitleLabel', { + defaultMessage: 'Untitled', + })} + +
    + ); + }, + mobileOptions: { + header: false, + width: '100%', // This is not recognized by EUI types but has an effect, leaving for now + } as unknown as { header: boolean }, + }, + { + field: 'status', + width: tableColumnWidths.status, + name: i18n.translate('xpack.reporting.listing.tableColumns.statusTitle', { + defaultMessage: 'Status', + }), + render: (_status: string, job) => { + return ( + + + + ); + }, + mobileOptions: { + show: false, + }, + }, + { + field: 'created_at', + width: tableColumnWidths.createdAt, + name: i18n.translate('xpack.reporting.listing.tableColumns.createdAtTitle', { + defaultMessage: 'Created at', + }), + render: (_createdAt: string, job) => ( +
    {job.getCreatedAtDate()}
    + ), + mobileOptions: { + show: false, + }, + }, + { + field: 'content', + width: tableColumnWidths.content, + name: i18n.translate('xpack.reporting.listing.tableColumns.content', { + defaultMessage: 'Content', + }), + render: (_status: string, job) => prettyPrintJobType(job.jobtype), + mobileOptions: { + show: false, + }, + }, + { + name: i18n.translate('xpack.reporting.listing.tableColumns.actionsTitle', { + defaultMessage: 'Actions', + }), + width: tableColumnWidths.actions, + actions: [ + { + isPrimary: true, + 'data-test-subj': 'reportDownloadLink', + type: 'icon', + icon: 'download', + name: i18n.translate('xpack.reporting.listing.table.downloadReportButtonLabel', { + defaultMessage: 'Download report', + }), + description: i18n.translate('xpack.reporting.listing.table.downloadReportDescription', { + defaultMessage: 'Download this report in a new tab.', + }), + onClick: (job) => this.props.apiClient.downloadReport(job.id), + enabled: (job) => job.isDownloadReady, + }, + { + name: i18n.translate( + 'xpack.reporting.listing.table.viewReportingInfoActionButtonLabel', + { + defaultMessage: 'View report info', + } + ), + description: i18n.translate( + 'xpack.reporting.listing.table.viewReportingInfoActionButtonDescription', + { + defaultMessage: 'View additional information about this report.', + } + ), + type: 'icon', + icon: 'iInCircle', + onClick: (job) => this.setState({ selectedJob: job }), + }, + { + name: i18n.translate('xpack.reporting.listing.table.openInKibanaAppLabel', { + defaultMessage: 'Open in Kibana', + }), + 'data-test-subj': 'reportOpenInKibanaApp', + description: i18n.translate( + 'xpack.reporting.listing.table.openInKibanaAppDescription', + { + defaultMessage: 'Open the Kibana app where this report was generated.', + } + ), + available: (job) => job.canLinkToKibanaApp, + type: 'icon', + icon: 'popout', + onClick: (job) => { + const href = this.props.apiClient.getKibanaAppHref(job); + window.open(href, '_blank'); + window.focus(); + }, + }, + ], + }, + ]; + + const pagination = { + pageIndex: this.state.page, + pageSize: 10, + totalItemCount: this.state.total, + showPerPageOptions: false, + }; + + const selection = { + itemId: 'id', + onSelectionChange: this.onSelectionChange, + }; + + return ( + + {this.state.selectedJobs.length > 0 && ( + + + {this.renderDeleteButton()} + + + + )} + ({ 'data-test-subj': REPORT_TABLE_ROW_ID })} + /> + {!!this.state.selectedJob && ( + this.setState({ selectedJob: undefined })} + job={this.state.selectedJob} + /> + )} + + ); + } +} diff --git a/x-pack/plugins/reporting/public/management/stateful/report_listing_stateful.tsx b/x-pack/plugins/reporting/public/management/stateful/report_listing_stateful.tsx new file mode 100644 index 0000000000000..3e7a3c8cb10fd --- /dev/null +++ b/x-pack/plugins/reporting/public/management/stateful/report_listing_stateful.tsx @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; + +import { + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiPageHeader, + EuiSpacer, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { ListingPropsInternal } from '..'; +import { useIlmPolicyStatus } from '../../lib/ilm_policy_status_context'; +import { IlmPolicyLink, MigrateIlmPolicyCallOut, ReportDiagnostic } from '../components'; +import { ReportListingTable } from '../report_listing_table'; + +/** + * Used in Stateful deployments only + * Renders controls for ILM and Screenshotting Diagnostics which are only applicable in Stateful + */ +export const ReportListingStateful: FC = (props) => { + const { apiClient, capabilities, config, navigateToUrl, toasts, urlService, ...listingProps } = + props; + const ilmLocator = urlService.locators.get('ILM_LOCATOR_ID'); + const ilmPolicyContextValue = useIlmPolicyStatus(); + const hasIlmPolicy = ilmPolicyContextValue?.status !== 'policy-not-found'; + const showIlmPolicyLink = Boolean(ilmLocator && hasIlmPolicy); + return ( + <> + + } + description={ + + } + /> + + + + + + + + + + {capabilities?.management?.data?.index_lifecycle_management && ( + + {ilmPolicyContextValue?.isLoading ? ( + + ) : ( + showIlmPolicyLink && ( + + ) + )} + + )} + + + + + + ); +}; diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts index 47eeb6e46c406..f395ddb4b75f7 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts @@ -22,6 +22,7 @@ import { ALERT_STATUS_ACTIVE, ALERT_CASE_IDS, MAX_CASES_PER_ALERT, + AlertConsumers, } from '@kbn/rule-data-utils'; import { @@ -80,6 +81,7 @@ export interface ConstructorOptions { esClient: ElasticsearchClient; ruleDataService: IRuleDataService; getRuleType: RuleTypeRegistry['get']; + getRuleList: RuleTypeRegistry['list']; getAlertIndicesAlias: AlertingStart['getAlertIndicesAlias']; } @@ -153,6 +155,7 @@ export class AlertsClient { private readonly spaceId: string | undefined; private readonly ruleDataService: IRuleDataService; private readonly getRuleType: RuleTypeRegistry['get']; + private readonly getRuleList: RuleTypeRegistry['list']; private getAlertIndicesAlias!: AlertingStart['getAlertIndicesAlias']; constructor(options: ConstructorOptions) { @@ -165,6 +168,7 @@ export class AlertsClient { this.spaceId = this.authorization.getSpaceId(); this.ruleDataService = options.ruleDataService; this.getRuleType = options.getRuleType; + this.getRuleList = options.getRuleList; this.getAlertIndicesAlias = options.getAlertIndicesAlias; } @@ -1076,19 +1080,31 @@ export class AlertsClient { } public async getBrowserFields({ + featureIds, indices, metaFields, allowNoIndex, }: { + featureIds: string[]; indices: string[]; metaFields: string[]; allowNoIndex: boolean; }): Promise<{ browserFields: BrowserFields; fields: FieldDescriptor[] }> { const indexPatternsFetcherAsInternalUser = new IndexPatternsFetcher(this.esClient); + const ruleTypeList = this.getRuleList(); + const fieldsForAAD = new Set(); + for (const rule of ruleTypeList) { + if (featureIds.includes(rule.producer) && rule.hasFieldsForAAD) { + (rule.fieldsForAAD ?? []).forEach((f) => { + fieldsForAAD.add(f); + }); + } + } const { fields } = await indexPatternsFetcherAsInternalUser.getFieldsForWildcard({ pattern: indices, metaFields, fieldCapsOptions: { allow_no_indices: allowNoIndex }, + fields: [...fieldsForAAD, 'kibana.*'], }); return { @@ -1099,11 +1115,13 @@ export class AlertsClient { public async getAADFields({ ruleTypeId }: { ruleTypeId: string }) { const { producer, fieldsForAAD = [] } = this.getRuleType(ruleTypeId); + if (producer === AlertConsumers.SIEM) { + throw Boom.badRequest(`Security solution rule type is not supported`); + } const indices = await this.getAuthorizedAlertsIndices([producer]); - const o11yIndices = indices?.filter((index) => index.startsWith('.alerts-observability')) ?? []; const indexPatternsFetcherAsInternalUser = new IndexPatternsFetcher(this.esClient); - const { fields } = await indexPatternsFetcherAsInternalUser.getFieldsForWildcard({ - pattern: o11yIndices, + const { fields = [] } = await indexPatternsFetcherAsInternalUser.getFieldsForWildcard({ + pattern: indices ?? [], metaFields: ['_id', '_index'], fieldCapsOptions: { allow_no_indices: true }, fields: [...fieldsForAAD, 'kibana.*'], diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.test.ts index 43966d1207004..367ead5744d55 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.test.ts @@ -26,6 +26,7 @@ const alertsClientFactoryParams: AlertsClientFactoryProps = { esClient: {} as ElasticsearchClient, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; @@ -53,6 +54,7 @@ describe('AlertsClientFactory', () => { auditLogger, esClient: {}, ruleDataService: alertsClientFactoryParams.ruleDataService, + getRuleList: alertsClientFactoryParams.getRuleList, getRuleType: alertsClientFactoryParams.getRuleType, getAlertIndicesAlias: alertsClientFactoryParams.getAlertIndicesAlias, }); diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.ts b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.ts index de0afb5a0b226..934074cc4a2ed 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.ts @@ -23,6 +23,7 @@ export interface AlertsClientFactoryProps { securityPluginSetup: SecurityPluginSetup | undefined; ruleDataService: IRuleDataService | null; getRuleType: RuleTypeRegistry['get']; + getRuleList: RuleTypeRegistry['list']; getAlertIndicesAlias: AlertingStart['getAlertIndicesAlias']; } @@ -36,6 +37,7 @@ export class AlertsClientFactory { private securityPluginSetup!: SecurityPluginSetup | undefined; private ruleDataService!: IRuleDataService | null; private getRuleType!: RuleTypeRegistry['get']; + private getRuleList!: RuleTypeRegistry['list']; private getAlertIndicesAlias!: AlertingStart['getAlertIndicesAlias']; public initialize(options: AlertsClientFactoryProps) { @@ -53,6 +55,7 @@ export class AlertsClientFactory { this.securityPluginSetup = options.securityPluginSetup; this.ruleDataService = options.ruleDataService; this.getRuleType = options.getRuleType; + this.getRuleList = options.getRuleList; this.getAlertIndicesAlias = options.getAlertIndicesAlias; } @@ -66,6 +69,7 @@ export class AlertsClientFactory { esClient: this.esClient, ruleDataService: this.ruleDataService!, getRuleType: this.getRuleType, + getRuleList: this.getRuleList, getAlertIndicesAlias: this.getAlertIndicesAlias, }); } diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update.test.ts index 4229ae23793fc..28cd76ca6dffe 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update.test.ts @@ -31,6 +31,7 @@ const alertsClientParams: jest.Mocked = { auditLogger, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update_cases.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update_cases.test.ts index 4047a3ecadd27..544fab479f9dd 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update_cases.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/bulk_update_cases.test.ts @@ -37,6 +37,7 @@ describe('bulkUpdateCases', () => { auditLogger, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/find_alerts.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/find_alerts.test.ts index 37ad46a523a70..8ccae88dd83c3 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/tests/find_alerts.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/find_alerts.test.ts @@ -30,6 +30,7 @@ const alertsClientParams: jest.Mocked = { auditLogger, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts index fb1e0eef432ef..4185fb7e83eb6 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/get.test.ts @@ -31,6 +31,7 @@ const alertsClientParams: jest.Mocked = { auditLogger, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/get_aad_fields.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/get_aad_fields.test.ts new file mode 100644 index 0000000000000..777b3d3e26742 --- /dev/null +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/get_aad_fields.test.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { AlertConsumers } from '@kbn/rule-data-utils'; +import { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { loggingSystemMock } from '@kbn/core/server/mocks'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; +import { alertingAuthorizationMock } from '@kbn/alerting-plugin/server/authorization/alerting_authorization.mock'; +import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks'; +import { ruleDataServiceMock } from '../../rule_data_plugin_service/rule_data_plugin_service.mock'; + +const alertingAuthMock = alertingAuthorizationMock.create(); +const esClientMock = elasticsearchClientMock.createElasticsearchClient(); +const auditLogger = auditLoggerMock.create(); +const getRuleTypeMock = jest.fn(); +const alertsClientParams: jest.Mocked = { + logger: loggingSystemMock.create().get(), + authorization: alertingAuthMock, + esClient: esClientMock, + auditLogger, + ruleDataService: ruleDataServiceMock.create(), + getRuleType: getRuleTypeMock, + getRuleList: jest.fn(), + getAlertIndicesAlias: jest.fn(), +}; + +const DEFAULT_SPACE = 'test_default_space_id'; + +beforeEach(() => { + jest.resetAllMocks(); + alertingAuthMock.getSpaceId.mockImplementation(() => DEFAULT_SPACE); +}); + +describe('getAADFields()', () => { + test('should throw an error when a rule type belong to security solution', async () => { + getRuleTypeMock.mockImplementation(() => ({ + producer: AlertConsumers.SIEM, + fieldsForAAD: [], + })); + const alertsClient = new AlertsClient(alertsClientParams); + + await expect( + alertsClient.getAADFields({ ruleTypeId: 'security-type' }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Security solution rule type is not supported"`); + }); +}); diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/remove_cases_from_alerts.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/remove_cases_from_alerts.test.ts index 2611200afd85f..317de5d52e8e2 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/tests/remove_cases_from_alerts.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/remove_cases_from_alerts.test.ts @@ -32,6 +32,7 @@ describe('remove cases from alerts', () => { auditLogger, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; @@ -90,6 +91,7 @@ describe('remove cases from alerts', () => { auditLogger, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; diff --git a/x-pack/plugins/rule_registry/server/alert_data_client/tests/update.test.ts b/x-pack/plugins/rule_registry/server/alert_data_client/tests/update.test.ts index bca5e7d967f3a..bd6a1b2695cd1 100644 --- a/x-pack/plugins/rule_registry/server/alert_data_client/tests/update.test.ts +++ b/x-pack/plugins/rule_registry/server/alert_data_client/tests/update.test.ts @@ -30,6 +30,7 @@ const alertsClientParams: jest.Mocked = { auditLogger, ruleDataService: ruleDataServiceMock.create(), getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: jest.fn(), }; diff --git a/x-pack/plugins/rule_registry/server/plugin.ts b/x-pack/plugins/rule_registry/server/plugin.ts index 6fba837a10c1a..8cb6df23ae766 100644 --- a/x-pack/plugins/rule_registry/server/plugin.ts +++ b/x-pack/plugins/rule_registry/server/plugin.ts @@ -166,6 +166,7 @@ export class RuleRegistryPlugin securityPluginSetup: security, ruleDataService, getRuleType: plugins.alerting.getType, + getRuleList: plugins.alerting.listTypes, getAlertIndicesAlias: plugins.alerting.getAlertIndicesAlias, }); diff --git a/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts b/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts index 259ca03478745..995f992e0b800 100644 --- a/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts +++ b/x-pack/plugins/rule_registry/server/routes/get_browser_fields_by_feature_id.ts @@ -53,6 +53,7 @@ export const getBrowserFieldsByFeatureId = (router: IRouter = ({ user }) labelAppend={} fullWidth > - + = ({ user }) labelAppend={} fullWidth > - + ); @@ -189,6 +189,7 @@ const UserSettingsEditor: FunctionComponent = ({ = ({ user, data }) {formChanges.count > 0 ? ( - + ) : null} @@ -974,6 +979,7 @@ export const SaveChangesBottomBar: FunctionComponent = () => { 0 && !formik.isValid} color="success" diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index a7460bcd70345..75eda07fa185e 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -429,6 +429,7 @@ export const RULES_TABLE_MAX_PAGE_SIZE = 100; */ export const NEW_FEATURES_TOUR_STORAGE_KEYS = { RULE_MANAGEMENT_PAGE: 'securitySolution.rulesManagementPage.newFeaturesTour.v8.11', + TIMELINES: 'securitySolution.security.timelineFlyoutHeader.saveTimelineTour', }; export const RULE_DETAILS_EXECUTION_LOG_TABLE_SHOW_METRIC_COLUMNS_STORAGE_KEY = @@ -449,8 +450,8 @@ export const RISKY_HOSTS_DOC_LINK = 'https://www.elastic.co/guide/en/security/current/host-risk-score.html'; export const RISKY_USERS_DOC_LINK = 'https://www.elastic.co/guide/en/security/current/user-risk-score.html'; -export const DETECTION_ENTITY_DASHBOARD = - 'https://www.elastic.co/guide/en/security/current/detection-entity-dashboard.html'; +export const RISKY_ENTITY_SCORE_DOC_LINK = + 'https://www.elastic.co/guide/en/security/current/advanced-entity-analytics-overview.html#entity-risk-scoring'; export const MAX_NUMBER_OF_NEW_TERMS_FIELDS = 3; diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index b080981713dec..2ada33b7426f1 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -70,8 +70,14 @@ export const allowedExperimentalValues = Object.freeze({ * Enables top charts on Alerts Page */ alertsPageChartsEnabled: true, + /** + * Enables the alert type column in KPI visualizations on Alerts Page + */ alertTypeEnabled: false, - + /** + * Enables expandable flyout in create rule page, alert preview + */ + expandableFlyoutInCreateRuleEnabled: false, /* * Enables new Set of filters on the Alerts page. * @@ -108,12 +114,6 @@ export const allowedExperimentalValues = Object.freeze({ * Enables Protection Updates tab in the Endpoint Policy Details page */ protectionUpdatesEnabled: true, - - /** - * Disables the timeline save tour. - * This flag is used to disable the tour in cypress tests. - */ - disableTimelineSaveTour: false, }); type ExperimentalConfigKeys = Array; diff --git a/x-pack/plugins/security_solution/common/risk_engine/indices.ts b/x-pack/plugins/security_solution/common/risk_engine/indices.ts index e148985b3139a..281b4495e0c47 100644 --- a/x-pack/plugins/security_solution/common/risk_engine/indices.ts +++ b/x-pack/plugins/security_solution/common/risk_engine/indices.ts @@ -13,3 +13,6 @@ export const latestRiskScoreIndexPattern = 'risk-score.risk-score-latest-*'; export const getRiskScoreLatestIndex = (spaceId = 'default') => `${riskScoreBaseIndexName}.risk-score-latest-${spaceId}`; + +export const getRiskScoreTimeSeriesIndex = (spaceId = 'default') => + `${riskScoreBaseIndexName}.risk-score-${spaceId}`; diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts index 1214a17c85867..efbf12b3e5e90 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/all/index.ts @@ -103,11 +103,3 @@ export const EMPTY_SEVERITY_COUNT = { [RiskSeverity.moderate]: 0, [RiskSeverity.unknown]: 0, }; - -export const SEVERITY_UI_SORT_ORDER = [ - RiskSeverity.unknown, - RiskSeverity.low, - RiskSeverity.moderate, - RiskSeverity.high, - RiskSeverity.critical, -]; diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/common/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/common/index.ts index 1bf6ef39097d3..b5e0c62526a61 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/common/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/risk_score/common/index.ts @@ -7,7 +7,11 @@ import type { ESQuery } from '../../../../typed_json'; import { RISKY_HOSTS_INDEX_PREFIX, RISKY_USERS_INDEX_PREFIX } from '../../../../constants'; -import { RiskScoreEntity, getRiskScoreLatestIndex } from '../../../../risk_engine'; +import { + RiskScoreEntity, + getRiskScoreLatestIndex, + getRiskScoreTimeSeriesIndex, +} from '../../../../risk_engine'; export { RiskQueries } from '../../../../api/search_strategy'; /** @@ -30,7 +34,9 @@ export const getUserRiskIndex = ( isNewRiskScoreModuleInstalled: boolean ): string => { return isNewRiskScoreModuleInstalled - ? getRiskScoreLatestIndex(spaceId) + ? onlyLatest + ? getRiskScoreLatestIndex(spaceId) + : getRiskScoreTimeSeriesIndex(spaceId) : `${RISKY_USERS_INDEX_PREFIX}${onlyLatest ? 'latest_' : ''}${spaceId}`; }; diff --git a/x-pack/plugins/security_solution/public/actions/constants.ts b/x-pack/plugins/security_solution/public/actions/constants.ts index 95e72e70ccbab..c477d5c6fc9c1 100644 --- a/x-pack/plugins/security_solution/public/actions/constants.ts +++ b/x-pack/plugins/security_solution/public/actions/constants.ts @@ -4,6 +4,9 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + +import { FILTER_CELL_ACTION_TYPE, COPY_CELL_ACTION_TYPE } from '@kbn/cell-actions/constants'; + export enum SecurityCellActionsTrigger { DEFAULT = 'security-default-cellActions', DETAILS_FLYOUT = 'security-detailsFlyout-cellActions', @@ -26,3 +29,8 @@ export enum SecurityCellActionType { SHOW_TOP_N = 'security-cellAction-type-showTopN', TOGGLE_COLUMN = 'security-cellAction-type-toggleColumn', } + +export const DefaultCellActionTypes = { + FILTER: FILTER_CELL_ACTION_TYPE, + COPY: COPY_CELL_ACTION_TYPE, +} as const; diff --git a/x-pack/plugins/security_solution/public/actions/filter/index.ts b/x-pack/plugins/security_solution/public/actions/filter/index.ts index 2759d5cc20d36..b2e492956ecde 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/index.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/index.ts @@ -9,7 +9,5 @@ export { createFilterInCellActionFactory } from './cell_action/filter_in'; export { createFilterOutCellActionFactory } from './cell_action/filter_out'; export { createFilterInDiscoverCellActionFactory } from './discover/filter_in'; export { createFilterOutDiscoverCellActionFactory } from './discover/filter_out'; -export { createTimelineHistogramFilterInLegendActionFactory } from './lens/filter_in_timeline'; -export { createFilterInHistogramLegendActionFactory } from './lens/filter_in'; -export { createTimelineHistogramFilterOutLegendActionFactory } from './lens/filter_out_timeline'; -export { createFilterOutHistogramLegendActionFactory } from './lens/filter_out'; +export { createFilterInLensAction } from './lens/filter_in'; +export { createFilterOutLensAction } from './lens/filter_out'; diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/helpers.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts similarity index 72% rename from x-pack/plugins/security_solution/public/actions/filter/lens/helpers.ts rename to x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts index d138561aab1b6..78a0a9d46ff21 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/helpers.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/lens/create_action.ts @@ -16,15 +16,12 @@ import type { CellValueContext } from '@kbn/embeddable-plugin/public'; import { createAction } from '@kbn/ui-actions-plugin/public'; import { ACTION_INCOMPATIBLE_VALUE_WARNING } from '@kbn/cell-actions/src/actions/translations'; import { i18n } from '@kbn/i18n'; -import { KibanaServices } from '../../../common/lib/kibana'; import { timelineSelectors } from '../../../timelines/store/timeline'; import { fieldHasCellActions, isInSecurityApp, isLensEmbeddable } from '../../utils'; import { TimelineId } from '../../../../common/types'; -import { SecurityCellActionType } from '../../constants'; +import { DefaultCellActionTypes } from '../../constants'; import type { SecurityAppStore } from '../../../common/store'; import type { StartServices } from '../../../types'; -import { HISTOGRAM_LEGEND_ACTION_FILTER_IN } from './filter_in'; -import { HISTOGRAM_LEGEND_ACTION_FILTER_OUT } from './filter_out'; function isDataColumnsValid(data?: CellValueContext['data']): boolean { return ( @@ -34,7 +31,7 @@ function isDataColumnsValid(data?: CellValueContext['data']): boolean { ); } -export const createHistogramFilterLegendActionFactory = ({ +export const createFilterLensAction = ({ id, order, store, @@ -47,14 +44,13 @@ export const createHistogramFilterLegendActionFactory = ({ services: StartServices; negate?: boolean; }) => { - const { application: applicationService } = KibanaServices.get(); + const { application, notifications, data: dataService, topValuesPopover } = services; + let currentAppId: string | undefined; - applicationService.currentAppId$.subscribe((appId) => { + application.currentAppId$.subscribe((appId) => { currentAppId = appId; }); const getTimelineById = timelineSelectors.getTimelineByIdSelector(); - const { notifications } = services; - const { filterManager } = services.data.query; return createAction({ id, @@ -68,7 +64,7 @@ export const createHistogramFilterLegendActionFactory = ({ : i18n.translate('xpack.securitySolution.actions.filterForTimeline', { defaultMessage: `Filter for`, }), - type: SecurityCellActionType.FILTER, + type: DefaultCellActionTypes.FILTER, isCompatible: async ({ embeddable, data }) => !isErrorEmbeddable(embeddable) && isLensEmbeddable(embeddable) && @@ -85,27 +81,19 @@ export const createHistogramFilterLegendActionFactory = ({ }); return; } - if (!field) return; + topValuesPopover.closePopover(); + + const addFilter = negate === true ? addFilterOut : addFilterIn; + const timeline = getTimelineById(store.getState(), TimelineId.active); - services.topValuesPopover.closePopover(); + // timeline is open add the filter to timeline, otherwise add filter to global filters + const filterManager = timeline?.show + ? timeline.filterManager + : dataService.query.filterManager; - if (!negate) { - addFilterIn({ - filterManager: - id === HISTOGRAM_LEGEND_ACTION_FILTER_IN ? filterManager : timeline.filterManager, - fieldName: field, - value, - }); - } else { - addFilterOut({ - filterManager: - id === HISTOGRAM_LEGEND_ACTION_FILTER_OUT ? filterManager : timeline.filterManager, - fieldName: field, - value, - }); - } + addFilter({ filterManager, fieldName: field, value }); }, }); }; diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_in.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/filter_in.ts index aee91a849d898..fae9175879c9f 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_in.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/lens/filter_in.ts @@ -8,11 +8,11 @@ import type { SecurityAppStore } from '../../../common/store'; import type { StartServices } from '../../../types'; -import { createHistogramFilterLegendActionFactory } from './helpers'; +import { createFilterLensAction } from './create_action'; -export const HISTOGRAM_LEGEND_ACTION_FILTER_IN = 'histogramLegendActionFilterIn'; +export const ACTION_ID = 'embeddable_filterIn'; -export const createFilterInHistogramLegendActionFactory = ({ +export const createFilterInLensAction = ({ store, order, services, @@ -21,8 +21,8 @@ export const createFilterInHistogramLegendActionFactory = ({ order: number; services: StartServices; }) => - createHistogramFilterLegendActionFactory({ - id: HISTOGRAM_LEGEND_ACTION_FILTER_IN, + createFilterLensAction({ + id: ACTION_ID, order, store, services, diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_in_timeline.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/filter_in_timeline.ts deleted file mode 100644 index 6721972f0bcfb..0000000000000 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_in_timeline.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { SecurityAppStore } from '../../../common/store'; - -import type { StartServices } from '../../../types'; -import { createHistogramFilterLegendActionFactory } from './helpers'; - -export const TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_IN = 'timelineHistogramLegendActionFilterIn'; - -export const createTimelineHistogramFilterInLegendActionFactory = ({ - store, - order, - services, -}: { - store: SecurityAppStore; - order: number; - services: StartServices; -}) => - createHistogramFilterLegendActionFactory({ - id: TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_IN, - order, - store, - services, - }); diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_out.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/filter_out.ts index 4e32a3bee1b1f..2b629ac1be861 100644 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_out.ts +++ b/x-pack/plugins/security_solution/public/actions/filter/lens/filter_out.ts @@ -8,11 +8,11 @@ import type { SecurityAppStore } from '../../../common/store'; import type { StartServices } from '../../../types'; -import { createHistogramFilterLegendActionFactory } from './helpers'; +import { createFilterLensAction } from './create_action'; -export const HISTOGRAM_LEGEND_ACTION_FILTER_OUT = 'histogramLegendActionFilterOut'; +export const ACTION_ID = 'embeddable_filterOut'; -export const createFilterOutHistogramLegendActionFactory = ({ +export const createFilterOutLensAction = ({ store, order, services, @@ -21,8 +21,8 @@ export const createFilterOutHistogramLegendActionFactory = ({ order: number; services: StartServices; }) => - createHistogramFilterLegendActionFactory({ - id: HISTOGRAM_LEGEND_ACTION_FILTER_OUT, + createFilterLensAction({ + id: ACTION_ID, order, store, services, diff --git a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_out_timeline.ts b/x-pack/plugins/security_solution/public/actions/filter/lens/filter_out_timeline.ts deleted file mode 100644 index 1712c94c21b79..0000000000000 --- a/x-pack/plugins/security_solution/public/actions/filter/lens/filter_out_timeline.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { SecurityAppStore } from '../../../common/store'; - -import type { StartServices } from '../../../types'; -import { createHistogramFilterLegendActionFactory } from './helpers'; - -export const TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_OUT = 'timelineHistogramLegendActionFilterOut'; - -export const createTimelineHistogramFilterOutLegendActionFactory = ({ - store, - order, - services, -}: { - store: SecurityAppStore; - order: number; - services: StartServices; -}) => - createHistogramFilterLegendActionFactory({ - id: TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_OUT, - order, - store, - services, - negate: true, - }); diff --git a/x-pack/plugins/security_solution/public/actions/register.ts b/x-pack/plugins/security_solution/public/actions/register.ts index 5aa0794ae9c49..46f37f68f48d1 100644 --- a/x-pack/plugins/security_solution/public/actions/register.ts +++ b/x-pack/plugins/security_solution/public/actions/register.ts @@ -13,12 +13,8 @@ import type { StartServices } from '../types'; import { createFilterInCellActionFactory, createFilterInDiscoverCellActionFactory, - createTimelineHistogramFilterInLegendActionFactory, - createFilterInHistogramLegendActionFactory, createFilterOutCellActionFactory, createFilterOutDiscoverCellActionFactory, - createFilterOutHistogramLegendActionFactory, - createTimelineHistogramFilterOutLegendActionFactory, } from './filter'; import { createAddToTimelineLensAction, @@ -41,7 +37,9 @@ import type { SecurityCellActions, } from './types'; import { enhanceActionWithTelemetry } from './telemetry'; -import { registerDiscoverHistogramActions } from './discover_in_timeline/vis_apply_filter'; +import { registerDiscoverHistogramActions } from './register_discover_histogram_actions'; +import { createFilterInLensAction } from './filter/lens/filter_in'; +import { createFilterOutLensAction } from './filter/lens/filter_out'; export const registerUIActions = ( store: SecurityAppStore, @@ -51,45 +49,24 @@ export const registerUIActions = ( registerLensEmbeddableActions(store, services); registerDiscoverCellActions(store, services); registerCellActions(store, history, services); + // TODO: Remove discover histogram actions when timeline esql tab is extracted from discover registerDiscoverHistogramActions(store, history, services); }; const registerLensEmbeddableActions = (store: SecurityAppStore, services: StartServices) => { const { uiActions } = services; + const filterInLegendActions = createFilterInLensAction({ store, order: 2, services }); + uiActions.addTriggerAction(CELL_VALUE_TRIGGER, filterInLegendActions); + + const filterOutLegendActions = createFilterOutLensAction({ store, order: 3, services }); + uiActions.addTriggerAction(CELL_VALUE_TRIGGER, filterOutLegendActions); + const addToTimelineAction = createAddToTimelineLensAction({ store, order: 4 }); uiActions.addTriggerAction(CELL_VALUE_TRIGGER, addToTimelineAction); const copyToClipboardAction = createCopyToClipboardLensAction({ order: 5 }); uiActions.addTriggerAction(CELL_VALUE_TRIGGER, copyToClipboardAction); - - const filterInTimelineLegendActions = createTimelineHistogramFilterInLegendActionFactory({ - store, - order: 0, - services, - }); - uiActions.addTriggerAction(CELL_VALUE_TRIGGER, filterInTimelineLegendActions); - - const filterOutTimelineLegendActions = createTimelineHistogramFilterOutLegendActionFactory({ - store, - order: 1, - services, - }); - uiActions.addTriggerAction(CELL_VALUE_TRIGGER, filterOutTimelineLegendActions); - - const filterInLegendActions = createFilterInHistogramLegendActionFactory({ - store, - order: 2, - services, - }); - uiActions.addTriggerAction(CELL_VALUE_TRIGGER, filterInLegendActions); - - const filterOutLegendActions = createFilterOutHistogramLegendActionFactory({ - store, - order: 3, - services, - }); - uiActions.addTriggerAction(CELL_VALUE_TRIGGER, filterOutLegendActions); }; const registerDiscoverCellActions = (store: SecurityAppStore, services: StartServices) => { diff --git a/x-pack/plugins/security_solution/public/actions/discover_in_timeline/vis_apply_filter.ts b/x-pack/plugins/security_solution/public/actions/register_discover_histogram_actions.ts similarity index 88% rename from x-pack/plugins/security_solution/public/actions/discover_in_timeline/vis_apply_filter.ts rename to x-pack/plugins/security_solution/public/actions/register_discover_histogram_actions.ts index 8c3f9e0214a63..5235cef932e4f 100644 --- a/x-pack/plugins/security_solution/public/actions/discover_in_timeline/vis_apply_filter.ts +++ b/x-pack/plugins/security_solution/public/actions/register_discover_histogram_actions.ts @@ -7,9 +7,9 @@ import { createFilterAction } from '@kbn/unified-search-plugin/public'; import type { History } from 'history'; -import type { SecurityAppStore } from '../../common/store'; -import type { StartServices } from '../../types'; -import { EsqlInTimelineTrigger, EsqlInTimelineAction } from '../constants'; +import type { SecurityAppStore } from '../common/store'; +import type { StartServices } from '../types'; +import { EsqlInTimelineTrigger, EsqlInTimelineAction } from './constants'; const createDiscoverHistogramCustomFilterAction = ( store: SecurityAppStore, diff --git a/x-pack/plugins/security_solution/public/app/index.tsx b/x-pack/plugins/security_solution/public/app/index.tsx index 6f0fc3eb8d01c..3053590ae3d91 100644 --- a/x-pack/plugins/security_solution/public/app/index.tsx +++ b/x-pack/plugins/security_solution/public/app/index.tsx @@ -7,7 +7,6 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { SubscriptionTrackingProvider } from '@kbn/subscription-tracking'; import { SecurityApp } from './app'; import type { RenderAppProps } from './types'; import { AppRoutes } from './app_routes'; @@ -21,7 +20,6 @@ export const renderApp = ({ usageCollection, subPluginRoutes, theme$, - subscriptionTrackingServices, }: RenderAppProps): (() => void) => { const ApplicationUsageTrackingProvider = usageCollection?.components.ApplicationUsageTrackingProvider ?? React.Fragment; @@ -34,12 +32,7 @@ export const renderApp = ({ theme$={theme$} > - - - + , element diff --git a/x-pack/plugins/security_solution/public/app/types.ts b/x-pack/plugins/security_solution/public/app/types.ts index 66bab19c945fe..578a4800f7f64 100644 --- a/x-pack/plugins/security_solution/public/app/types.ts +++ b/x-pack/plugins/security_solution/public/app/types.ts @@ -19,7 +19,6 @@ import type { RouteProps } from 'react-router-dom'; import type { AppMountParameters } from '@kbn/core/public'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import type { TableState } from '@kbn/securitysolution-data-table'; -import type { Services as SubscriptionTrackingServices } from '@kbn/subscription-tracking'; import type { ExploreReducer, ExploreState } from '../explore'; import type { StartServices } from '../types'; @@ -30,7 +29,6 @@ export interface RenderAppProps extends AppMountParameters { services: StartServices; store: Store; subPluginRoutes: RouteProps[]; - subscriptionTrackingServices: SubscriptionTrackingServices; usageCollection?: UsageCollectionSetup; } diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx index 3b778013a42d1..d8cfc46ec5a22 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/index.tsx @@ -66,6 +66,8 @@ export const getComments = ({ regenerateMessage(currentConversation.id); }; + const connectorTypeTitle = currentConversation.apiConfig.connectorTypeTitle ?? ''; + const extraLoadingComment = isFetchingResponse ? [ { @@ -75,6 +77,7 @@ export const getComments = ({ children: ( ; regenerateMessage: () => void; transformMessage: (message: string) => ContentMessage; @@ -29,6 +30,7 @@ interface Props { export const StreamComment = ({ amendMessage, content, + connectorTypeTitle, index, isError = false, isFetching = false, @@ -40,6 +42,7 @@ export const StreamComment = ({ const { error, isLoading, isStreaming, pendingMessage, setComplete } = useStream({ amendMessage, content, + connectorTypeTitle, reader, isError, }); diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.test.ts b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.test.ts index 764db1b3990ae..54a5684d20442 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.test.ts +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.test.ts @@ -9,6 +9,8 @@ import { API_ERROR } from '../translations'; import type { PromptObservableState } from './types'; import { Subject } from 'rxjs'; +import { EventStreamCodec } from '@smithy/eventstream-codec'; +import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; describe('getStreamObservable', () => { const mockReader = { read: jest.fn(), @@ -22,29 +24,102 @@ describe('getStreamObservable', () => { beforeEach(() => { jest.clearAllMocks(); }); + it('should emit loading state and chunks for Bedrock', (done) => { + const completeSubject = new Subject(); + const expectedStates: PromptObservableState[] = [ + { chunks: [], loading: true }, + { + // when i log the actual emit, chunks equal to message.split(''); test is wrong + chunks: ['My', ' new', ' message'], + message: 'My', + loading: true, + }, + { + chunks: ['My', ' new', ' message'], + message: 'My new', + loading: true, + }, + { + chunks: ['My', ' new', ' message'], + message: 'My new message', + loading: true, + }, + { + chunks: ['My', ' new', ' message'], + message: 'My new message', + loading: false, + }, + ]; - it('should emit loading state and chunks', (done) => { + mockReader.read + .mockResolvedValueOnce({ + done: false, + value: encodeBedrockResponse('My'), + }) + .mockResolvedValueOnce({ + done: false, + value: encodeBedrockResponse(' new'), + }) + .mockResolvedValueOnce({ + done: false, + value: encodeBedrockResponse(' message'), + }) + .mockResolvedValue({ + done: true, + }); + + const source = getStreamObservable({ + connectorTypeTitle: 'Amazon Bedrock', + isError: false, + reader: typedReader, + setLoading, + }); + const emittedStates: PromptObservableState[] = []; + + source.subscribe({ + next: (state) => { + return emittedStates.push(state); + }, + complete: () => { + expect(emittedStates).toEqual(expectedStates); + done(); + + completeSubject.subscribe({ + next: () => { + expect(setLoading).toHaveBeenCalledWith(false); + expect(typedReader.cancel).toHaveBeenCalled(); + done(); + }, + }); + }, + error: (err) => done(err), + }); + }); + it('should emit loading state and chunks for OpenAI', (done) => { + const chunk1 = `data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"My"}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" new"}}]}`; + const chunk2 = `\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" message"}}]}\ndata: [DONE]`; const completeSubject = new Subject(); const expectedStates: PromptObservableState[] = [ { chunks: [], loading: true }, { - chunks: ['one chunk ', 'another chunk', ''], - message: 'one chunk ', + // when i log the actual emit, chunks equal to message.split(''); test is wrong + chunks: ['My', ' new', ' message'], + message: 'My', loading: true, }, { - chunks: ['one chunk ', 'another chunk', ''], - message: 'one chunk another chunk', + chunks: ['My', ' new', ' message'], + message: 'My new', loading: true, }, { - chunks: ['one chunk ', 'another chunk', ''], - message: 'one chunk another chunk', + chunks: ['My', ' new', ' message'], + message: 'My new message', loading: true, }, { - chunks: ['one chunk ', 'another chunk', ''], - message: 'one chunk another chunk', + chunks: ['My', ' new', ' message'], + message: 'My new message', loading: false, }, ]; @@ -52,11 +127,11 @@ describe('getStreamObservable', () => { mockReader.read .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(`one chunk `)), + value: new Uint8Array(new TextEncoder().encode(chunk1)), }) .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(`another chunk`)), + value: new Uint8Array(new TextEncoder().encode(chunk2)), }) .mockResolvedValueOnce({ done: false, @@ -66,11 +141,91 @@ describe('getStreamObservable', () => { done: true, }); - const source = getStreamObservable(typedReader, setLoading, false); + const source = getStreamObservable({ + connectorTypeTitle: 'OpenAI', + isError: false, + reader: typedReader, + setLoading, + }); const emittedStates: PromptObservableState[] = []; source.subscribe({ - next: (state) => emittedStates.push(state), + next: (state) => { + return emittedStates.push(state); + }, + complete: () => { + expect(emittedStates).toEqual(expectedStates); + done(); + + completeSubject.subscribe({ + next: () => { + expect(setLoading).toHaveBeenCalledWith(false); + expect(typedReader.cancel).toHaveBeenCalled(); + done(); + }, + }); + }, + error: (err) => done(err), + }); + }); + it('should emit loading state and chunks for partial response OpenAI', (done) => { + const chunk1 = `data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"My"}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" new"`; + const chunk2 = `}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" message"}}]}\ndata: [DONE]`; + const completeSubject = new Subject(); + const expectedStates: PromptObservableState[] = [ + { chunks: [], loading: true }, + { + // when i log the actual emit, chunks equal to message.split(''); test is wrong + chunks: ['My', ' new', ' message'], + message: 'My', + loading: true, + }, + { + chunks: ['My', ' new', ' message'], + message: 'My new', + loading: true, + }, + { + chunks: ['My', ' new', ' message'], + message: 'My new message', + loading: true, + }, + { + chunks: ['My', ' new', ' message'], + message: 'My new message', + loading: false, + }, + ]; + + mockReader.read + .mockResolvedValueOnce({ + done: false, + value: new Uint8Array(new TextEncoder().encode(chunk1)), + }) + .mockResolvedValueOnce({ + done: false, + value: new Uint8Array(new TextEncoder().encode(chunk2)), + }) + .mockResolvedValueOnce({ + done: false, + value: new Uint8Array(new TextEncoder().encode('')), + }) + .mockResolvedValue({ + done: true, + }); + + const source = getStreamObservable({ + connectorTypeTitle: 'OpenAI', + isError: false, + reader: typedReader, + setLoading, + }); + const emittedStates: PromptObservableState[] = []; + + source.subscribe({ + next: (state) => { + return emittedStates.push(state); + }, complete: () => { expect(emittedStates).toEqual(expectedStates); done(); @@ -112,7 +267,12 @@ describe('getStreamObservable', () => { done: true, }); - const source = getStreamObservable(typedReader, setLoading, true); + const source = getStreamObservable({ + connectorTypeTitle: 'OpenAI', + isError: true, + reader: typedReader, + setLoading, + }); const emittedStates: PromptObservableState[] = []; source.subscribe({ @@ -138,7 +298,12 @@ describe('getStreamObservable', () => { const error = new Error('Test Error'); // Simulate an error mockReader.read.mockRejectedValue(error); - const source = getStreamObservable(typedReader, setLoading, false); + const source = getStreamObservable({ + connectorTypeTitle: 'OpenAI', + isError: false, + reader: typedReader, + setLoading, + }); source.subscribe({ next: (state) => {}, @@ -157,3 +322,16 @@ describe('getStreamObservable', () => { }); }); }); + +function encodeBedrockResponse(completion: string) { + return new EventStreamCodec(toUtf8, fromUtf8).encode({ + headers: {}, + body: Uint8Array.from( + Buffer.from( + JSON.stringify({ + bytes: Buffer.from(JSON.stringify({ completion })).toString('base64'), + }) + ) + ), + }); +} diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.ts b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.ts index b30be69b82cae..e8d815525a94b 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.ts +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/stream_observable.ts @@ -7,10 +7,18 @@ import { concatMap, delay, finalize, Observable, of, scan, timestamp } from 'rxjs'; import type { Dispatch, SetStateAction } from 'react'; -import { API_ERROR } from '../translations'; +import { EventStreamCodec } from '@smithy/eventstream-codec'; +import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; import type { PromptObservableState } from './types'; +import { API_ERROR } from '../translations'; const MIN_DELAY = 35; +interface StreamObservable { + connectorTypeTitle: string; + reader: ReadableStreamDefaultReader; + setLoading: Dispatch>; + isError: boolean; +} /** * Returns an Observable that reads data from a ReadableStream and emits values representing the state of the data processing. * @@ -19,52 +27,156 @@ const MIN_DELAY = 35; * @param isError - indicates whether the reader response is an error message or not * @returns {Observable} An Observable that emits PromptObservableState */ -export const getStreamObservable = ( - reader: ReadableStreamDefaultReader, - setLoading: Dispatch>, - isError: boolean -): Observable => +export const getStreamObservable = ({ + connectorTypeTitle, + isError, + reader, + setLoading, +}: StreamObservable): Observable => new Observable((observer) => { observer.next({ chunks: [], loading: true }); const decoder = new TextDecoder(); const chunks: string[] = []; - function read() { + // Initialize an empty string to store the OpenAI buffer. + let openAIBuffer: string = ''; + + // Initialize an empty Uint8Array to store the Bedrock concatenated buffer. + let bedrockBuffer: Uint8Array = new Uint8Array(0); + function readOpenAI() { reader .read() .then(({ done, value }: { done: boolean; value?: Uint8Array }) => { try { if (done) { + if (openAIBuffer) { + chunks.push(getOpenAIChunks([openAIBuffer])[0]); + } observer.next({ chunks, - message: getMessageFromChunks(chunks), + message: chunks.join(''), loading: false, }); observer.complete(); return; } + const decoded = decoder.decode(value); - const content = isError - ? // we format errors as {message: string; status_code: number} - `${API_ERROR}\n\n${JSON.parse(decoded).message}` - : // all other responses are just strings (handled by subaction invokeStream) - decoded; - chunks.push(content); - observer.next({ - chunks, - message: getMessageFromChunks(chunks), - loading: true, + let nextChunks; + if (isError) { + nextChunks = [`${API_ERROR}\n\n${JSON.parse(decoded).message}`]; + } else { + const lines = decoded.split('\n'); + lines[0] = openAIBuffer + lines[0]; + openAIBuffer = lines.pop() || ''; + nextChunks = getOpenAIChunks(lines); + } + nextChunks.forEach((chunk: string) => { + chunks.push(chunk); + observer.next({ + chunks, + message: chunks.join(''), + loading: true, + }); }); } catch (err) { observer.error(err); return; } - read(); + readOpenAI(); + }) + .catch((err) => { + observer.error(err); + }); + } + function readBedrock() { + reader + .read() + .then(({ done, value }: { done: boolean; value?: Uint8Array }) => { + try { + console.log('reading', { done, value }); + if (done) { + observer.next({ + chunks, + message: chunks.join(''), + loading: false, + }); + observer.complete(); + return; + } + + let content; + if (isError) { + content = `${API_ERROR}\n\n${JSON.parse(decoder.decode(value)).message}`; + chunks.push(content); + observer.next({ + chunks, + message: chunks.join(''), + loading: true, + }); + } else if (value != null) { + const chunk: Uint8Array = value; + + // Concatenate the current chunk to the existing buffer. + bedrockBuffer = concatChunks(bedrockBuffer, chunk); + // Get the length of the next message in the buffer. + let messageLength = getMessageLength(bedrockBuffer); + + // Initialize an array to store fully formed message chunks. + const buildChunks = []; + // Process the buffer until no complete messages are left. + while (bedrockBuffer.byteLength > 0 && bedrockBuffer.byteLength >= messageLength) { + // Extract a chunk of the specified length from the buffer. + const extractedChunk = bedrockBuffer.slice(0, messageLength); + // Add the extracted chunk to the array of fully formed message chunks. + buildChunks.push(extractedChunk); + // Remove the processed chunk from the buffer. + bedrockBuffer = bedrockBuffer.slice(messageLength); + // Get the length of the next message in the updated buffer. + messageLength = getMessageLength(bedrockBuffer); + } + + const awsDecoder = new EventStreamCodec(toUtf8, fromUtf8); + // Decode and parse each message chunk, extracting the 'completion' property. + buildChunks.forEach((bChunk) => { + const event = awsDecoder.decode(bChunk); + const body = JSON.parse( + Buffer.from(JSON.parse(decoder.decode(event.body)).bytes, 'base64').toString() + ); + content = body.completion; + chunks.push(content); + observer.next({ + chunks, + message: chunks.join(''), + loading: true, + }); + }); + } + } catch (err) { + observer.error(err); + return; + } + readBedrock(); }) .catch((err) => { observer.error(err); }); } - read(); + // this should never actually happen + function badConnector() { + observer.next({ + chunks: [ + `Invalid connector type - ${connectorTypeTitle} is not a supported GenAI connector.`, + ], + message: `Invalid connector type - ${connectorTypeTitle} is not a supported GenAI connector.`, + loading: false, + }); + observer.complete(); + } + + if (connectorTypeTitle === 'Amazon Bedrock') readBedrock(); + else if (connectorTypeTitle === 'OpenAI') readOpenAI(); + else badConnector(); + return () => { reader.cancel(); }; @@ -99,8 +211,55 @@ export const getStreamObservable = ( finalize(() => setLoading(false)) ); -function getMessageFromChunks(chunks: string[]) { - return chunks.join(''); +/** + * Parses an OpenAI response from a string. + * @param lines + * @returns {string[]} - Parsed string array from the OpenAI response. + */ +const getOpenAIChunks = (lines: string[]): string[] => { + const nextChunk = lines + .map((str) => str.substring(6)) + .filter((str) => !!str && str !== '[DONE]') + .map((line) => { + try { + const openaiResponse = JSON.parse(line); + return openaiResponse.choices[0]?.delta.content ?? ''; + } catch (err) { + return ''; + } + }); + return nextChunk; +}; + +/** + * Concatenates two Uint8Array buffers. + * + * @param {Uint8Array} a - First buffer. + * @param {Uint8Array} b - Second buffer. + * @returns {Uint8Array} - Concatenated buffer. + */ +function concatChunks(a: Uint8Array, b: Uint8Array): Uint8Array { + const newBuffer = new Uint8Array(a.length + b.length); + // Copy the contents of the first buffer to the new buffer. + newBuffer.set(a); + // Copy the contents of the second buffer to the new buffer starting from the end of the first buffer. + newBuffer.set(b, a.length); + return newBuffer; +} + +/** + * Gets the length of the next message from the buffer. + * + * @param {Uint8Array} buffer - Buffer containing the message. + * @returns {number} - Length of the next message. + */ +function getMessageLength(buffer: Uint8Array): number { + // If the buffer is empty, return 0. + if (buffer.byteLength === 0) return 0; + // Create a DataView to read the Uint32 value at the beginning of the buffer. + const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength); + // Read and return the Uint32 value (message length). + return view.getUint32(0, false); } export const getPlaceholderObservable = () => new Observable(); diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx index efbc61999f2cc..c4f99884aa045 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.test.tsx @@ -11,20 +11,22 @@ import { useStream } from './use_stream'; const amendMessage = jest.fn(); const reader = jest.fn(); const cancel = jest.fn(); +const chunk1 = `data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"My"}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" new"}}]}`; +const chunk2 = `\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" message"}}]}\ndata: [DONE]`; const readerComplete = { read: reader .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode('one chunk ')), + value: new Uint8Array(new TextEncoder().encode(chunk1)), }) .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(`another chunk`)), + value: new Uint8Array(new TextEncoder().encode(chunk2)), }) .mockResolvedValueOnce({ done: false, - value: new Uint8Array(new TextEncoder().encode(``)), + value: new Uint8Array(new TextEncoder().encode('')), }) .mockResolvedValue({ done: true, @@ -34,7 +36,12 @@ const readerComplete = { closed: jest.fn().mockResolvedValue(true), } as unknown as ReadableStreamDefaultReader; -const defaultProps = { amendMessage, reader: readerComplete, isError: false }; +const defaultProps = { + amendMessage, + reader: readerComplete, + isError: false, + connectorTypeTitle: 'OpenAI', +}; describe('useStream', () => { beforeEach(() => { jest.clearAllMocks(); @@ -57,7 +64,7 @@ describe('useStream', () => { error: undefined, isLoading: true, isStreaming: true, - pendingMessage: 'one chunk ', + pendingMessage: 'My', setComplete: expect.any(Function), }); }); @@ -67,7 +74,7 @@ describe('useStream', () => { error: undefined, isLoading: false, isStreaming: false, - pendingMessage: 'one chunk another chunk', + pendingMessage: 'My new message', setComplete: expect.any(Function), }); }); diff --git a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.tsx b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.tsx index 7de06589f87c7..9271758a8558e 100644 --- a/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.tsx +++ b/x-pack/plugins/security_solution/public/assistant/get_comments/stream/use_stream.tsx @@ -7,13 +7,13 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import type { Subscription } from 'rxjs'; -import { share } from 'rxjs'; import { getPlaceholderObservable, getStreamObservable } from './stream_observable'; interface UseStreamProps { amendMessage: (message: string) => void; isError: boolean; content?: string; + connectorTypeTitle: string; reader?: ReadableStreamDefaultReader; } interface UseStream { @@ -39,6 +39,7 @@ interface UseStream { export const useStream = ({ amendMessage, content, + connectorTypeTitle, reader, isError, }: UseStreamProps): UseStream => { @@ -49,9 +50,9 @@ export const useStream = ({ const observer$ = useMemo( () => content == null && reader != null - ? getStreamObservable(reader, setLoading, isError) + ? getStreamObservable({ connectorTypeTitle, reader, setLoading, isError }) : getPlaceholderObservable(), - [content, isError, reader] + [content, isError, reader, connectorTypeTitle] ); const onCompleteStream = useCallback(() => { subscription?.unsubscribe(); @@ -66,7 +67,7 @@ export const useStream = ({ } }, [complete, onCompleteStream]); useEffect(() => { - const newSubscription = observer$.pipe(share()).subscribe({ + const newSubscription = observer$.subscribe({ next: ({ message, loading: isLoading }) => { setLoading(isLoading); setPendingMessage(message); diff --git a/x-pack/plugins/security_solution/public/assistant/helpers.tsx b/x-pack/plugins/security_solution/public/assistant/helpers.tsx index beca67f55eeb4..821bb927d5031 100644 --- a/x-pack/plugins/security_solution/public/assistant/helpers.tsx +++ b/x-pack/plugins/security_solution/public/assistant/helpers.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiIcon, EuiToolTip } from '@elastic/eui'; +import { EuiIcon } from '@elastic/eui'; import { analyzeMarkdown } from '@kbn/elastic-assistant'; import type { Conversation, CodeBlockDetails } from '@kbn/elastic-assistant'; import React from 'react'; @@ -13,7 +13,6 @@ import React from 'react'; import type { TimelineEventsDetailsItem } from '../../common/search_strategy'; import type { Rule } from '../detection_engine/rule_management/logic'; import { SendToTimelineButton } from './send_to_timeline'; -import { INVESTIGATE_IN_TIMELINE } from '../actions/add_to_timeline/constants'; export const LOCAL_STORAGE_KEY = `securityAssistant`; @@ -125,9 +124,7 @@ export const augmentMessageCodeBlocks = ( ]} keepDataView={true} > - - - + ) : null, }; diff --git a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx index 3bd29dc53edae..114d5deb5f3ec 100644 --- a/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/assistant/send_to_timeline/index.tsx @@ -6,10 +6,11 @@ */ import React, { useCallback, useMemo } from 'react'; -import { EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { EuiButton, EuiButtonEmpty, EuiToolTip } from '@elastic/eui'; import type { Filter } from '@kbn/es-query'; import { useDispatch } from 'react-redux'; +import { useAssistantContext } from '@kbn/elastic-assistant'; import { useDeepEqualSelector } from '../../common/hooks/use_selector'; import { sourcererSelectors } from '../../common/store'; import { sourcererActions } from '../../common/store/actions'; @@ -19,7 +20,10 @@ import type { TimeRange } from '../../common/store/inputs/model'; import { SourcererScopeName } from '../../common/store/sourcerer/model'; import { TimelineTabs, TimelineId } from '../../../common/types/timeline'; import { TimelineType } from '../../../common/api/timeline'; -import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../detections/components/alerts_table/translations'; +import { + ACTION_CANNOT_INVESTIGATE_IN_TIMELINE, + ACTION_INVESTIGATE_IN_TIMELINE, +} from '../../detections/components/alerts_table/translations'; import type { DataProvider } from '../../timelines/components/timeline/data_providers/data_provider'; import { useCreateTimeline } from '../../timelines/components/timeline/properties/use_create_timeline'; import { @@ -31,6 +35,7 @@ import { updateEqlOptions, } from '../../timelines/store/timeline/actions'; import { useDiscoverInTimelineContext } from '../../common/components/discover_in_timeline/use_discover_in_timeline_context'; +import { useShowTimeline } from '../../common/utils/timeline/use_show_timeline'; export interface SendToTimelineButtonProps { asEmptyButton: boolean; @@ -51,7 +56,8 @@ export const SendToTimelineButton: React.FunctionComponent { const dispatch = useDispatch(); - + const { showAssistantOverlay } = useAssistantContext(); + const [isTimelineBottomBarVisible] = useShowTimeline(); const { discoverStateContainer } = useDiscoverInTimelineContext(); const getDataViewsSelector = useMemo( @@ -71,13 +77,15 @@ export const SendToTimelineButton: React.FunctionComponent { + // Hide the assistant overlay so timeline can be seen (noop if using assistant in timeline) + showAssistantOverlay({ showOverlay: false }); + if (dataProviders || filters) { // If esql, don't reset filters or mess with dataview & time range if (dataProviders?.[0]?.queryType === 'esql' || dataProviders?.[0]?.queryType === 'sql') { discoverStateContainer.current?.appState.update({ query: { - query: dataProviders[0].kqlQuery, - language: 'esql', + esql: dataProviders[0].kqlQuery, }, }); @@ -200,6 +208,7 @@ export const SendToTimelineButton: React.FunctionComponent - {children} + + <>{children} + ) : ( - {children} + + <>{children} + ); }; diff --git a/x-pack/plugins/security_solution/public/cases/pages/index.tsx b/x-pack/plugins/security_solution/public/cases/pages/index.tsx index 041fd9378382e..dd639862e2812 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/index.tsx @@ -11,7 +11,7 @@ import type { CaseViewRefreshPropInterface } from '@kbn/cases-plugin/common'; import { CaseMetricsFeature } from '@kbn/cases-plugin/common'; import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; -import { RightPanelKey } from '../../flyout/document_details/right'; +import { DocumentDetailsRightPanelKey } from '../../flyout/document_details/right'; import { useTourContext } from '../../common/components/guided_onboarding_tour'; import { AlertsCasesTourSteps, @@ -74,7 +74,7 @@ const CaseContainerComponent: React.FC = () => { if (isSecurityFlyoutEnabled) { openFlyout({ right: { - id: RightPanelKey, + id: DocumentDetailsRightPanelKey, params: { id: alertId, indexName: index, diff --git a/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx b/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx index ca82da005c703..93a29b9ea4436 100644 --- a/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/control_columns/row_action/index.tsx @@ -13,7 +13,7 @@ import { dataTableActions, TableId } from '@kbn/securitysolution-data-table'; import { useUiSetting$ } from '@kbn/kibana-react-plugin/public'; import { timelineActions } from '../../../../timelines/store/timeline'; import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '../../../../../common/constants'; -import { RightPanelKey } from '../../../../flyout/document_details/right'; +import { DocumentDetailsRightPanelKey } from '../../../../flyout/document_details/right'; import type { SetEventsDeleted, SetEventsLoading, @@ -24,6 +24,7 @@ import { getMappedNonEcsValue } from '../../../../timelines/components/timeline/ import type { TimelineItem, TimelineNonEcsData } from '../../../../../common/search_strategy'; import type { ColumnHeaderOptions, OnRowSelected } from '../../../../../common/types/timeline'; import { TimelineId } from '../../../../../common/types'; +import { useIsExperimentalFeatureEnabled } from '../../../hooks/use_experimental_features'; type Props = EuiDataGridCellValueElementProps & { columnHeaders: ColumnHeaderOptions[]; @@ -73,6 +74,9 @@ const RowActionComponent = ({ const dispatch = useDispatch(); const [isSecurityFlyoutEnabled] = useUiSetting$(ENABLE_EXPANDABLE_FLYOUT_SETTING); + const isExpandableFlyoutInCreateRuleEnabled = useIsExperimentalFeatureEnabled( + 'expandableFlyoutInCreateRuleEnabled' + ); const columnValues = useMemo( () => @@ -89,6 +93,13 @@ const RowActionComponent = ({ [columnHeaders, timelineNonEcsData] ); + let showExpandableFlyout: boolean; + if (tableId === TableId.rulePreview) { + showExpandableFlyout = isSecurityFlyoutEnabled && isExpandableFlyoutInCreateRuleEnabled; + } else { + showExpandableFlyout = isSecurityFlyoutEnabled; + } + const handleOnEventDetailPanelOpened = useCallback(() => { const updatedExpandedDetail: ExpandedDetailType = { panelView: 'eventDetail', @@ -98,12 +109,10 @@ const RowActionComponent = ({ }, }; - // TODO remove when https://github.com/elastic/security-team/issues/7760 is merged - // excluding rule preview page as some sections in new flyout are not applicable when user is creating a new rule - if (isSecurityFlyoutEnabled && tableId !== TableId.rulePreview) { + if (showExpandableFlyout) { openFlyout({ right: { - id: RightPanelKey, + id: DocumentDetailsRightPanelKey, params: { id: eventId, indexName, @@ -133,7 +142,7 @@ const RowActionComponent = ({ }) ); } - }, [dispatch, eventId, indexName, isSecurityFlyoutEnabled, openFlyout, tabType, tableId]); + }, [dispatch, eventId, indexName, openFlyout, tabType, tableId, showExpandableFlyout]); const Action = controlColumn.rowCellRender; diff --git a/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx b/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx index 2d676dbfb666b..55b65f6f4683c 100644 --- a/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx +++ b/x-pack/plugins/security_solution/public/common/components/discover_in_timeline/use_discover_in_timeline_actions.tsx @@ -134,7 +134,7 @@ export const useDiscoverInTimelineActions = ( * */ const resetDiscoverAppState = useCallback(async () => { const defaultDiscoverAppState = await getDefaultDiscoverAppState(); - discoverStateContainer.current?.appState.set(defaultDiscoverAppState); + discoverStateContainer.current?.appState.replaceUrlState(defaultDiscoverAppState); discoverStateContainer.current?.globalState.set({ ...discoverStateContainer.current?.globalState.get(), time: defaultDiscoverTimeRange, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_upsell.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_upsell.tsx index 303e55ff66b97..10a9c872e3911 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_upsell.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_upsell.tsx @@ -6,17 +6,11 @@ */ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiText } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, EuiText } from '@elastic/eui'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import { SubscriptionLink } from '@kbn/subscription-tracking'; -import type { SubscriptionContextData } from '@kbn/subscription-tracking'; import { INSIGHTS_UPSELL } from './translations'; - -const subscriptionContext: SubscriptionContextData = { - feature: 'alert-details-insights', - source: 'security__alert-details-flyout', -}; +import { useKibana } from '../../../lib/kibana'; const UpsellContainer = euiStyled.div` border: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; @@ -29,6 +23,7 @@ const StyledIcon = euiStyled(EuiIcon)` `; export const RelatedAlertsUpsell = React.memo(() => { + const { application } = useKibana().services; return ( @@ -37,13 +32,15 @@ export const RelatedAlertsUpsell = React.memo(() => { - {INSIGHTS_UPSELL} - + diff --git a/x-pack/plugins/security_solution/public/common/components/landing_page/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/landing_page/index.test.tsx index 968899a1e84d3..9d676016be252 100644 --- a/x-pack/plugins/security_solution/public/common/components/landing_page/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/landing_page/index.test.tsx @@ -7,51 +7,22 @@ import React from 'react'; import { render } from '@testing-library/react'; import { LandingPageComponent } from '.'; -import { useKibana } from '../../lib/kibana'; -import { Router } from 'react-router-dom'; -import { createBrowserHistory } from 'history'; -import { TestProviders } from '../../mock/test_providers'; -jest.mock('../../lib/kibana', () => ({ - useKibana: jest.fn(), +const mockUseContractComponents = jest.fn(() => ({})); +jest.mock('../../hooks/use_contract_component', () => ({ + useContractComponents: () => mockUseContractComponents(), })); -jest.mock('react-use/lib/useObservable', () => jest.fn((component) => component)); - describe('LandingPageComponent', () => { - const mockGetComponent = jest.fn(); - const history = createBrowserHistory(); - const mockSecuritySolutionTemplateWrapper = jest - .fn() - .mockImplementation(({ children }) =>
    {children}
    ); - - const renderPage = () => - render( - - - , - { wrapper: TestProviders } - ); - - beforeAll(() => { - (useKibana as jest.Mock).mockReturnValue({ - services: { - securityLayout: { - getPluginWrapper: jest.fn().mockReturnValue(mockSecuritySolutionTemplateWrapper), - }, - getComponent$: mockGetComponent, - }, - }); - }); - beforeEach(() => { jest.clearAllMocks(); }); it('renders the get started component', () => { - mockGetComponent.mockReturnValue(
    ); - const { queryByTestId } = renderPage(); + const GetStarted = () =>
    ; + mockUseContractComponents.mockReturnValue({ GetStarted }); + const { queryByTestId } = render(); - expect(queryByTestId('get-started')).toBeInTheDocument(); + expect(queryByTestId('get-started-mock')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/landing_page/index.tsx b/x-pack/plugins/security_solution/public/common/components/landing_page/index.tsx index d8e1a9029e212..959827aec3ba4 100644 --- a/x-pack/plugins/security_solution/public/common/components/landing_page/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/landing_page/index.tsx @@ -6,13 +6,11 @@ */ import React, { memo } from 'react'; -import useObservable from 'react-use/lib/useObservable'; -import { useKibana } from '../../lib/kibana'; +import { useContractComponents } from '../../hooks/use_contract_component'; export const LandingPageComponent = memo(() => { - const { getComponent$ } = useKibana().services; - const GetStartedComponent = useObservable(getComponent$('getStarted')); - return <>{GetStartedComponent}; + const { GetStarted } = useContractComponents(); + return GetStarted ? : null; }); LandingPageComponent.displayName = 'LandingPageComponent'; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_summary.test.ts.snap b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_summary.test.ts.snap new file mode 100644 index 0000000000000..225ff3ef8c7a0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/__snapshots__/risk_score_summary.test.ts.snap @@ -0,0 +1,180 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`getRiskScoreSummaryAttributes should render 1`] = ` +Object { + "description": "", + "references": Array [], + "state": Object { + "adHocDataViews": Object { + "2cc5663b-f062-43f8-8688-fc8166c2ca8e": Object { + "allowNoIndex": false, + "fieldAttrs": Object {}, + "fieldFormats": Object {}, + "id": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "name": "risk-score.risk-score-default", + "runtimeFieldMap": Object {}, + "sourceFilters": Array [], + "timeFieldName": "@timestamp", + "title": "risk-score.risk-score-default", + }, + }, + "datasourceStates": Object { + "formBased": Object { + "layers": Object { + "2cc5663b-f062-43f8-8688-fc8166c2ca8e": Object { + "columnOrder": Array [ + "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + ], + "columns": Object { + "2cc5663b-f062-43f8-8688-fc8166c2ca8e": Object { + "customLabel": true, + "dataType": "number", + "filter": Object { + "language": "kuery", + "query": "", + }, + "isBucketed": false, + "label": "Risk value", + "operationType": "last_value", + "params": Object { + "format": Object { + "id": "number", + "params": Object { + "compact": false, + "decimals": 0, + }, + }, + "sortField": "@timestamp", + }, + "reducedTimeRange": "", + "scale": "ratio", + "sourceField": "user.risk.calculated_score_norm", + "timeShift": "", + }, + }, + "ignoreGlobalFilters": false, + "incompleteColumns": Object {}, + "linkToLayers": Array [ + "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + ], + "sampling": 1, + }, + }, + }, + "indexpattern": Object { + "layers": Object {}, + }, + "textBased": Object { + "layers": Object {}, + }, + }, + "filters": Array [ + Object { + "meta": Object { + "alias": null, + "disabled": false, + "key": "host.id", + "negate": false, + "params": Object { + "query": "123", + }, + "type": "phrase", + }, + "query": Object { + "match_phrase": Object { + "host.id": "123", + }, + }, + }, + ], + "internalReferences": Array [ + Object { + "id": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "name": "indexpattern-datasource-layer-2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "type": "index-pattern", + }, + Object { + "id": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "name": "indexpattern-datasource-layer-2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "type": "index-pattern", + }, + ], + "query": Object { + "language": "kql", + "query": "host.name: *", + }, + "visualization": Object { + "layerId": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "layerType": "data", + "metricAccessor": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "palette": Object { + "name": "custom", + "params": Object { + "colorStops": Array [ + Object { + "color": "#98a2b3", + "stop": 0, + }, + Object { + "color": "#54B399", + "stop": 20, + }, + Object { + "color": "#D6BF57", + "stop": 40, + }, + Object { + "color": "#DA8B45", + "stop": 70, + }, + Object { + "color": "#E7664C", + "stop": 90, + }, + ], + "continuity": "above", + "maxSteps": 5, + "name": "custom", + "progression": "fixed", + "rangeMax": null, + "rangeMin": 0, + "rangeType": "number", + "reverse": false, + "steps": 3, + "stops": Array [ + Object { + "color": "#98a2b3", + "stop": 20, + }, + Object { + "color": "#54B399", + "stop": 40, + }, + Object { + "color": "#D6BF57", + "stop": 70, + }, + Object { + "color": "#DA8B45", + "stop": 90, + }, + Object { + "color": "#E7664C", + "stop": 100, + }, + ], + }, + "type": "palette", + }, + "subtitle": "Low", + "trendlineLayerId": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "trendlineLayerType": "metricTrendline", + "trendlineMetricAccessor": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + "trendlineTimeAccessor": "2cc5663b-f062-43f8-8688-fc8166c2ca8e", + }, + }, + "title": "Risk score summary", + "visualizationType": "lnsMetric", +} +`; diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.test.ts new file mode 100644 index 0000000000000..4e3aaa69129fc --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.test.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RiskScoreEntity } from '../../../../../../../common/risk_engine'; +import { renderHook } from '@testing-library/react-hooks'; +import { wrapper } from '../../../mocks'; +import { useLensAttributes } from '../../../use_lens_attributes'; +import { getRiskScoreSummaryAttributes } from './risk_score_summary'; +import { RiskSeverity } from '../../../../../../../common/search_strategy'; +import type { MetricVisualizationState } from '@kbn/lens-plugin/public'; + +jest.mock('../../../../../containers/sourcerer', () => ({ + useSourcererDataView: jest.fn().mockReturnValue({ + selectedPatterns: ['auditbeat-mytest-*'], + dataViewId: 'security-solution-my-test', + indicesExist: true, + }), +})); + +jest.mock('uuid', () => ({ + v4: jest.fn().mockReturnValue('2cc5663b-f062-43f8-8688-fc8166c2ca8e'), +})); + +describe('getRiskScoreSummaryAttributes', () => { + it('should render', () => { + const { result } = renderHook( + () => + useLensAttributes({ + lensAttributes: getRiskScoreSummaryAttributes({ + severity: RiskSeverity.low, + query: `user.name: test.user`, + spaceId: 'default', + riskEntity: RiskScoreEntity.user, + }), + }), + { wrapper } + ); + + expect(result?.current).toMatchSnapshot(); + }); + + it('renders the subtitle', () => { + const { result } = renderHook( + () => + useLensAttributes({ + lensAttributes: getRiskScoreSummaryAttributes({ + severity: RiskSeverity.low, + query: `user.name: test.user`, + spaceId: 'default', + riskEntity: RiskScoreEntity.user, + }), + }), + { wrapper } + ); + + expect((result?.current?.state.visualization as MetricVisualizationState).subtitle).toBe('Low'); + }); + + it('renders the query when applyGlobalQueriesAndFilters is false', () => { + const query = `test.field: test.user`; + + const { result } = renderHook( + () => + useLensAttributes({ + lensAttributes: getRiskScoreSummaryAttributes({ + severity: RiskSeverity.low, + query, + spaceId: 'default', + riskEntity: RiskScoreEntity.user, + }), + applyGlobalQueriesAndFilters: false, + }), + { wrapper } + ); + + expect(result?.current?.state.query.query).toBe(query); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.ts new file mode 100644 index 0000000000000..728c6e1771373 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary.ts @@ -0,0 +1,193 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { + SEVERITY_UI_SORT_ORDER, + RISK_SEVERITY_COLOUR, + RISK_SCORE_RANGES, +} from '../../../../../../entity_analytics/common/utils'; +import type { RiskSeverity } from '../../../../../../../common/search_strategy'; +import { RiskScoreEntity, RiskScoreFields } from '../../../../../../../common/search_strategy'; +import type { LensAttributes } from '../../../types'; + +interface GetRiskScoreSummaryAttributesProps { + query?: string; + spaceId?: string; + severity?: RiskSeverity; + riskEntity: RiskScoreEntity; +} + +export const getRiskScoreSummaryAttributes: ( + props: GetRiskScoreSummaryAttributesProps +) => LensAttributes = ({ spaceId, query, severity, riskEntity }) => { + const layerIds = [uuidv4(), uuidv4()]; + const internalReferenceId = uuidv4(); + const columnIds = [uuidv4(), uuidv4(), uuidv4()]; + const sourceField = + riskEntity === RiskScoreEntity.user + ? RiskScoreFields.userRiskScore + : RiskScoreFields.hostRiskScore; + + return { + title: 'Risk score summary', + description: '', + visualizationType: 'lnsMetric', + state: { + visualization: { + layerId: layerIds[0], + layerType: 'data', + metricAccessor: columnIds[0], + trendlineLayerId: layerIds[1], + trendlineLayerType: 'metricTrendline', + trendlineTimeAccessor: columnIds[1], + trendlineMetricAccessor: columnIds[2], + palette: { + type: 'palette', + name: 'custom', + params: { + steps: 3, + name: 'custom', + reverse: false, + rangeType: 'number', + rangeMin: 0, + rangeMax: null, + progression: 'fixed', + colorStops: SEVERITY_UI_SORT_ORDER.map((riskSeverity) => ({ + color: RISK_SEVERITY_COLOUR[riskSeverity], + stop: RISK_SCORE_RANGES[riskSeverity].start, + })), + stops: SEVERITY_UI_SORT_ORDER.map((riskSeverity) => ({ + color: RISK_SEVERITY_COLOUR[riskSeverity], + stop: RISK_SCORE_RANGES[riskSeverity].stop, + })), + continuity: 'above', + maxSteps: 5, + }, + }, + subtitle: severity, + }, + query: { + query: query ?? '', + language: 'kuery', + }, + filters: [], + datasourceStates: { + formBased: { + layers: { + [layerIds[0]]: { + columns: { + [columnIds[0]]: { + label: 'Risk', + dataType: 'number', + operationType: 'max', + isBucketed: false, + scale: 'ratio', + sourceField, + reducedTimeRange: '', + params: { + sortField: '@timestamp', + format: { + id: 'number', + params: { + decimals: 0, + compact: false, + }, + }, + emptyAsNull: true, + }, + customLabel: true, + }, + }, + columnOrder: [columnIds[0]], + incompleteColumns: {}, + }, + [layerIds[1]]: { + linkToLayers: [layerIds[0]], + columns: { + [columnIds[1]]: { + label: '@timestamp', + dataType: 'date', + operationType: 'date_histogram', + sourceField: RiskScoreFields.timestamp, + isBucketed: true, + scale: 'interval', + params: { + interval: 'auto', + includeEmptyRows: true, + dropPartials: false, + }, + }, + [columnIds[2]]: { + label: 'Risk value', + dataType: 'number', + operationType: 'last_value', + isBucketed: false, + scale: 'ratio', + sourceField, + filter: { + query: '', + language: 'kuery', + }, + timeShift: '', + reducedTimeRange: '', + params: { + sortField: '@timestamp', + format: { + id: 'number', + params: { + decimals: 0, + compact: false, + }, + }, + }, + customLabel: true, + }, + }, + columnOrder: [columnIds[1], columnIds[2]], + sampling: 1, + ignoreGlobalFilters: false, + incompleteColumns: {}, + }, + }, + }, + indexpattern: { + layers: {}, + }, + textBased: { + layers: {}, + }, + }, + internalReferences: [ + { + type: 'index-pattern', + id: internalReferenceId, + name: `indexpattern-datasource-layer-${layerIds[0]}`, + }, + { + type: 'index-pattern', + id: internalReferenceId, + name: `indexpattern-datasource-layer-${layerIds[1]}`, + }, + ], + adHocDataViews: { + [internalReferenceId]: { + id: internalReferenceId, + title: `risk-score.risk-score-${spaceId ?? 'default'}`, + timeFieldName: '@timestamp', + sourceFilters: [], + fieldFormats: {}, + runtimeFieldMap: {}, + fieldAttrs: {}, + allowNoIndex: false, + name: `risk-score.risk-score-${spaceId ?? 'default'}`, + }, + }, + }, + references: [], + }; +}; 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 df564277122ce..fdaa006e15f56 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 @@ -14,7 +14,7 @@ import styled from 'styled-components'; import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import type { RangeFilterParams } from '@kbn/es-query'; import type { ClickTriggerEvent, MultiClickTriggerEvent } from '@kbn/charts-plugin/public'; -import type { XYState } from '@kbn/lens-plugin/public'; +import type { EmbeddableComponentProps, XYState } from '@kbn/lens-plugin/public'; import { setAbsoluteRangeDatePicker } from '../../store/inputs/actions'; import { useKibana } from '../../lib/kibana'; import { useLensAttributes } from './use_lens_attributes'; @@ -24,7 +24,7 @@ import { inputsSelectors } from '../../store'; import { useDeepEqualSelector } from '../../hooks/use_selector'; import { ModalInspectQuery } from '../inspect/modal'; import { InputsModelId } from '../../store/inputs/constants'; -import { getRequestsAndResponses, showLegendActionsByActionId } from './utils'; +import { getRequestsAndResponses } from './utils'; import { SourcererScopeName } from '../../store/sourcerer/model'; import { VisualizationActions } from './actions'; @@ -81,6 +81,7 @@ const LensEmbeddableComponent: React.FC = ({ timerange, width: wrapperWidth, withActions = true, + disableOnClickFilter = false, }) => { const style = useMemo( () => ({ @@ -185,9 +186,10 @@ const LensEmbeddableComponent: React.FC = ({ [onLoad] ); - const onFilterCallback = useCallback( - async (e: ClickTriggerEvent['data'] | MultiClickTriggerEvent['data']) => { - if (!isClickTriggerEvent(e) || preferredSeriesType !== 'area') { + const onFilterCallback = useCallback(() => { + const callback: EmbeddableComponentProps['onFilter'] = async (e) => { + if (!isClickTriggerEvent(e) || preferredSeriesType !== 'area' || disableOnClickFilter) { + e.preventDefault(); return; } // Update timerange when clicking on a dot in an area chart @@ -201,9 +203,14 @@ const LensEmbeddableComponent: React.FC = ({ range: [rangeFilter.gte, rangeFilter.lt], }); } - }, - [createFiltersFromValueClickAction, updateDateRange, preferredSeriesType] - ); + }; + return callback; + }, [ + createFiltersFromValueClickAction, + updateDateRange, + preferredSeriesType, + disableOnClickFilter, + ]); const adHocDataViews = useMemo( () => @@ -218,11 +225,6 @@ const LensEmbeddableComponent: React.FC = ({ [attributes?.state?.adHocDataViews] ); - const shouldShowLegendAction = useCallback( - (actionId: string) => showLegendActionsByActionId({ actionId, scopeId }), - [scopeId] - ); - if (!searchSessionId) { return null; } @@ -286,7 +288,6 @@ const LensEmbeddableComponent: React.FC = ({ showInspector={false} syncTooltips={false} syncCursor={false} - shouldShowLegendAction={shouldShowLegendAction} /> )} 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 854aff1860a2e..6f513e445660e 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 @@ -79,6 +79,10 @@ export interface LensEmbeddableComponentProps { timerange: { from: string; to: string }; width?: string | number; withActions?: boolean; + /** + * Disable the on click filter for the visualization. + */ + disableOnClickFilter?: boolean; } export enum RequestStatus { diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/utils.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/utils.ts index 678cc16c915ef..ef3aa936d293d 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/utils.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/utils.ts @@ -8,10 +8,6 @@ import type { Filter } from '@kbn/es-query'; import { SecurityPageName } from '../../../../common/constants'; -import { HISTOGRAM_LEGEND_ACTION_FILTER_IN } from '../../../actions/filter/lens/filter_in'; -import { TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_IN } from '../../../actions/filter/lens/filter_in_timeline'; -import { HISTOGRAM_LEGEND_ACTION_FILTER_OUT } from '../../../actions/filter/lens/filter_out'; -import { TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_OUT } from '../../../actions/filter/lens/filter_out_timeline'; import type { Request } from './types'; export const VISUALIZATION_ACTIONS_BUTTON_CLASS = 'histogram-actions-trigger'; @@ -199,28 +195,3 @@ export const parseVisualizationData = (data: string[]): T[] => return acc; } }, [] as T[]); - -export const showLegendActionsByActionId = ({ - actionId, - scopeId, -}: { - actionId: string; - scopeId: string; -}) => { - switch (actionId) { - /** We no longer use Lens' default filter in / out actions - * as extra custom actions needed after filters applied. - * For example: hide the topN panel after filters applied */ - case FILTER_IN_LEGEND_ACTION: - case FILTER_OUT_LEGEND_ACTION: - return false; - case HISTOGRAM_LEGEND_ACTION_FILTER_IN: - case HISTOGRAM_LEGEND_ACTION_FILTER_OUT: - return scopeId !== 'timeline'; - case TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_IN: - case TIMELINE_HISTOGRAM_LEGEND_ACTION_FILTER_OUT: - return scopeId === 'timeline'; - default: - return true; - } -}; diff --git a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.ts b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.ts index cb853aa9488c1..1ac9948818bcc 100644 --- a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.ts +++ b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.ts @@ -17,6 +17,8 @@ interface UseAlertByIdsOptions { interface Hit { fields: Record; + _index: string; + _id: string; } interface UserAlertByIdsResult { @@ -25,6 +27,9 @@ interface UserAlertByIdsResult { data?: Hit[]; } +// It prevents recreating the array on every hook call +const ALL_FIELD = ['*']; + /** * Fetches the alert documents associated to the ids that are passed. * By default it fetches all fields but they can be limited by passing @@ -32,7 +37,7 @@ interface UserAlertByIdsResult { */ export const useAlertsByIds = ({ alertIds, - fields = ['*'], + fields = ALL_FIELD, }: UseAlertByIdsOptions): UserAlertByIdsResult => { const [initialQuery] = useState(() => generateAlertByIdsQuery(alertIds, fields)); diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_contract_component.ts b/x-pack/plugins/security_solution/public/common/hooks/use_contract_component.ts new file mode 100644 index 0000000000000..2ebb46db35c83 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/hooks/use_contract_component.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { useKibana } from '../lib/kibana'; + +export const useContractComponents = () => { + const { getComponents$ } = useKibana().services; + const components$ = useMemo(() => getComponents$(), [getComponents$]); + return useObservable(components$, {}); +}; diff --git a/x-pack/plugins/security_solution/public/common/mock/storybook_providers.tsx b/x-pack/plugins/security_solution/public/common/mock/storybook_providers.tsx index 479174a92722f..6fb3ca1ff0f5b 100644 --- a/x-pack/plugins/security_solution/public/common/mock/storybook_providers.tsx +++ b/x-pack/plugins/security_solution/public/common/mock/storybook_providers.tsx @@ -14,6 +14,8 @@ import type { CoreStart } from '@kbn/core/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; import { I18nProvider } from '@kbn/i18n-react'; import { CellActionsProvider } from '@kbn/cell-actions'; +import { NavigationProvider } from '@kbn/security-solution-navigation'; +import { CASES_FEATURE_ID } from '../../../common'; import { createStore } from '../store'; import { mockGlobalState } from './global_state'; import { SUB_PLUGINS_REDUCER } from './utils'; @@ -39,11 +41,36 @@ const uiSettings = { const coreMock = { application: { getUrlForApp: () => {}, + capabilities: { [CASES_FEATURE_ID]: {} }, + }, + lens: { + EmbeddableComponent: () => , + }, + cases: { + helpers: { + getUICapabilities: () => ({}), + }, + hooks: { + useCasesAddToExistingCaseModal: () => {}, + useCasesAddToNewCaseFlyout: () => {}, + }, }, data: { query: { filterManager: {}, }, + search: { + session: React.createRef(), + }, + actions: { + createFiltersFromValueClickAction: () => {}, + }, + }, + settings: { + client: { + get: () => {}, + set: () => {}, + }, }, uiSettings, notifications: { @@ -78,13 +105,15 @@ export const StorybookProviders: React.FC = ({ children }) => { return ( - Promise.resolve([])}> - - ({ eui: euiLightVars, darkMode: false })}> - {children} - - - + + Promise.resolve([])}> + + ({ eui: euiLightVars, darkMode: false })}> + {children} + + + + ); diff --git a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx index a6779272da763..03dc789a41ad1 100644 --- a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx @@ -21,7 +21,6 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { Action } from '@kbn/ui-actions-plugin/public'; import { CellActionsProvider } from '@kbn/cell-actions'; import { ExpandableFlyoutProvider } from '@kbn/expandable-flyout'; -import { MockSubscriptionTrackingProvider } from '@kbn/subscription-tracking/mocks'; import { useKibana } from '../lib/kibana'; import { UpsellingProvider } from '../components/upselling_provider'; import { MockAssistantProvider } from './mock_assistant_provider'; @@ -76,29 +75,27 @@ export const TestProvidersComponent: React.FC = ({ return ( - - - - ({ eui: euiDarkVars, darkMode: true })}> - - - - - - Promise.resolve(cellActions)} - > - {children} - - - - - - - - - - + + + ({ eui: euiDarkVars, darkMode: true })}> + + + + + + Promise.resolve(cellActions)} + > + {children} + + + + + + + + + ); @@ -130,33 +127,31 @@ const TestProvidersWithPrivilegesComponent: React.FC = ({ return ( - - - ({ eui: euiDarkVars, darkMode: true })}> - - - - + ({ eui: euiDarkVars, darkMode: true })}> + + + + + Promise.resolve(cellActions)} > - Promise.resolve(cellActions)} - > - {children} - - - - - - - - + {children} + + + + + + + ); diff --git a/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx index 30f9483169b13..07c87aec59da6 100644 --- a/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx +++ b/x-pack/plugins/security_solution/public/common/utils/timeline/use_show_timeline.test.tsx @@ -83,7 +83,7 @@ describe('use show timeline', () => { }); it('hides timeline for blacklist routes', async () => { - mockUseLocation.mockReturnValueOnce({ pathname: '/rules/create' }); + mockUseLocation.mockReturnValueOnce({ pathname: '/rules/add_rules' }); await act(async () => { const { result, waitForNextUpdate } = renderHook(() => useShowTimeline()); await waitForNextUpdate(); diff --git a/x-pack/plugins/security_solution/public/contract_components.ts b/x-pack/plugins/security_solution/public/contract_components.ts index 91e341c4120f1..3d1dee67eab94 100644 --- a/x-pack/plugins/security_solution/public/contract_components.ts +++ b/x-pack/plugins/security_solution/public/contract_components.ts @@ -5,17 +5,16 @@ * 2.0. */ -import { BehaviorSubject, map } from 'rxjs'; +import { BehaviorSubject } from 'rxjs'; import type { Observable } from 'rxjs'; -export type ContractComponentName = 'getStarted' | 'dashboardsLandingCallout'; - -export type ContractComponents = Partial>; +export type ContractComponents = Partial<{ + GetStarted: React.ComponentType<{}>; + DashboardsLandingCallout: React.ComponentType<{}>; +}>; export type SetComponents = (components: ContractComponents) => void; -export type GetComponent$ = ( - name: ContractComponentName -) => Observable; +export type GetComponents$ = () => Observable; export class ContractComponentsService { private components$: BehaviorSubject; @@ -28,6 +27,5 @@ export class ContractComponentsService { this.components$.next(components); }; - public getComponent$: GetComponent$ = (name) => - this.components$.pipe(map((components) => components[name])); + public getComponents$ = () => this.components$.asObservable(); } diff --git a/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.test.tsx b/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.test.tsx index 8723bfb69f326..52e6692de104b 100644 --- a/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.test.tsx +++ b/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.test.tsx @@ -28,11 +28,9 @@ jest.mock('@kbn/dashboard-plugin/public', () => ({ DashboardTopNav: jest.fn().mockReturnValue(), })); -const mockUseObservable = jest.fn(); - -jest.mock('react-use', () => ({ - ...jest.requireActual('react-use'), - useObservable: () => mockUseObservable(), +const mockUseContractComponents = jest.fn(() => ({})); +jest.mock('../../../common/hooks/use_contract_component', () => ({ + useContractComponents: () => mockUseContractComponents(), })); const DEFAULT_DASHBOARD_CAPABILITIES = { show: true, createNew: true }; @@ -216,11 +214,11 @@ describe('Dashboards landing', () => { }); it('should render callout when available', async () => { - const DummyComponent = () => ; - mockUseObservable.mockReturnValue(); + const DashboardsLandingCallout = () => ; + mockUseContractComponents.mockReturnValue({ DashboardsLandingCallout }); await renderDashboardLanding(); - expect(screen.queryByTestId('test')).toBeInTheDocument(); + expect(screen.queryByTestId('callout-test')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.tsx b/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.tsx index 10fb3c060548f..affe83b0682ca 100644 --- a/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.tsx +++ b/x-pack/plugins/security_solution/public/dashboards/pages/landing_page/index.tsx @@ -17,11 +17,11 @@ import React, { useCallback, useMemo } from 'react'; import type { DashboardCapabilities } from '@kbn/dashboard-plugin/common/types'; import { DashboardListingTable, LEGACY_DASHBOARD_APP_ID } from '@kbn/dashboard-plugin/public'; import { LandingLinksImageCards } from '@kbn/security-solution-navigation/landing_links'; -import { useObservable } from 'react-use'; +import { useContractComponents } from '../../../common/hooks/use_contract_component'; import { SecuritySolutionPageWrapper } from '../../../common/components/page_wrapper'; import { SpyRoute } from '../../../common/utils/route/spy_routes'; import { SecurityPageName } from '../../../../common/constants'; -import { useCapabilities, useKibana, useNavigateTo } from '../../../common/lib/kibana'; +import { useCapabilities, useNavigateTo } from '../../../common/lib/kibana'; import { useRootNavLink } from '../../../common/links/nav_links'; import { Title } from '../../../common/components/header_page/title'; import { LinkButton } from '../../../common/components/links/helpers'; @@ -83,8 +83,7 @@ const Header: React.FC<{ canCreateDashboard: boolean }> = ({ canCreateDashboard }; export const DashboardsLandingPage = () => { - const { getComponent$ } = useKibana().services; - const dashboardLandingCallout = useObservable(getComponent$('dashboardsLandingCallout')); + const { DashboardsLandingCallout } = useContractComponents(); const { links = [] } = useRootNavLink(SecurityPageName.dashboards) ?? {}; const urlState = useGlobalQueryString(); const { show: canReadDashboard, createNew: canCreateDashboard } = @@ -122,9 +121,9 @@ export const DashboardsLandingPage = () => {
    - {dashboardLandingCallout && ( + {DashboardsLandingCallout && ( <> - {dashboardLandingCallout} + )} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx index df33b31a4cb61..e8a97e974431a 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx @@ -404,6 +404,12 @@ const RuleDetailsPageComponent: React.FC = ({ ); }, [ruleId, lastExecutionStatus, lastExecutionDate, ruleLoading, isExistingRule, refreshRule]); + // Extract rule index if available on rule type + let ruleIndex: string[] | undefined; + if (rule != null && 'index' in rule && Array.isArray(rule.index)) { + ruleIndex = rule.index; + } + const ruleError = useMemo(() => { return ruleLoading ? ( @@ -411,12 +417,22 @@ const RuleDetailsPageComponent: React.FC = ({ ) : ( ); - }, [lastExecutionStatus, lastExecutionDate, lastExecutionMessage, ruleLoading]); + }, [ + lastExecutionStatus, + lastExecutionDate, + lastExecutionMessage, + ruleLoading, + rule?.immutable, + rule?.name, + ruleIndex, + ]); const updateDateRangeCallback = useCallback( ({ x }) => { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx index 50e1e11268e5e..821a638e893c2 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx @@ -29,7 +29,7 @@ export interface UseAddToCaseActions { onSuccess?: () => Promise; isActiveTimelines: boolean; isInDetections: boolean; - refetch: (() => void) | undefined; + refetch?: (() => void) | undefined; } export const useAddToCaseActions = ({ @@ -173,5 +173,6 @@ export const useAddToCaseActions = ({ return { addToCaseActionItems, handleAddToNewCaseClick, + handleAddToExistingCaseClick, }; }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts index 5115bf0130e6d..2023df7462536 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts @@ -137,6 +137,13 @@ export const ACTION_INVESTIGATE_IN_TIMELINE = i18n.translate( } ); +export const ACTION_CANNOT_INVESTIGATE_IN_TIMELINE = i18n.translate( + 'xpack.securitySolution.detectionEngine.alerts.actions.cannotInvestigateInTimelineTitle', + { + defaultMessage: 'Please navigate to a page with timeline to investigate', + } +); + export const ACTION_INVESTIGATE_IN_TIMELINE_ARIA_LABEL = i18n.translate( 'xpack.securitySolution.detectionEngine.alerts.actions.investigateInTimelineAriaLabel', { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.test.tsx index 4902ac0115fee..5998073d65cdb 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.test.tsx @@ -11,6 +11,10 @@ import { render } from '@testing-library/react'; import type { RuleExecutionStatus } from '../../../../../common/api/detection_engine/rule_monitoring'; import { RuleExecutionStatusEnum } from '../../../../../common/api/detection_engine/rule_monitoring'; import { RuleStatusFailedCallOut } from './rule_status_failed_callout'; +import { AssistantProvider } from '@kbn/elastic-assistant'; +import type { AssistantAvailability } from '@kbn/elastic-assistant'; +import { httpServiceMock } from '@kbn/core-http-browser-mocks'; +import { actionTypeRegistryMock } from '@kbn/triggers-actions-ui-plugin/public/application/action_type_registry.mock'; jest.mock('../../../../common/lib/kibana'); @@ -18,10 +22,50 @@ const TEST_ID = 'ruleStatusFailedCallOut'; const DATE = '2022-01-27T15:03:31.176Z'; const MESSAGE = 'This rule is attempting to query data but...'; +const actionTypeRegistry = actionTypeRegistryMock.create(); +const mockGetInitialConversations = jest.fn(() => ({})); +const mockGetComments = jest.fn(() => []); +const mockHttp = httpServiceMock.createStartContract({ basePath: '/test' }); +const mockAssistantAvailability: AssistantAvailability = { + hasAssistantPrivilege: false, + hasConnectorsAllPrivilege: true, + hasConnectorsReadPrivilege: true, + isAssistantEnabled: true, +}; +const ContextWrapper: React.FC = ({ children }) => ( + + {children} + +); + describe('RuleStatusFailedCallOut', () => { const renderWith = (status: RuleExecutionStatus | null | undefined) => render(); - + const renderWithAssistant = (status: RuleExecutionStatus | null | undefined) => + render( + + {' '} + + ); it('is hidden if status is undefined', () => { const result = renderWith(undefined); expect(result.queryByTestId(TEST_ID)).toBe(null); @@ -48,7 +92,7 @@ describe('RuleStatusFailedCallOut', () => { }); it('is visible if status is "partial failure"', () => { - const result = renderWith(RuleExecutionStatusEnum['partial failure']); + const result = renderWithAssistant(RuleExecutionStatusEnum['partial failure']); result.getByTestId(TEST_ID); result.getByText('Warning at'); result.getByText('Jan 27, 2022 @ 15:03:31.176'); @@ -56,7 +100,7 @@ describe('RuleStatusFailedCallOut', () => { }); it('is visible if status is "failed"', () => { - const result = renderWith(RuleExecutionStatusEnum.failed); + const result = renderWithAssistant(RuleExecutionStatusEnum.failed); result.getByTestId(TEST_ID); result.getByText('Rule failure at'); result.getByText('Jan 27, 2022 @ 15:03:31.176'); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx index b9e26dc162207..0d1777e26c553 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx @@ -5,28 +5,43 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; -import { EuiCallOut, EuiCodeBlock } from '@elastic/eui'; +import { EuiButton, EuiCallOut, EuiCodeBlock } from '@elastic/eui'; +import { NewChat } from '@kbn/elastic-assistant'; import { FormattedDate } from '../../../../common/components/formatted_date'; import type { RuleExecutionStatus } from '../../../../../common/api/detection_engine/rule_monitoring'; import { RuleExecutionStatusEnum } from '../../../../../common/api/detection_engine/rule_monitoring'; import * as i18n from './translations'; +import * as i18nAssistant from '../../../pages/detection_engine/rules/translations'; +import { useAssistantAvailability } from '../../../../assistant/use_assistant_availability'; interface RuleStatusFailedCallOutProps { + ruleName?: string | undefined; + dataSources?: string[] | undefined; date: string; message: string; status?: RuleExecutionStatus | null; } const RuleStatusFailedCallOutComponent: React.FC = ({ + ruleName, + dataSources, date, message, status, }) => { + const { hasAssistantPrivilege } = useAssistantAvailability(); const { shouldBeDisplayed, color, title } = getPropsByStatus(status); + const getPromptContext = useCallback( + async () => + ruleName != null && dataSources != null + ? `Rule name: ${ruleName}\nData sources: ${dataSources}\nError message: ${message}` + : `Error message: ${message}`, + [message, ruleName, dataSources] + ); if (!shouldBeDisplayed) { return null; } @@ -60,6 +75,21 @@ const RuleStatusFailedCallOutComponent: React.FC = > {message} + {hasAssistantPrivilege && ( + + + {i18n.ASK_ASSISTANT_ERROR_BUTTON} + + + )}
    ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/translations.ts b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/translations.ts index e2a1e566813a3..3b760ac68e628 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/translations.ts @@ -48,3 +48,31 @@ export const PARTIAL_FAILURE_CALLOUT_TITLE = i18n.translate( defaultMessage: 'Warning at', } ); + +export const ASK_ASSISTANT_ERROR_BUTTON = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleStatus.askAssistant', + { + defaultMessage: 'Ask Assistant', + } +); + +export const ASK_ASSISTANT_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleStatus.askAssistantDesc', + { + defaultMessage: "Rule's execution failure message", + } +); + +export const ASK_ASSISTANT_USER_PROMPT = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleStatus.askAssistantUserPrompt', + { + defaultMessage: 'Can you explain this rule execution error and steps to fix?', + } +); + +export const ASK_ASSISTANT_TOOLTIP = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleStatus.askAssistantToolTip', + { + defaultMessage: 'Add this rule execution error as context', + } +); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts b/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts new file mode 100644 index 0000000000000..361d6d133a93d --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/common/utils.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { euiLightVars } from '@kbn/ui-theme'; +import { RiskSeverity } from '../../../common/search_strategy'; +import { SEVERITY_COLOR } from '../../overview/components/detection_response/utils'; + +export const SEVERITY_UI_SORT_ORDER = [ + RiskSeverity.unknown, + RiskSeverity.low, + RiskSeverity.moderate, + RiskSeverity.high, + RiskSeverity.critical, +]; + +export const RISK_SEVERITY_COLOUR: { [k in RiskSeverity]: string } = { + [RiskSeverity.unknown]: euiLightVars.euiColorMediumShade, + [RiskSeverity.low]: SEVERITY_COLOR.low, + [RiskSeverity.moderate]: SEVERITY_COLOR.medium, + [RiskSeverity.high]: SEVERITY_COLOR.high, + [RiskSeverity.critical]: SEVERITY_COLOR.critical, +}; + +export const RISK_SCORE_RANGES = { + [RiskSeverity.unknown]: { start: 0, stop: 20 }, + [RiskSeverity.low]: { start: 20, stop: 40 }, + [RiskSeverity.moderate]: { start: 40, stop: 70 }, + [RiskSeverity.high]: { start: 70, stop: 90 }, + [RiskSeverity.critical]: { start: 90, stop: 100 }, +}; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx index bd0b0e262e3cc..703ed94a8c617 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_enable_section.tsx @@ -29,11 +29,8 @@ import { EuiAccordion, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { - DETECTION_ENTITY_DASHBOARD, - RISKY_HOSTS_DOC_LINK, - RISKY_USERS_DOC_LINK, -} from '../../../common/constants'; +import { LinkAnchor } from '@kbn/security-solution-navigation/links'; +import { SecurityPageName } from '@kbn/security-solution-navigation'; import * as i18n from '../translations'; import { useRiskEngineStatus } from '../api/hooks/use_risk_engine_status'; import { useInitRiskEngineMutation } from '../api/hooks/use_init_risk_engine_mutation'; @@ -41,20 +38,8 @@ import { useEnableRiskEngineMutation } from '../api/hooks/use_enable_risk_engine import { useDisableRiskEngineMutation } from '../api/hooks/use_disable_risk_engine_mutation'; import { RiskEngineStatus, MAX_SPACES_COUNT } from '../../../common/risk_engine'; -const docsLinks = [ - { - link: DETECTION_ENTITY_DASHBOARD, - label: i18n.EA_DOCS_DASHBOARD, - }, - { - link: RISKY_HOSTS_DOC_LINK, - label: i18n.EA_DOCS_RISK_HOSTS, - }, - { - link: RISKY_USERS_DOC_LINK, - label: i18n.EA_DOCS_RISK_USERS, - }, -]; +import { RiskInformationFlyout } from '../../explore/components/risk_score/risk_information'; +import { useOnOpenCloseHandler } from '../../helper_hooks'; const MIN_WIDTH_TO_PREVENT_LABEL_FROM_MOVING = '50px'; @@ -209,6 +194,8 @@ export const RiskScoreEnableSection = () => { const closeModal = () => setIsModalVisible(false); const showModal = () => setIsModalVisible(true); + const [isFlyoutVisible, handleOnOpen, handleOnClose] = useOnOpenCloseHandler(); + const isLoading = initRiskEngineMutation.isLoading || enableRiskEngineMutation.isLoading || @@ -345,14 +332,17 @@ export const RiskScoreEnableSection = () => {
      - {docsLinks.map(({ link, label }) => ( -
    • - - {label} - - -
    • - ))} +
    • + {i18n.EA_DASHBOARD_LINK} + +
    • +
    • + + {i18n.EA_DOCS_ENTITY_RISK_SCORE} + + {isFlyoutVisible && } + +
    diff --git a/x-pack/plugins/security_solution/public/entity_analytics/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/translations.ts index e22833674ff85..06880dbdd4ae1 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/translations.ts @@ -59,7 +59,7 @@ export const RISK_SCORE_MODULE_STATUS_OFF = i18n.translate( export const ENTITY_RISK_SCORING = i18n.translate( 'xpack.securitySolution.riskScore.riskScorePreview.entityRiskScoring', { - defaultMessage: 'Entity risk scoring', + defaultMessage: 'Entity risk score', } ); @@ -70,10 +70,10 @@ export const USEFUL_LINKS = i18n.translate( } ); -export const EA_DOCS_DASHBOARD = i18n.translate( +export const EA_DASHBOARD_LINK = i18n.translate( 'xpack.securitySolution.riskScore.riskScorePreview.eaDocsDashboard', { - defaultMessage: 'Entity Analytics documentation', + defaultMessage: 'Entity Analytics dashboard', } ); @@ -91,6 +91,13 @@ export const EA_DOCS_RISK_USERS = i18n.translate( } ); +export const EA_DOCS_ENTITY_RISK_SCORE = i18n.translate( + 'xpack.securitySolution.riskScore.riskScorePreview.eaDocsEntities', + { + defaultMessage: 'How is the risk score calculated?', + } +); + export const PREVIEW = i18n.translate('xpack.securitySolution.riskScore.riskScorePreview.preview', { defaultMessage: 'Preview', }); diff --git a/x-pack/plugins/security_solution/public/exceptions/hooks/use_endpoint_exceptions_capability/index.tsx b/x-pack/plugins/security_solution/public/exceptions/hooks/use_endpoint_exceptions_capability/index.tsx index a96b11225e659..4b107a5c681c1 100644 --- a/x-pack/plugins/security_solution/public/exceptions/hooks/use_endpoint_exceptions_capability/index.tsx +++ b/x-pack/plugins/security_solution/public/exceptions/hooks/use_endpoint_exceptions_capability/index.tsx @@ -5,19 +5,10 @@ * 2.0. */ -import { useMemo } from 'react'; -import { useListsConfig } from '../../../detections/containers/detection_engine/lists/use_lists_config'; import { useHasSecurityCapability } from '../../../helper_hooks'; export const useEndpointExceptionsCapability = ( capability: 'showEndpointExceptions' | 'crudEndpointExceptions' -) => { - const { loading: listsConfigLoading, needsConfiguration: needsListsConfiguration } = - useListsConfig(); - const hasEndpointExceptionCapability = useHasSecurityCapability(capability); - - return useMemo( - () => !listsConfigLoading && !needsListsConfiguration && hasEndpointExceptionCapability, - [hasEndpointExceptionCapability, listsConfigLoading, needsListsConfiguration] - ); +): boolean => { + return useHasSecurityCapability(capability); }; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.tsx b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.tsx index 4edecf5c40174..bd099341419f0 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/index.tsx @@ -28,7 +28,7 @@ import { import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; -import { getRiskEntityTranslation } from '../translations'; + import * as i18n from './translations'; import { useOnOpenCloseHandler } from '../../../../helper_hooks'; import { RiskScoreLevel } from '../severity/common'; @@ -36,7 +36,7 @@ import { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_stra import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link'; import { BETA } from '../risk_score_onboarding/translations'; -const getTableColumns = (riskEntity: RiskScoreEntity): Array> => [ +const getTableColumns = (riskEntity?: RiskScoreEntity): Array> => [ { field: 'level', name: i18n.INFORMATION_LEVEL_HEADER, @@ -85,9 +85,7 @@ export const RiskInformationButtonIcon = ({ riskEntity }: { riskEntity: RiskScor } data-test-subj="open-risk-information-flyout-trigger" /> - {isFlyoutVisible && ( - - )} + {isFlyoutVisible && } ); }; @@ -100,20 +98,12 @@ export const RiskInformationButtonEmpty = ({ riskEntity }: { riskEntity: RiskSco {i18n.INFO_BUTTON_TEXT} - {isFlyoutVisible && ( - - )} + {isFlyoutVisible && } ); }; -const RiskInformationFlyout = ({ - handleOnClose, - riskEntity, -}: { - handleOnClose: () => void; - riskEntity: RiskScoreEntity; -}) => { +export const RiskInformationFlyout = ({ handleOnClose }: { handleOnClose: () => void }) => { const { euiTheme } = useEuiTheme(); const simpleFlyoutTitleId = useGeneratedHtmlId({ prefix: 'RiskInformation', @@ -157,15 +147,13 @@ const RiskInformationFlyout = ({

    ), @@ -176,15 +164,13 @@ const RiskInformationFlyout = ({ ), @@ -236,26 +222,22 @@ const RiskInformationFlyout = ({

    } /> diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/translations.ts b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/translations.ts index 112c6d37ca4a2..20fa22bbc26f5 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/translations.ts +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_information/translations.ts @@ -23,7 +23,7 @@ export const INFORMATION_ARIA_LABEL = i18n.translate( } ); -export const INFORMATION_RISK_HEADER = (riskEntity: RiskScoreEntity) => +export const INFORMATION_RISK_HEADER = (riskEntity?: RiskScoreEntity) => i18n.translate('xpack.securitySolution.riskInformation.riskHeader', { defaultMessage: '{riskEntity} risk score range', values: { diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx index cae89799d2d1e..dbe56fd74931e 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_score_onboarding/risk_score_doc_link.tsx @@ -6,20 +6,31 @@ */ import { EuiLink } from '@elastic/eui'; -import React from 'react'; +import React, { useMemo } from 'react'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { RISKY_HOSTS_DOC_LINK, RISKY_USERS_DOC_LINK } from '../../../../../common/constants'; +import { + RISKY_HOSTS_DOC_LINK, + RISKY_USERS_DOC_LINK, + RISKY_ENTITY_SCORE_DOC_LINK, +} from '../../../../../common/constants'; import { LEARN_MORE } from '../../../../overview/components/entity_analytics/risk_score/translations'; const RiskScoreDocLinkComponent = ({ riskScoreEntity, title, }: { - riskScoreEntity: RiskScoreEntity; + riskScoreEntity?: RiskScoreEntity; title?: string | React.ReactNode; }) => { - const docLink = - riskScoreEntity === RiskScoreEntity.user ? RISKY_USERS_DOC_LINK : RISKY_HOSTS_DOC_LINK; + const docLink = useMemo(() => { + if (!riskScoreEntity) { + return RISKY_ENTITY_SCORE_DOC_LINK; + } + if (riskScoreEntity === RiskScoreEntity.user) { + return RISKY_USERS_DOC_LINK; + } + return RISKY_HOSTS_DOC_LINK; + }, [riskScoreEntity]); return ( diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.tsx b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.tsx index b28898b384e00..9430690394b49 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/common/index.tsx @@ -12,17 +12,9 @@ import { EuiHealth, transparentize } from '@elastic/eui'; import styled, { css } from 'styled-components'; import { euiLightVars } from '@kbn/ui-theme'; +import { RISK_SEVERITY_COLOUR } from '../../../../../entity_analytics/common/utils'; import { WithHoverActions } from '../../../../../common/components/with_hover_actions'; -import { RiskSeverity } from '../../../../../../common/search_strategy'; -import { SEVERITY_COLOR } from '../../../../../overview/components/detection_response/utils'; - -export const RISK_SEVERITY_COLOUR: { [k in RiskSeverity]: string } = { - [RiskSeverity.unknown]: euiLightVars.euiColorMediumShade, - [RiskSeverity.low]: SEVERITY_COLOR.low, - [RiskSeverity.moderate]: SEVERITY_COLOR.medium, - [RiskSeverity.high]: SEVERITY_COLOR.high, - [RiskSeverity.critical]: SEVERITY_COLOR.critical, -}; +import type { RiskSeverity } from '../../../../../../common/search_strategy'; const RiskBadge = styled.div<{ $severity: RiskSeverity; $hideBackgroundColor: boolean }>` ${({ theme, $severity, $hideBackgroundColor }) => css` diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_badges.tsx b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_badges.tsx index f1ebae0897595..53c7e270f2e31 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_badges.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_badges.tsx @@ -7,8 +7,9 @@ import { EuiFlexGroup, EuiNotificationBadge, EuiFlexItem } from '@elastic/eui'; import React from 'react'; +import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; import type { RiskSeverity } from '../../../../../common/search_strategy'; -import { RiskScoreLevel, RISK_SEVERITY_COLOUR } from './common'; +import { RiskScoreLevel } from './common'; import type { SeverityCount } from './types'; export const SeverityBadges: React.FC<{ diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_bar.tsx b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_bar.tsx index d53693b6d8e69..847488869bcd3 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_bar.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_bar.tsx @@ -9,8 +9,8 @@ import styled from 'styled-components'; import { EuiColorPaletteDisplay } from '@elastic/eui'; import React, { useMemo } from 'react'; +import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; import type { RiskSeverity } from '../../../../../common/search_strategy'; -import { RISK_SEVERITY_COLOUR } from './common'; import type { SeverityCount } from './types'; const StyledEuiColorPaletteDisplay = styled(EuiColorPaletteDisplay)` diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.tsx b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.tsx index 02ce5e01e8873..1ca7020bc818d 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/severity/severity_filter_group.tsx @@ -16,8 +16,8 @@ import { useEuiTheme, } from '@elastic/eui'; +import { SEVERITY_UI_SORT_ORDER } from '../../../../entity_analytics/common/utils'; import type { RiskScoreEntity, RiskSeverity } from '../../../../../common/search_strategy'; -import { SEVERITY_UI_SORT_ORDER } from '../../../../../common/search_strategy'; import type { SeverityCount } from './types'; import { RiskScoreLevel } from './common'; import { ENTITY_RISK_LEVEL } from '../translations'; diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/translations.ts b/x-pack/plugins/security_solution/public/explore/components/risk_score/translations.ts index 501de5719a63e..d072607544d4f 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/translations.ts +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/translations.ts @@ -24,6 +24,14 @@ export const USERS = i18n.translate('xpack.securitySolution.riskScore.overview.u defaultMessage: 'Users', }); +export const ENTITY = i18n.translate('xpack.securitySolution.riskScore.overview.entityTitle', { + defaultMessage: 'Entity', +}); + +export const ENTITIES = i18n.translate('xpack.securitySolution.riskScore.overview.entities', { + defaultMessage: 'Entities', +}); + export const RISK_SCORE_TITLE = (riskEntity: RiskScoreEntity) => i18n.translate('xpack.securitySolution.riskScore.overview.riskScoreTitle', { defaultMessage: '{riskEntity} Risk Score', @@ -41,22 +49,26 @@ export const ENTITY_RISK_LEVEL = (riskEntity: RiskScoreEntity) => }); export const getRiskEntityTranslation = ( - riskEntity: RiskScoreEntity, + riskEntity?: RiskScoreEntity, lowercase = false, plural = false ) => { - if (lowercase) { - if (plural) { - return (riskEntity === RiskScoreEntity.host ? HOSTS : USERS).toLowerCase(); - } + const text = getRiskEntityTranslationText(riskEntity, plural); + return lowercase ? text.toLowerCase() : text; +}; - return (riskEntity === RiskScoreEntity.host ? HOST : USER).toLowerCase(); - } - if (plural) { - return riskEntity === RiskScoreEntity.host ? HOSTS : USERS; +export const getRiskEntityTranslationText = ( + riskEntity: RiskScoreEntity | undefined, + plural: boolean +) => { + switch (riskEntity) { + case RiskScoreEntity.host: + return plural ? HOSTS : HOST; + case RiskScoreEntity.user: + return plural ? USERS : USER; + default: + return plural ? ENTITIES : ENTITY; } - - return riskEntity === RiskScoreEntity.host ? HOST : USER; }; export const ALERTS = i18n.translate('xpack.securitySolution.riskScore.overview.alerts', { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/content.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/content.tsx index 0684bf05b7924..b4a97832e77ce 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/content.tsx @@ -8,7 +8,7 @@ import type { FC } from 'react'; import React, { useCallback } from 'react'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; -import { RightPanelKey } from '../right'; +import { DocumentDetailsRightPanelKey } from '../right'; import { useBasicDataFromDetailsData } from '../../../timelines/components/side_panel/event_details/helpers'; import { EndpointIsolateSuccess } from '../../../common/components/endpoint/host_isolation'; import { useHostIsolationTools } from '../../../timelines/components/side_panel/event_details/use_host_isolation_tools'; @@ -32,7 +32,7 @@ export const PanelContent: FC = () => { const showAlertDetails = useCallback( () => openRightPanel({ - id: RightPanelKey, + id: DocumentDetailsRightPanelKey, params: { id: eventId, indexName, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/index.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/index.tsx index ff02d7b78a115..b56282a542646 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/isolate_host/index.tsx @@ -11,7 +11,8 @@ import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; import { PanelContent } from './content'; import { PanelHeader } from './header'; -export const IsolateHostPanelKey: IsolateHostPanelProps['key'] = 'document-details-isolate-host'; +export const DocumentDetailsIsolateHostPanelKey: IsolateHostPanelProps['key'] = + 'document-details-isolate-host'; export interface IsolateHostPanelProps extends FlyoutPanelProps { key: 'document-details-isolate-host'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.test.tsx index 95b4e0a600594..7ba849e1fec1b 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.test.tsx @@ -18,6 +18,7 @@ jest.mock('../../shared/hooks/use_investigation_guide'); const NO_DATA_TEXT = "There's no investigation guide for this rule. Edit the rule's settingsExternal link(opens in a new tab or window) to add one."; +const PREVIEW_MESSAGE = 'Investigation guide is not available in alert preview.'; const renderInvestigationGuide = (context: LeftPanelContext = mockContextValue) => ( @@ -76,4 +77,15 @@ describe('', () => { const { getByTestId } = render(renderInvestigationGuide()); expect(getByTestId(INVESTIGATION_GUIDE_TEST_ID)).toHaveTextContent(NO_DATA_TEXT); }); + + it('should render preview message when flyout is in preview', () => { + (useInvestigationGuide as jest.Mock).mockReturnValue({ + loading: false, + error: true, + }); + const { getByTestId } = render( + renderInvestigationGuide({ ...mockContextValue, isPreview: true }) + ); + expect(getByTestId(INVESTIGATION_GUIDE_TEST_ID)).toHaveTextContent(PREVIEW_MESSAGE); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.tsx index bffe966b944b2..d061cbb25c4c8 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/investigation_guide.tsx @@ -18,7 +18,7 @@ import { FlyoutLoading } from '../../../shared/components/flyout_loading'; * Renders a message saying the guide hasn't been set up or the full investigation guide. */ export const InvestigationGuide: React.FC = () => { - const { dataFormattedForFieldBrowser } = useLeftPanelContext(); + const { dataFormattedForFieldBrowser, isPreview } = useLeftPanelContext(); const { loading, error, basicAlertData, ruleNote } = useInvestigationGuide({ dataFormattedForFieldBrowser, @@ -26,7 +26,12 @@ export const InvestigationGuide: React.FC = () => { return (
    - {loading ? ( + {isPreview ? ( + + ) : loading ? ( ) : !error && basicAlertData.ruleId && ruleNote ? ( { const NO_DATA_MESSAGE = "There are no response actions defined for this event. To add some, edit the rule's settings and set up response actionsExternal link(opens in a new tab or window)."; +const PREVIEW_MESSAGE = 'Response is not available in alert preview.'; const defaultContextValue = { dataAsNestedObject: { @@ -139,4 +140,10 @@ describe('', () => { expect(wrapper.getByTestId(RESPONSE_DETAILS_TEST_ID)).toHaveTextContent(NO_DATA_MESSAGE); }); + + it('should render preview message if flyout is in preview', () => { + const wrapper = renderResponseDetails({ ...defaultContextValue, isPreview: true }); + expect(wrapper.getByTestId(RESPONSE_DETAILS_TEST_ID)).toBeInTheDocument(); + expect(wrapper.getByTestId(RESPONSE_DETAILS_TEST_ID)).toHaveTextContent(PREVIEW_MESSAGE); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx index 9e2ab547e9af6..8caaad7225057 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/response_details.tsx @@ -24,7 +24,7 @@ const ExtendedFlyoutWrapper = styled.div` * Automated response actions results, displayed in the document details expandable flyout left section under the Insights tab, Response tab */ export const ResponseDetails: React.FC = () => { - const { searchHit, dataAsNestedObject } = useLeftPanelContext(); + const { searchHit, dataAsNestedObject, isPreview } = useLeftPanelContext(); const endpointResponseActionsEnabled = useIsExperimentalFeatureEnabled( 'endpointResponseActionsEnabled' ); @@ -40,19 +40,28 @@ export const ResponseDetails: React.FC = () => { return (
    - -
    - -
    -
    - + {isPreview ? ( + + ) : ( + <> + +
    + +
    +
    + - - {endpointResponseActionsEnabled ? responseActionsView?.content : osqueryView?.content} - + + {endpointResponseActionsEnabled ? responseActionsView?.content : osqueryView?.content} + + + )}
    ); }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts index b36f674892f58..1ac4fb1c5f263 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/test_ids.ts @@ -11,7 +11,6 @@ import { PREFIX } from '../../../shared/test_ids'; export const ANALYZER_GRAPH_TEST_ID = `${PREFIX}AnalyzerGraph` as const; export const SESSION_VIEW_TEST_ID = `${PREFIX}SessionView` as const; -export const SESSION_VIEW_ERROR_TEST_ID = `${PREFIX}SessionViewError` as const; /* Insights tab */ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/context.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/context.tsx index 6dd0f65af4922..52bf509462699 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/context.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/context.tsx @@ -8,6 +8,7 @@ import type { BrowserFields, TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; import React, { createContext, memo, useContext, useMemo } from 'react'; import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; +import { TableId } from '@kbn/securitysolution-data-table'; import { useEventDetails } from '../shared/hooks/use_event_details'; import { FlyoutError } from '../../shared/components/flyout_error'; import { FlyoutLoading } from '../../shared/components/flyout_loading'; @@ -54,6 +55,10 @@ export interface LeftPanelContext { * Retrieves searchHit values for the provided field */ getFieldsData: GetFieldsData; + /** + * Boolean to indicate whether it is a preview flyout + */ + isPreview: boolean; } export const LeftPanelContext = createContext(undefined); @@ -97,6 +102,7 @@ export const LeftPanelProvider = memo( searchHit, investigationFields: maybeRule?.investigation_fields?.field_names ?? [], getFieldsData, + isPreview: scopeId === TableId.rulePreview, } : undefined, [ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx index a6e4e865adfa8..049210326c016 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx @@ -16,7 +16,7 @@ import { tabs } from './tabs'; import { useLeftPanelContext } from './context'; export type LeftPanelPaths = 'visualize' | 'insights' | 'investigation' | 'response'; -export const LeftPanelKey: LeftPanelProps['key'] = 'document-details-left'; +export const DocumentDetailsLeftPanelKey: LeftPanelProps['key'] = 'document-details-left'; export const LeftPanelVisualizeTab: LeftPanelPaths = 'visualize'; export const LeftPanelInsightsTab: LeftPanelPaths = 'insights'; export const LeftPanelInvestigationTab: LeftPanelPaths = 'investigation'; @@ -45,7 +45,7 @@ export const LeftPanel: FC> = memo(({ path }) => { const setSelectedTabId = (tabId: LeftPanelTabsType[number]['id']) => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: tabId, }, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/mocks/mock_context.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/mocks/mock_context.ts index 4233a28c1164e..4892d7d4dfa08 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/mocks/mock_context.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/mocks/mock_context.ts @@ -25,4 +25,5 @@ export const mockContextValue: LeftPanelContext = { searchHit: mockSearchHit, dataAsNestedObject: mockDataAsNestedObject, investigationFields: [], + isPreview: false, }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/insights_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/insights_tab.tsx index 3e8c1f22de622..f3297b57183f3 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/insights_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/insights_tab.tsx @@ -20,7 +20,7 @@ import { INSIGHTS_TAB_CORRELATIONS_BUTTON_TEST_ID, } from './test_ids'; import { useLeftPanelContext } from '../context'; -import { LeftPanelKey, LeftPanelInsightsTab } from '..'; +import { DocumentDetailsLeftPanelKey, LeftPanelInsightsTab } from '..'; import { ENTITIES_TAB_ID, EntitiesDetails } from '../components/entities_details'; import { THREAT_INTELLIGENCE_TAB_ID, @@ -86,7 +86,7 @@ export const InsightsTab: React.FC = memo(() => { (optionId: string) => { setActiveInsightsId(optionId); openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: optionId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx index b23d61f19e053..2ff079feeeb98 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/tabs/visualize_tab.tsx @@ -13,7 +13,7 @@ import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { useLeftPanelContext } from '../context'; -import { LeftPanelKey, LeftPanelVisualizeTab } from '..'; +import { DocumentDetailsLeftPanelKey, LeftPanelVisualizeTab } from '..'; import { VISUALIZE_TAB_BUTTON_GROUP_TEST_ID, VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON_TEST_ID, @@ -64,7 +64,7 @@ export const VisualizeTab: FC = memo(() => { startTransaction({ name: ALERTS_ACTIONS.OPEN_ANALYZER }); } openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelVisualizeTab, subTab: optionId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/preview/index.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/preview/index.tsx index db9f7bb5ba58a..5bc4ebf31ab40 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/preview/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/preview/index.tsx @@ -13,7 +13,7 @@ import { panels } from './panels'; export type PreviewPanelPaths = 'rule-preview' | 'alert-reason-preview'; export const RulePreviewPanel: PreviewPanelPaths = 'rule-preview'; export const AlertReasonPreviewPanel: PreviewPanelPaths = 'alert-reason-preview'; -export const PreviewPanelKey: PreviewPanelProps['key'] = 'document-details-preview'; +export const DocumentDetailsPreviewPanelKey: PreviewPanelProps['key'] = 'document-details-preview'; export interface PreviewPanelProps extends FlyoutPanelProps { key: 'document-details-preview'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx index 5b27fd70781db..b8c2672af1dc2 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.test.tsx @@ -53,10 +53,10 @@ const panelContextValue = { dataFormattedForFieldBrowser: mockDataFormattedForFieldBrowser, }; -const renderAnalyzerPreview = () => +const renderAnalyzerPreview = (context = panelContextValue) => render( - + @@ -117,7 +117,7 @@ describe('AnalyzerPreviewContainer', () => { ).toHaveTextContent(NO_ANALYZER_MESSAGE); }); - it('should navigate to left section Visualize tab when clicking on title', () => { + it('should navigate to analyzer in timeline when clicking on title', () => { (isInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); (useAlertPrevalenceFromProcessTree as jest.Mock).mockReturnValue({ loading: false, @@ -136,4 +136,24 @@ describe('AnalyzerPreviewContainer', () => { getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID)).click(); expect(investigateInTimelineAlertClick).toHaveBeenCalled(); }); + + it('should not navigate to analyzer when in preview and clicking on title', () => { + (isInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); + (useAlertPrevalenceFromProcessTree as jest.Mock).mockReturnValue({ + loading: false, + error: false, + alertIds: ['alertid'], + statsNodes: mock.mockStatsNodes, + }); + (useInvestigateInTimeline as jest.Mock).mockReturnValue({ + investigateInTimelineAlertClick: jest.fn(), + }); + + const { queryByTestId } = renderAnalyzerPreview({ ...panelContextValue, isPreview: true }); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(ANALYZER_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + const { investigateInTimelineAlertClick } = useInvestigateInTimeline({}); + expect(investigateInTimelineAlertClick).not.toHaveBeenCalled(); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx index ac8e21d3fde06..843abeb7018e6 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/analyzer_preview_container.tsx @@ -27,7 +27,7 @@ const timelineId = 'timeline-1'; * Analyzer preview under Overview, Visualizations. It shows a tree representation of analyzer. */ export const AnalyzerPreviewContainer: React.FC = () => { - const { dataAsNestedObject } = useRightPanelContext(); + const { dataAsNestedObject, isPreview } = useRightPanelContext(); // decide whether to show the analyzer preview or not const isEnabled = isInvestigateInResolverActionEnabled(dataAsNestedObject); @@ -64,17 +64,18 @@ export const AnalyzerPreviewContainer: React.FC = () => { /> ), iconType: 'timeline', - ...(isEnabled && { - link: { - callback: goToAnalyzerTab, - tooltip: ( - - ), - }, - }), + ...(isEnabled && + !isPreview && { + link: { + callback: goToAnalyzerTab, + tooltip: ( + + ), + }, + }), }} data-test-subj={ANALYZER_PREVIEW_TEST_ID} > 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 38a80490ea22f..c97db50a0798b 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 @@ -12,7 +12,7 @@ import { RightPanelContext } from '../context'; import { TestProviders } from '../../../../common/mock'; import { CorrelationsOverview } from './correlations_overview'; import { CORRELATIONS_TAB_ID } from '../../left/components/correlations_details'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { CORRELATIONS_RELATED_ALERTS_BY_ANCESTRY_TEST_ID, CORRELATIONS_RELATED_ALERTS_BY_SAME_SOURCE_EVENT_TEST_ID, @@ -196,7 +196,7 @@ describe('', () => { getByTestId(TITLE_LINK_TEST_ID).click(); expect(flyoutContextValue.openLeftPanel).toHaveBeenCalledWith({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: CORRELATIONS_TAB_ID }, params: { id: panelContextValue.eventId, 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 a273257ba0fc7..52e66fed55b5d 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 @@ -22,7 +22,7 @@ import { RelatedCases } from './related_cases'; import { useShowRelatedCases } from '../../shared/hooks/use_show_related_cases'; import { CORRELATIONS_TEST_ID } from './test_ids'; import { useRightPanelContext } from '../context'; -import { LeftPanelKey, LeftPanelInsightsTab } from '../../left'; +import { DocumentDetailsLeftPanelKey, LeftPanelInsightsTab } from '../../left'; import { CORRELATIONS_TAB_ID } from '../../left/components/correlations_details'; /** @@ -43,7 +43,7 @@ export const CorrelationsOverview: React.FC = () => { const goToCorrelationsTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: CORRELATIONS_TAB_ID, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.test.tsx index 2cf9276a1853e..5f4a1ef3283eb 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.test.tsx @@ -18,7 +18,7 @@ import { RightPanelContext } from '../context'; import { mockGetFieldsData } from '../../shared/mocks/mock_get_fields_data'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import type { TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; -import { PreviewPanelKey } from '../../preview'; +import { DocumentDetailsPreviewPanelKey } from '../../preview'; const ruleUuid = { category: 'kibana', @@ -111,6 +111,15 @@ describe('', () => { expect(getByTestId(RULE_SUMMARY_BUTTON_TEST_ID)).toHaveAttribute('disabled'); }); + it('should render rule preview button as disabled if flyout is in preview', () => { + const { getByTestId } = renderDescription({ + ...panelContextValue([{ ...ruleUuid, values: [] }, ruleName, ruleDescription]), + isPreview: true, + }); + expect(getByTestId(RULE_SUMMARY_BUTTON_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(RULE_SUMMARY_BUTTON_TEST_ID)).toHaveAttribute('disabled'); + }); + it('should open preview panel when clicking on button', () => { const panelContext = panelContextValue([ruleUuid, ruleDescription, ruleName]); @@ -119,7 +128,7 @@ describe('', () => { getByTestId(RULE_SUMMARY_BUTTON_TEST_ID).click(); expect(flyoutContextValue.openPreviewPanel).toHaveBeenCalledWith({ - id: PreviewPanelKey, + id: DocumentDetailsPreviewPanelKey, path: { tab: 'rule-preview' }, params: { id: panelContext.eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx index 0003a5cd2c123..585325a1212e1 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/description.tsx @@ -20,14 +20,19 @@ import { DESCRIPTION_TITLE_TEST_ID, RULE_SUMMARY_BUTTON_TEST_ID, } from './test_ids'; -import { PreviewPanelKey, type PreviewPanelProps, RulePreviewPanel } from '../../preview'; +import { + DocumentDetailsPreviewPanelKey, + type PreviewPanelProps, + RulePreviewPanel, +} from '../../preview'; /** * Displays the description of a document. * If the document is an alert we show the rule description. If the document is of another type, we show -. */ export const Description: FC = () => { - const { dataFormattedForFieldBrowser, scopeId, eventId, indexName } = useRightPanelContext(); + const { dataFormattedForFieldBrowser, scopeId, eventId, indexName, isPreview } = + useRightPanelContext(); const { isAlert, ruleDescription, ruleName, ruleId } = useBasicDataFromDetailsData( dataFormattedForFieldBrowser ); @@ -35,7 +40,7 @@ export const Description: FC = () => { const openRulePreview = useCallback(() => { const PreviewPanelRulePreview: PreviewPanelProps['path'] = { tab: RulePreviewPanel }; openPreviewPanel({ - id: PreviewPanelKey, + id: DocumentDetailsPreviewPanelKey, path: PreviewPanelRulePreview, params: { id: eventId, @@ -71,7 +76,7 @@ export const Description: FC = () => { defaultMessage: 'Show rule summary', } )} - disabled={isEmpty(ruleName) || isEmpty(ruleId)} + disabled={isEmpty(ruleName) || isEmpty(ruleId) || isPreview} > { ), - [ruleName, openRulePreview, ruleId] + [ruleName, openRulePreview, ruleId, isPreview] ); const alertRuleDescription = 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 9434553156063..e52728b880d7b 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 @@ -15,7 +15,7 @@ import { useRightPanelContext } from '../context'; import { getField } from '../../shared/utils'; import { HostEntityOverview } from './host_entity_overview'; import { UserEntityOverview } from './user_entity_overview'; -import { LeftPanelKey, LeftPanelInsightsTab } from '../../left'; +import { DocumentDetailsLeftPanelKey, LeftPanelInsightsTab } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; /** @@ -29,7 +29,7 @@ export const EntitiesOverview: React.FC = () => { const goToEntitiesTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.test.tsx index f192a84211a47..696fb7c032cd4 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.test.tsx @@ -13,6 +13,7 @@ import { RISK_SCORE_VALUE_TEST_ID, SEVERITY_VALUE_TEST_ID, FLYOUT_HEADER_TITLE_TEST_ID, + STATUS_BUTTON_TEST_ID, } from './test_ids'; import { HeaderTitle } from './header_title'; import moment from 'moment-timezone'; @@ -56,6 +57,7 @@ describe('', () => { expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toBeInTheDocument(); expect(getByTestId(RISK_SCORE_VALUE_TEST_ID)).toBeInTheDocument(); expect(getByTestId(SEVERITY_VALUE_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(STATUS_BUTTON_TEST_ID)).toBeInTheDocument(); }); it('should render rule name in the title if document is an alert', () => { @@ -82,4 +84,32 @@ describe('', () => { expect(getByTestId(FLYOUT_HEADER_TITLE_TEST_ID)).toHaveTextContent('Event details'); }); + + it('should not render document status if document is not an alert', () => { + const contextValue = { + ...mockContextValue, + dataFormattedForFieldBrowser: [ + { + category: 'kibana', + field: 'kibana.alert.rule.name', + values: [], + originalValue: [], + isObjectArray: false, + }, + ], + } as unknown as RightPanelContext; + + const { queryByTestId } = renderHeader(contextValue); + expect(queryByTestId(STATUS_BUTTON_TEST_ID)).not.toBeInTheDocument(); + }); + + it('should not render document status if flyout is open in preview', () => { + const contextValue = { + ...mockContextValue, + isPreview: true, + } as unknown as RightPanelContext; + + const { queryByTestId } = renderHeader(contextValue); + expect(queryByTestId(STATUS_BUTTON_TEST_ID)).not.toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.tsx index 1573f5ef33bcf..c8dfa6e847412 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/header_title.tsx @@ -25,38 +25,45 @@ import { FlyoutTitle } from '../../../shared/components/flyout_title'; * Document details flyout right section header */ export const HeaderTitle: FC = memo(() => { - const { dataFormattedForFieldBrowser, eventId, scopeId } = useRightPanelContext(); + const { dataFormattedForFieldBrowser, eventId, scopeId, isPreview } = useRightPanelContext(); const { isAlert, ruleName, timestamp, ruleId } = useBasicDataFromDetailsData( dataFormattedForFieldBrowser ); const ruleTitle = useMemo( - () => ( - + () => + isPreview ? ( - - ), - [ruleName, ruleId, eventId, scopeId] + ) : ( + + + + ), + [ruleName, ruleId, eventId, scopeId, isPreview] ); const eventTitle = ( -

    +

    { {timestamp && } - {isAlert && !isEmpty(ruleName) ? ruleTitle : eventTitle} +
    + {isAlert && !isEmpty(ruleName) ? ruleTitle : eventTitle} +
    - - - + {isAlert && !isPreview && ( + + + + )} 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 717cf9856651e..806a43f9f5497 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 @@ -15,6 +15,7 @@ import { convertHighlightedFieldsToTableRow } from '../../shared/utils/highlight 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, @@ -42,6 +43,10 @@ export interface HighlightedFieldsTableRow { * Maintain backwards compatibility // TODO remove when possible */ scopeId: string; + /** + * Boolean to indicate this field is shown in a preview + */ + isPreview: boolean; }; } @@ -71,6 +76,7 @@ const columns: Array> = [ field: string; values: string[] | null | undefined; scopeId: string; + isPreview: boolean; }) => ( > = [ visibleCellActions={6} sourcererScopeId={getSourcererScopeId(description.scopeId)} metadata={{ scopeId: description.scopeId }} + disabledActionTypes={ + description.isPreview + ? [SecurityCellActionType.FILTER, SecurityCellActionType.TOGGLE_COLUMN] + : [] + } > @@ -93,7 +104,7 @@ const columns: Array> = [ * Component that displays the highlighted fields in the right panel under the Investigation section. */ export const HighlightedFields: FC = () => { - const { dataFormattedForFieldBrowser, scopeId } = useRightPanelContext(); + const { dataFormattedForFieldBrowser, scopeId, isPreview } = useRightPanelContext(); const { ruleId } = useBasicDataFromDetailsData(dataFormattedForFieldBrowser); const { loading, rule: maybeRule } = useRuleWithFallback(ruleId); @@ -102,8 +113,8 @@ export const HighlightedFields: FC = () => { investigationFields: maybeRule?.investigation_fields?.field_names ?? [], }); const items = useMemo( - () => convertHighlightedFieldsToTableRow(highlightedFields, scopeId), - [highlightedFields, scopeId] + () => convertHighlightedFieldsToTableRow(highlightedFields, scopeId, isPreview), + [highlightedFields, scopeId, isPreview] ); return ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx index 6f4711651ffc2..c56fef68a8bfa 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.test.tsx @@ -15,7 +15,7 @@ import { import { HighlightedFieldsCell } from './highlighted_fields_cell'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { RightPanelContext } from '../context'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { TestProviders } from '../../../../common/mock'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; import { useGetEndpointDetails } from '../../../../management/hooks'; @@ -64,7 +64,7 @@ describe('', () => { getByTestId(HIGHLIGHTED_FIELDS_LINKED_CELL_TEST_ID).click(); expect(flyoutContextValue.openLeftPanel).toHaveBeenCalledWith({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, params: { id: panelContextValue.eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx index 60c561116c38a..6d7c5652eadea 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/highlighted_fields_cell.tsx @@ -16,7 +16,7 @@ import { HOST_NAME_FIELD_NAME, USER_NAME_FIELD_NAME, } from '../../../../timelines/components/timeline/body/renderers/constants'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; import { HIGHLIGHTED_FIELDS_AGENT_STATUS_CELL_TEST_ID, @@ -42,7 +42,7 @@ const LinkFieldCell: VFC = ({ value }) => { const goToInsightsEntities = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, params: { id: eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx index 25c25b87aa38d..31a86495d0561 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.test.tsx @@ -22,7 +22,7 @@ import { RightPanelContext } from '../context'; import { mockContextValue } from '../mocks/mock_context'; import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; const hostName = 'host'; @@ -160,7 +160,7 @@ describe('', () => { getByTestId(ENTITIES_HOST_OVERVIEW_LINK_TEST_ID).click(); expect(flyoutContextValue.openLeftPanel).toHaveBeenCalledWith({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, params: { id: panelContextValue.eventId, 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 58d9bf9d8a418..a1d42871a42e4 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 @@ -49,7 +49,7 @@ import { ENTITIES_HOST_OVERVIEW_LINK_TEST_ID, ENTITIES_HOST_OVERVIEW_LOADING_TEST_ID, } from './test_ids'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { RiskScoreDocTooltip } from '../../../../overview/components/common'; const HOST_ICON = 'storage'; @@ -70,7 +70,7 @@ export const HostEntityOverview: React.FC = ({ hostName const { openLeftPanel } = useExpandableFlyoutContext(); const goToEntitiesTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, params: { id: eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.test.tsx index 1dd3af16ff415..d2444248d4202 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.test.tsx @@ -19,11 +19,12 @@ import { mockContextValue } from '../mocks/mock_context'; import { mockFlyoutContextValue } from '../../shared/mocks/mock_flyout_context'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { useInvestigationGuide } from '../../shared/hooks/use_investigation_guide'; -import { LeftPanelInvestigationTab, LeftPanelKey } from '../../left'; +import { LeftPanelInvestigationTab, DocumentDetailsLeftPanelKey } from '../../left'; jest.mock('../../shared/hooks/use_investigation_guide'); const NO_DATA_MESSAGE = 'Investigation guideThere’s no investigation guide for this rule.'; +const PREVIEW_MESSAGE = 'Investigation guide is not available in alert preview.'; const renderInvestigationGuide = () => render( @@ -97,6 +98,21 @@ describe('', () => { expect(getByTestId(INVESTIGATION_GUIDE_TEST_ID)).toHaveTextContent(NO_DATA_MESSAGE); }); + it('should render preview message when flyout is in preview', () => { + const { queryByTestId, getByTestId } = render( + + + + + + + + ); + + expect(queryByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(INVESTIGATION_GUIDE_TEST_ID)).toHaveTextContent(PREVIEW_MESSAGE); + }); + it('should navigate to investigation guide when clicking on button', () => { (useInvestigationGuide as jest.Mock).mockReturnValue({ loading: false, @@ -109,7 +125,7 @@ describe('', () => { getByTestId(INVESTIGATION_GUIDE_BUTTON_TEST_ID).click(); expect(mockFlyoutContextValue.openLeftPanel).toHaveBeenCalledWith({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInvestigationTab, }, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.tsx index d00310b360c26..427a9987de870 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/investigation_guide.tsx @@ -11,7 +11,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { useInvestigationGuide } from '../../shared/hooks/use_investigation_guide'; import { useRightPanelContext } from '../context'; -import { LeftPanelKey, LeftPanelInvestigationTab } from '../../left'; +import { DocumentDetailsLeftPanelKey, LeftPanelInvestigationTab } from '../../left'; import { INVESTIGATION_GUIDE_BUTTON_TEST_ID, INVESTIGATION_GUIDE_LOADING_TEST_ID, @@ -24,7 +24,8 @@ import { */ export const InvestigationGuide: React.FC = () => { const { openLeftPanel } = useExpandableFlyoutContext(); - const { eventId, indexName, scopeId, dataFormattedForFieldBrowser } = useRightPanelContext(); + const { eventId, indexName, scopeId, dataFormattedForFieldBrowser, isPreview } = + useRightPanelContext(); const { loading, error, basicAlertData, ruleNote } = useInvestigationGuide({ dataFormattedForFieldBrowser, @@ -32,7 +33,7 @@ export const InvestigationGuide: React.FC = () => { const goToInvestigationsTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInvestigationTab, }, @@ -56,7 +57,12 @@ export const InvestigationGuide: React.FC = () => {

    - {loading ? ( + {isPreview ? ( + + ) : loading ? ( ', () => { getByTestId(TITLE_LINK_TEST_ID).click(); expect(flyoutContextValue.openLeftPanel).toHaveBeenCalledWith({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: PREVALENCE_TAB_ID }, params: { id: 'eventId', diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/prevalence_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/prevalence_overview.tsx index 674b9d662f460..c7249f66065df 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/prevalence_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/prevalence_overview.tsx @@ -14,7 +14,7 @@ import { ExpandablePanel } from '../../../shared/components/expandable_panel'; import { usePrevalence } from '../../shared/hooks/use_prevalence'; import { PREVALENCE_TEST_ID } from './test_ids'; import { useRightPanelContext } from '../context'; -import { LeftPanelKey, LeftPanelInsightsTab } from '../../left'; +import { DocumentDetailsLeftPanelKey, LeftPanelInsightsTab } from '../../left'; import { PREVALENCE_TAB_ID } from '../../left/components/prevalence_details'; import { InsightsSummaryRow } from './insights_summary_row'; @@ -33,7 +33,7 @@ export const PrevalenceOverview: FC = () => { const goPrevalenceTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: PREVALENCE_TAB_ID, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.test.tsx index f407c33a1e210..65a241a00e6bb 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.test.tsx @@ -14,7 +14,7 @@ import { RightPanelContext } from '../context'; import { mockGetFieldsData } from '../../shared/mocks/mock_get_fields_data'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; -import { PreviewPanelKey } from '../../preview'; +import { DocumentDetailsPreviewPanelKey } from '../../preview'; const flyoutContextValue = { openPreviewPanel: jest.fn(), @@ -82,7 +82,7 @@ describe('', () => { getByTestId(REASON_DETAILS_PREVIEW_BUTTON_TEST_ID).click(); expect(flyoutContextValue.openPreviewPanel).toHaveBeenCalledWith({ - id: PreviewPanelKey, + id: DocumentDetailsPreviewPanelKey, path: { tab: 'alert-reason-preview' }, params: { id: panelContextValue.eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.tsx index 37629cd0678ca..392e753213714 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/reason.tsx @@ -13,7 +13,7 @@ import { ALERT_REASON } from '@kbn/rule-data-utils'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { getField } from '../../shared/utils'; -import { AlertReasonPreviewPanel, PreviewPanelKey } from '../../preview'; +import { AlertReasonPreviewPanel, DocumentDetailsPreviewPanelKey } from '../../preview'; import { REASON_DETAILS_PREVIEW_BUTTON_TEST_ID, REASON_DETAILS_TEST_ID, @@ -34,7 +34,7 @@ export const Reason: FC = () => { const { openPreviewPanel } = useExpandableFlyoutContext(); const openRulePreview = useCallback(() => { openPreviewPanel({ - id: PreviewPanelKey, + id: DocumentDetailsPreviewPanelKey, path: { tab: AlertReasonPreviewPanel }, params: { id: eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_button.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_button.tsx index 0d1b6fac8df4b..c114530f4b664 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_button.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_button.tsx @@ -9,7 +9,7 @@ import { EuiButton } from '@elastic/eui'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; import { FormattedMessage } from '@kbn/i18n-react'; import { useRightPanelContext } from '../context'; -import { LeftPanelKey, LeftPanelResponseTab } from '../../left'; +import { DocumentDetailsLeftPanelKey, LeftPanelResponseTab } from '../../left'; import { RESPONSE_BUTTON_TEST_ID } from './test_ids'; /** @@ -21,7 +21,7 @@ export const ResponseButton: React.FC = () => { const goToResponseTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelResponseTab }, params: { id: eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx index ebff6c0e704fe..2a2609b4749e0 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.test.tsx @@ -13,6 +13,8 @@ import { RightPanelContext } from '../context'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { ResponseSection } from './response_section'; +const PREVIEW_MESSAGE = 'Response is not available in alert preview.'; + const flyoutContextValue = {} as unknown as ExpandableFlyoutContext; const panelContextValue = {} as unknown as RightPanelContext; @@ -47,4 +49,18 @@ describe('', () => { getByTestId(RESPONSE_SECTION_HEADER_TEST_ID).click(); expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toBeInTheDocument(); }); + + it('should render preview message if flyout is in preview', () => { + const { getByTestId } = render( + + + + + + + + ); + getByTestId(RESPONSE_SECTION_HEADER_TEST_ID).click(); + expect(getByTestId(RESPONSE_SECTION_CONTENT_TEST_ID)).toHaveTextContent(PREVIEW_MESSAGE); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx index 96a0b070020e2..6b7ca6e282246 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/response_section.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { ResponseButton } from './response_button'; import { ExpandableSection } from './expandable_section'; +import { useRightPanelContext } from '../context'; import { RESPONSE_SECTION_TEST_ID } from './test_ids'; export interface ResponseSectionProps { /** @@ -22,6 +23,7 @@ export interface ResponseSectionProps { * Most bottom section of the overview tab. It contains a summary of the response tab. */ export const ResponseSection: VFC = ({ expanded = false }) => { + const { isPreview } = useRightPanelContext(); return ( = ({ expanded = false }) } data-test-subj={RESPONSE_SECTION_TEST_ID} > - + {isPreview ? ( + + ) : ( + + )} ); }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview.tsx index 63f07cb7ab1f3..08c15480bb7ed 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview.tsx @@ -37,7 +37,7 @@ const ValueContainer: FC<{ text?: ReactElement }> = ({ text, children }) => ( * Renders session preview under Visualizations section in the flyout right EuiPanel */ export const SessionPreview: FC = () => { - const { eventId, scopeId } = useRightPanelContext(); + const { eventId, scopeId, isPreview } = useRightPanelContext(); const { processName, userName, startAt, ruleName, ruleId, workdir, command } = useProcessData(); const { euiTheme } = useEuiTheme(); @@ -100,13 +100,13 @@ export const SessionPreview: FC = () => { fieldType={'string'} isAggregatable={false} isDraggable={false} - linkValue={ruleId} + linkValue={!isPreview ? ruleId : null} value={ruleName} /> ) ); - }, [ruleName, ruleId, scopeId, eventId]); + }, [ruleName, ruleId, scopeId, eventId, isPreview]); const commandFragment = useMemo(() => { return ( diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx index cfd5bcc525700..80d9c81a064e8 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.test.tsx @@ -40,10 +40,10 @@ const sessionViewConfig = { sessionStartTime: 'sessionStartTime', }; -const renderSessionPreview = () => +const renderSessionPreview = (context = panelContextValue) => render( - + @@ -121,4 +121,31 @@ describe('SessionPreviewContainer', () => { ).not.toHaveTextContent(NO_DATA_MESSAGE); expect(queryByTestId(SESSION_PREVIEW_TEST_ID)).not.toBeInTheDocument(); }); + + it('should not render link to session viewer if flyout is open in preview', () => { + (useSessionPreview as jest.Mock).mockReturnValue(sessionViewConfig); + (useLicense as jest.Mock).mockReturnValue({ isEnterprise: () => true }); + + const { getByTestId, queryByTestId } = renderSessionPreview({ + ...panelContextValue, + isPreview: true, + }); + + expect(getByTestId(SESSION_PREVIEW_TEST_ID)).toBeInTheDocument(); + expect( + queryByTestId(EXPANDABLE_PANEL_TOGGLE_ICON_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_ICON_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(SESSION_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx index 10250e74c383c..d0214b725a44e 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/session_preview_container.tsx @@ -29,7 +29,7 @@ const timelineId = 'timeline-1'; * Checks if the SessionView component is available, if so render it or else render an error message */ export const SessionPreviewContainer: FC = () => { - const { dataAsNestedObject, getFieldsData } = useRightPanelContext(); + const { dataAsNestedObject, getFieldsData, isPreview } = useRightPanelContext(); // decide whether to show the session view or not const sessionViewConfig = useSessionPreview({ getFieldsData }); @@ -122,17 +122,18 @@ export const SessionPreviewContainer: FC = () => { /> ), iconType: 'timeline', - ...(isEnabled && { - link: { - callback: goToSessionViewTab, - tooltip: ( - - ), - }, - }), + ...(isEnabled && + !isPreview && { + link: { + callback: goToSessionViewTab, + tooltip: ( + + ), + }, + }), }} data-test-subj={SESSION_PREVIEW_TEST_ID} > diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts index 28d76c040ebbb..0cbde8fa94e1a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts @@ -97,8 +97,6 @@ export const ENTITIES_HOST_OVERVIEW_LAST_SEEN_TEST_ID = `${ENTITIES_HOST_OVERVIEW_TEST_ID}LastSeen` as const; export const ENTITIES_HOST_OVERVIEW_RISK_LEVEL_TEST_ID = `${ENTITIES_HOST_OVERVIEW_TEST_ID}RiskLevel` as const; -export const TECHNICAL_PREVIEW_ICON_TEST_ID = - `${INSIGHTS_ENTITIES_TEST_ID}TechnicalPreviewIcon` as const; /* Threat intelligence */ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.test.tsx index 1b8a646f1d356..f5ae35db72f16 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.test.tsx @@ -11,7 +11,7 @@ import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { RightPanelContext } from '../context'; import { TestProviders } from '../../../../common/mock'; import { ThreatIntelligenceOverview } from './threat_intelligence_overview'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { useFetchThreatIntelligence } from '../hooks/use_fetch_threat_intelligence'; import { THREAT_INTELLIGENCE_TAB_ID } from '../../left/components/threat_intelligence_details'; import { INSIGHTS_THREAT_INTELLIGENCE_TEST_ID } from './test_ids'; @@ -161,7 +161,7 @@ describe('', () => { getByTestId(TITLE_LINK_TEST_ID).click(); expect(flyoutContextValue.openLeftPanel).toHaveBeenCalledWith({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: THREAT_INTELLIGENCE_TAB_ID }, params: { id: panelContextValue.eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.tsx index ebaea597219ac..d57fb1d6c0aab 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/threat_intelligence_overview.tsx @@ -15,7 +15,7 @@ import { useFetchThreatIntelligence } from '../hooks/use_fetch_threat_intelligen import { InsightsSummaryRow } from './insights_summary_row'; import { useRightPanelContext } from '../context'; import { INSIGHTS_THREAT_INTELLIGENCE_TEST_ID } from './test_ids'; -import { LeftPanelKey, LeftPanelInsightsTab } from '../../left'; +import { DocumentDetailsLeftPanelKey, LeftPanelInsightsTab } from '../../left'; import { THREAT_INTELLIGENCE_TAB_ID } from '../../left/components/threat_intelligence_details'; /** @@ -29,7 +29,7 @@ export const ThreatIntelligenceOverview: FC = () => { const goToThreatIntelligenceTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: THREAT_INTELLIGENCE_TAB_ID, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx index 37b4666611efe..155f2c127fc3c 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.test.tsx @@ -22,7 +22,7 @@ import { mockContextValue } from '../mocks/mock_context'; import { mockDataFormattedForFieldBrowser } from '../../shared/mocks/mock_data_formatted_for_field_browser'; import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; import { RightPanelContext } from '../context'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +import { LeftPanelInsightsTab, DocumentDetailsLeftPanelKey } from '../../left'; import { ENTITIES_TAB_ID } from '../../left/components/entities_details'; const userName = 'user'; @@ -169,7 +169,7 @@ describe('', () => { getByTestId(ENTITIES_USER_OVERVIEW_LINK_TEST_ID).click(); expect(flyoutContextValue.openLeftPanel).toHaveBeenCalledWith({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, params: { id: panelContextValue.eventId, 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 81b1b75df57e9..313719ec1c0ba 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 @@ -19,7 +19,7 @@ import { css } from '@emotion/css'; import { getOr } from 'lodash/fp'; import { i18n } from '@kbn/i18n'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; -import { LeftPanelInsightsTab, LeftPanelKey } from '../../left'; +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'; @@ -70,7 +70,7 @@ export const UserEntityOverview: React.FC = ({ userName const { openLeftPanel } = useExpandableFlyoutContext(); const goToEntitiesTab = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, path: { tab: LeftPanelInsightsTab, subTab: ENTITIES_TAB_ID }, params: { id: eventId, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/context.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/context.tsx index b46645aaf883c..7311a030b2175 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/context.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/context.tsx @@ -8,6 +8,7 @@ import type { BrowserFields, TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; import React, { createContext, memo, useContext, useMemo } from 'react'; import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; +import { TableId } from '@kbn/securitysolution-data-table'; import { useEventDetails } from '../shared/hooks/use_event_details'; import { FlyoutError } from '../../shared/components/flyout_error'; @@ -59,6 +60,10 @@ export interface RightPanelContext { * Retrieves searchHit values for the provided field */ getFieldsData: GetFieldsData; + /** + * Boolean to indicate whether it is a preview flyout + */ + isPreview: boolean; } export const RightPanelContext = createContext(undefined); @@ -104,6 +109,7 @@ export const RightPanelProvider = memo( investigationFields: maybeRule?.investigation_fields?.field_names ?? [], refetchFlyoutData, getFieldsData, + isPreview: scopeId === TableId.rulePreview, } : undefined, [ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/footer.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/footer.tsx index 49ad491efa4d1..995beea63a70f 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/footer.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/footer.tsx @@ -15,10 +15,17 @@ import { useHostIsolationTools } from '../../../timelines/components/side_panel/ import { DEFAULT_DARK_MODE } from '../../../../common/constants'; import { useUiSetting } from '../../../common/lib/kibana'; +interface PanelFooterProps { + /** + * Boolean that indicates whether flyout is in preview and action should be hidden + */ + isPreview: boolean; +} + /** * */ -export const PanelFooter: FC = () => { +export const PanelFooter: FC = ({ isPreview }) => { const { closeFlyout, openRightPanel } = useExpandableFlyoutContext(); const { eventId, @@ -48,7 +55,7 @@ export const PanelFooter: FC = () => { [eventId, indexName, openRightPanel, scopeId, showHostIsolationPanel] ); - return ( + return !isPreview ? ( { refetchFlyoutData={refetchFlyoutData} /> - ); + ) : null; }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/index.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/index.tsx index 35470f21f8085..08142a0ef08ba 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/index.tsx @@ -20,7 +20,7 @@ import { tabs } from './tabs'; import { PanelFooter } from './footer'; export type RightPanelPaths = 'overview' | 'table' | 'json'; -export const RightPanelKey: RightPanelProps['key'] = 'document-details-right'; +export const DocumentDetailsRightPanelKey: RightPanelProps['key'] = 'document-details-right'; export interface RightPanelProps extends FlyoutPanelProps { key: 'document-details-right'; @@ -37,7 +37,7 @@ export interface RightPanelProps extends FlyoutPanelProps { */ export const RightPanel: FC> = memo(({ path }) => { const { openRightPanel } = useExpandableFlyoutContext(); - const { eventId, getFieldsData, indexName, scopeId } = useRightPanelContext(); + const { eventId, getFieldsData, indexName, scopeId, isPreview } = useRightPanelContext(); // for 8.10, we only render the flyout in its expandable mode if the document viewed is of type signal const documentIsSignal = getField(getFieldsData('event.kind')) === EventKind.signal; @@ -51,7 +51,7 @@ export const RightPanel: FC> = memo(({ path }) => { const setSelectedTabId = (tabId: RightPanelTabsType[number]['id']) => { openRightPanel({ - id: RightPanelKey, + id: DocumentDetailsRightPanelKey, path: { tab: tabId, }, @@ -72,7 +72,7 @@ export const RightPanel: FC> = memo(({ path }) => { setSelectedTabId={setSelectedTabId} /> - + ); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/mocks/mock_context.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/mocks/mock_context.ts index 2bb599a657591..086c272bee359 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/mocks/mock_context.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/mocks/mock_context.ts @@ -26,4 +26,5 @@ export const mockContextValue: RightPanelContext = { searchHit: mockSearchHit, investigationFields: [], refetchFlyoutData: jest.fn(), + isPreview: false, }; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/navigation.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/navigation.tsx index 12e36ea29e5a0..d78784f164985 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/navigation.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/navigation.tsx @@ -10,7 +10,7 @@ import React, { memo, useCallback } from 'react'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; import { HeaderActions } from './components/header_actions'; import { FlyoutNavigation } from '../../shared/components/flyout_navigation'; -import { LeftPanelKey } from '../left'; +import { DocumentDetailsLeftPanelKey } from '../left'; import { useRightPanelContext } from './context'; interface PanelNavigationProps { @@ -26,7 +26,7 @@ export const PanelNavigation: FC = memo(({ flyoutIsExpanda const expandDetails = useCallback(() => { openLeftPanel({ - id: LeftPanelKey, + id: DocumentDetailsLeftPanelKey, params: { id: eventId, indexName, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/json_tab.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/json_tab.tsx index 6d329811f7228..313e8f952e1a3 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/json_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/tabs/json_tab.tsx @@ -23,7 +23,7 @@ const FLYOUT_FOOTER_HEIGHT = 72; * Json view displayed in the document details expandable flyout right section */ export const JsonTab: FC = memo(() => { - const { searchHit } = useRightPanelContext(); + const { searchHit, isPreview } = useRightPanelContext(); const jsonValue = JSON.stringify(searchHit, null, 2); const flexGroupElement = useRef(null); @@ -31,19 +31,20 @@ export const JsonTab: FC = memo(() => { useEffect(() => { const topPosition = flexGroupElement?.current?.getBoundingClientRect().top || 0; + const footerOffset = isPreview ? 0 : FLYOUT_FOOTER_HEIGHT; const height = window.innerHeight - topPosition - COPY_TO_CLIPBOARD_BUTTON_HEIGHT - FLYOUT_BODY_PADDING - - FLYOUT_FOOTER_HEIGHT; + footerOffset; if (height === 0) { return; } setEditorHeight(height); - }, [setEditorHeight]); + }, [setEditorHeight, isPreview]); return ( { return { right: { - id: RightPanelKey, + id: DocumentDetailsRightPanelKey, params: { id: eventId, indexName: index, diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.test.ts index 3992966878192..1565837f90fc2 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.test.ts @@ -11,6 +11,7 @@ import { } from './highlighted_fields_helpers'; const scopeId = 'scopeId'; +const isPreview = false; describe('convertHighlightedFieldsToTableRow', () => { it('should convert highlighted fields to a table row', () => { @@ -19,13 +20,14 @@ describe('convertHighlightedFieldsToTableRow', () => { values: ['host-1'], }, }; - expect(convertHighlightedFieldsToTableRow(highlightedFields, scopeId)).toEqual([ + expect(convertHighlightedFieldsToTableRow(highlightedFields, scopeId, isPreview)).toEqual([ { field: 'host.name', description: { field: 'host.name', values: ['host-1'], scopeId: 'scopeId', + isPreview, }, }, ]); @@ -38,13 +40,14 @@ describe('convertHighlightedFieldsToTableRow', () => { values: ['host-1'], }, }; - expect(convertHighlightedFieldsToTableRow(highlightedFields, scopeId)).toEqual([ + expect(convertHighlightedFieldsToTableRow(highlightedFields, scopeId, isPreview)).toEqual([ { field: 'host.name-override', description: { field: 'host.name-override', values: ['host-1'], scopeId: 'scopeId', + isPreview, }, }, ]); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.ts index d41ff1b75f28a..6cf1ec9291efe 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/utils/highlighted_fields_helpers.ts @@ -16,7 +16,8 @@ import type { HighlightedFieldsTableRow } from '../../right/components/highlight */ export const convertHighlightedFieldsToTableRow = ( highlightedFields: UseHighlightedFieldsResult, - scopeId: string + scopeId: string, + isPreview: boolean ): HighlightedFieldsTableRow[] => { const fieldNames = Object.keys(highlightedFields); return fieldNames.map((fieldName) => { @@ -30,6 +31,7 @@ export const convertHighlightedFieldsToTableRow = ( field, values, scopeId, + isPreview, }, }; }); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/action_column.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/action_column.test.tsx new file mode 100644 index 0000000000000..9df74c2d60846 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/action_column.test.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 { fireEvent, render } from '@testing-library/react'; +import React from 'react'; +import { TestProviders } from '../../../../common/mock'; +import { ActionColumn } from './action_column'; +import { alertDataMock } from '../mocks'; + +describe('ActionColumn', () => { + it('renders', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-inputs-actions')).toBeInTheDocument(); + }); + + it('toggles the popover when button is clicked', () => { + const { getByRole } = render( + + + + ); + + fireEvent.click(getByRole('button')); + + expect(getByRole('dialog')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/action_column.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/action_column.tsx new file mode 100644 index 0000000000000..35b25d69fffce --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/action_column.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 { EuiButtonIcon, EuiContextMenu, EuiPopover } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useCallback, useMemo, useState } from 'react'; +import type { AlertRawData } from '../content'; +import { useRiskInputActionsPanels } from '../hooks/use_risk_input_actions_panels'; + +interface ActionColumnProps { + alert: AlertRawData; +} + +export const ActionColumn: React.FC = ({ alert }) => { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const closePopover = useCallback(() => setIsPopoverOpen(false), []); + const togglePopover = useCallback(() => setIsPopoverOpen((isOpen) => !isOpen), []); + const alerts = useMemo(() => [alert], [alert]); + const panels = useRiskInputActionsPanels(alerts, closePopover); + + return ( + + } + isOpen={isPopoverOpen} + closePopover={closePopover} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + ); +}; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/utility_bar.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/utility_bar.test.tsx new file mode 100644 index 0000000000000..aeb244e537bda --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/utility_bar.test.tsx @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { fireEvent, render } from '@testing-library/react'; +import React from 'react'; +import { TestProviders } from '../../../../common/mock'; +import { alertDataMock } from '../mocks'; +import { RiskInputsUtilityBar } from './utility_bar'; + +describe('RiskInputsPanel', () => { + it('renders', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-input-utility-bar')).toBeInTheDocument(); + }); + + it('renders current page message when totalItemCount is 1', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-input-utility-bar')).toHaveTextContent('Showing 1 Risk input'); + }); + + it('renders current page message when totalItemCount is 20', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-input-utility-bar')).toHaveTextContent( + 'Showing 1-10 of 20 Risk input' + ); + }); + + it('renders current page message when totalItemCount is 20 and on the second page', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-input-utility-bar')).toHaveTextContent( + 'Showing 11-20 of 20 Risk inputs' + ); + }); + + it('renders selected risk input message', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-input-utility-bar')).toHaveTextContent('3 selected risk input'); + }); + + it('toggles the popover when button is clicked', () => { + const { getByRole } = render( + + + + ); + + fireEvent.click(getByRole('button')); + + expect(getByRole('dialog')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/utility_bar.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/utility_bar.tsx new file mode 100644 index 0000000000000..40e3497a04945 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/components/utility_bar.tsx @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FunctionComponent } from 'react'; +import React, { useCallback, useState } from 'react'; +import type { Pagination } from '@elastic/eui'; +import { + EuiButtonEmpty, + EuiContextMenu, + EuiFlexGroup, + EuiFlexItem, + EuiPopover, + EuiText, + useEuiTheme, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/react'; +import { useRiskInputActionsPanels } from '../hooks/use_risk_input_actions_panels'; +import type { AlertRawData } from '../content'; + +interface Props { + selectedAlerts: AlertRawData[]; + pagination: Pagination; +} + +export const RiskInputsUtilityBar: FunctionComponent = React.memo( + ({ selectedAlerts, pagination }) => { + const { euiTheme } = useEuiTheme(); + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const togglePopover = useCallback(() => setIsPopoverOpen(!isPopoverOpen), [isPopoverOpen]); + const closePopover = useCallback(() => setIsPopoverOpen(false), []); + const panels = useRiskInputActionsPanels(selectedAlerts, closePopover); + const displayedCurrentPage = pagination.pageIndex + 1; + const pageSize = pagination.pageSize ?? 10; + const fromItem: number = pagination.pageIndex * pageSize + 1; + const toItem: number = Math.min(pagination.totalItemCount, pageSize * displayedCurrentPage); + + return ( + <> + + + + {pagination.totalItemCount <= 1 ? ( + + + + ), + }} + /> + ) : ( + {`${fromItem}-${toItem}`}, + totalInputs: pagination.totalItemCount, + riskInputs: ( + + + + ), + }} + /> + )} + + + + {selectedAlerts.length > 0 && ( + + + + } + > + + + )} + + + + ); + } +); + +RiskInputsUtilityBar.displayName = 'RiskInputsUtilityBar'; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/content.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/content.test.tsx new file mode 100644 index 0000000000000..93396e7dea03a --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/content.test.tsx @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SimpleRiskInput } from '../../../../common/risk_engine'; +import { RiskCategories } from '../../../../common/risk_engine'; +import { fireEvent, render } from '@testing-library/react'; +import React from 'react'; +import { RiskInputsPanel } from '.'; +import { TestProviders } from '../../../common/mock'; +import { times } from 'lodash/fp'; +import { alertDataMock } from './mocks'; + +const mockUseAlertsByIds = jest.fn().mockReturnValue({ loading: false, data: [] }); + +jest.mock('../../../common/containers/alerts/use_alerts_by_ids', () => ({ + useAlertsByIds: () => mockUseAlertsByIds(), +})); + +const TEST_RISK_INPUT: SimpleRiskInput = { + id: '123', + index: '_test_index', + category: RiskCategories.category_1, + description: 'test description', + risk_score: 70, + timestamp: '2023-05-15T16:12:14.967Z', +}; + +describe('RiskInputsPanel', () => { + it('renders', () => { + mockUseAlertsByIds.mockReturnValue({ + loading: false, + error: false, + data: [alertDataMock], + }); + + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-inputs-panel')).toBeInTheDocument(); + expect(getByTestId('risk-input-table-description-cell')).toHaveTextContent( + 'Risk inputRule Name' + ); + }); + + it('paginates', () => { + const riskInputs = times((index) => ({ ...TEST_RISK_INPUT, id: index.toString() }), 11); + const alerts = times((index) => ({ ...alertDataMock, _id: index.toString() }), 11); + + mockUseAlertsByIds.mockReturnValue({ + loading: false, + error: false, + data: alerts, + }); + + const { getAllByTestId, getByLabelText } = render( + + + + ); + + expect(getAllByTestId('risk-input-table-description-cell')).toHaveLength(10); + + fireEvent.click(getByLabelText('Next page')); + + expect(getAllByTestId('risk-input-table-description-cell')).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/content.tsx new file mode 100644 index 0000000000000..544dca9df62a8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/content.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 type { EuiBasicTableColumn, Pagination } from '@elastic/eui'; +import { useEuiBackgroundColor, EuiSpacer, EuiInMemoryTable, EuiTitle } from '@elastic/eui'; +import React, { useCallback, useMemo, useState } from 'react'; +import { css } from '@emotion/react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { get } from 'lodash/fp'; +import { ALERT_RULE_NAME } from '@kbn/rule-data-utils'; +import type { RiskInputs } from '../../../../common/risk_engine'; +import { ActionColumn } from './components/action_column'; +import { PreferenceFormattedDate } from '../../../common/components/formatted_date'; +import { RiskInputsUtilityBar } from './components/utility_bar'; +import { useAlertsByIds } from '../../../common/containers/alerts/use_alerts_by_ids'; +import { FlyoutBody } from '../../shared/components/flyout_body'; + +export interface RiskInputsPanelContentProps extends Record { + riskInputs: RiskInputs; +} + +export interface AlertRawData { + fields: Record; + _index: string; + _id: string; +} + +export const RiskInputsPanelContent = ({ riskInputs }: RiskInputsPanelContentProps) => { + const [selectedItems, setSelectedItems] = useState([]); + const alertIds = useMemo(() => riskInputs.map(({ id }) => id), [riskInputs]); + const { loading, data: alertsData } = useAlertsByIds({ alertIds }); + + const euiTableSelectionProps = useMemo( + () => ({ + onSelectionChange: (selected: AlertRawData[]) => { + setSelectedItems(selected); + }, + initialSelected: [], + selectable: () => true, + }), + [] + ); + + const columns: Array> = useMemo( + () => [ + { + name: ( + + ), + width: '80px', + render: (alert: AlertRawData) => { + return ; + }, + }, + { + field: 'fields.@timestamp', + name: ( + + ), + truncateText: false, + mobileOptions: { show: true }, + sortable: true, + width: '30%', + render: (timestamp: string) => , + }, + { + field: 'fields', + 'data-test-subj': 'risk-input-table-description-cell', + name: ( + + ), + truncateText: true, + mobileOptions: { show: true }, + sortable: true, + render: (fields: AlertRawData['fields']) => get(ALERT_RULE_NAME, fields), + }, + ], + [] + ); + + const [currentPage, setCurrentPage] = useState<{ + index: number; + size: number; + }>({ index: 0, size: 10 }); + + const onTableChange = useCallback(({ page }) => { + setCurrentPage(page); + }, []); + + const pagination: Pagination = useMemo( + () => ({ + totalItemCount: riskInputs.length, + pageIndex: currentPage.index, + pageSize: currentPage.size, + }), + [currentPage.index, currentPage.size, riskInputs.length] + ); + + return ( + <> + + +

    + +

    +
    + + {/* Temporary label. It will be replaced by a filter */} + +

    + +

    +
    + + + + +
    + + ); +}; + +RiskInputsPanelContent.displayName = 'RiskInputsPanelContent'; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions.ts b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions.ts new file mode 100644 index 0000000000000..6a8643c7fd9f3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TableId } from '@kbn/securitysolution-data-table'; +import { useMemo } from 'react'; +import { get, noop } from 'lodash/fp'; +import { AttachmentType } from '@kbn/cases-plugin/common'; +import type { CaseAttachmentsWithoutOwner } from '@kbn/cases-plugin/public'; +import { ALERT_RULE_NAME, ALERT_RULE_UUID } from '@kbn/rule-data-utils'; +import { useGlobalTime } from '../../../../common/containers/use_global_time'; +import { SourcererScopeName } from '../../../../common/store/sourcerer/model'; +import { useAddBulkToTimelineAction } from '../../../../detections/components/alerts_table/timeline_actions/use_add_bulk_to_timeline'; +import { useKibana } from '../../../../common/lib/kibana/kibana_react'; +import type { AlertRawData } from '../content'; + +/** + * The returned actions only support alerts risk inputs. + */ +export const useRiskInputActions = (alerts: AlertRawData[], closePopover: () => void) => { + const { from, to } = useGlobalTime(); + const timelineAction = useAddBulkToTimelineAction({ + localFilters: [], + from, + to, + scopeId: SourcererScopeName.detections, + tableId: TableId.riskInputs, + }); + + const { cases: casesService } = useKibana().services; + const createCaseFlyout = casesService?.hooks.useCasesAddToNewCaseFlyout({ onSuccess: noop }); + const selectCaseModal = casesService?.hooks.useCasesAddToExistingCaseModal(); + + const caseAttachments: CaseAttachmentsWithoutOwner = useMemo( + () => + alerts.map((alert: AlertRawData) => ({ + alertId: alert._id, + index: alert._index, + type: AttachmentType.alert, + rule: { + id: get(ALERT_RULE_UUID, alert.fields)[0], + name: get(ALERT_RULE_NAME, alert.fields)[0], + }, + })), + [alerts] + ); + + return useMemo( + () => ({ + addToExistingCase: () => { + closePopover(); + selectCaseModal.open({ getAttachments: () => caseAttachments }); + }, + addToNewCaseClick: () => { + closePopover(); + createCaseFlyout.open({ attachments: caseAttachments }); + }, + addToNewTimeline: () => { + closePopover(); + timelineAction.onClick( + alerts.map((alert: AlertRawData) => { + return { + _id: alert._id, + _index: alert._index, + data: [], + ecs: { + _id: alert._id, + _index: alert._index, + }, + }; + }), + false, + noop, + noop, + noop + ); + }, + }), + [alerts, caseAttachments, closePopover, createCaseFlyout, selectCaseModal, timelineAction] + ); +}; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions_panels.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions_panels.test.tsx new file mode 100644 index 0000000000000..49bad231f2767 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions_panels.test.tsx @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { EuiContextMenuPanelDescriptor } from '@elastic/eui'; +import { EuiContextMenu } from '@elastic/eui'; +import { casesPluginMock } from '@kbn/cases-plugin/public/mocks'; +import { render } from '@testing-library/react'; +import { renderHook } from '@testing-library/react-hooks'; +import React from 'react'; +import { TestProviders } from '../../../../common/mock'; +import { alertDataMock } from '../mocks'; +import { useRiskInputActionsPanels } from './use_risk_input_actions_panels'; + +const casesServiceMock = casesPluginMock.createStartContract(); +const mockCanUseCases = jest.fn().mockReturnValue({ + create: true, + read: true, +}); + +const mockedCasesServices = { + ...casesServiceMock, + helpers: { + ...casesServiceMock.helpers, + canUseCases: mockCanUseCases, + }, +}; + +jest.mock('@kbn/kibana-react-plugin/public', () => { + const original = jest.requireActual('@kbn/kibana-react-plugin/public'); + return { + ...original, + useKibana: () => ({ + ...original.useKibana(), + services: { + ...original.useKibana().services, + cases: mockedCasesServices, + }, + }), + }; +}); + +const TestMenu = ({ panels }: { panels: EuiContextMenuPanelDescriptor[] }) => ( + +); + +const customRender = (alerts = [alertDataMock]) => { + const { result } = renderHook(() => useRiskInputActionsPanels(alerts, () => {}), { + wrapper: TestProviders, + }); + + return render( + + + + ); +}; + +describe('useRiskInputActionsPanels', () => { + it('displays the rule name when only one alert is selected', () => { + const { getByTestId } = customRender(); + + expect(getByTestId('contextMenuPanelTitle')).toHaveTextContent('Risk input: Rule Name'); + }); + + it('displays number of selected alerts when more than one alert is selected', () => { + const { getByTestId } = customRender([alertDataMock, alertDataMock]); + + expect(getByTestId('contextMenuPanelTitle')).toHaveTextContent('2 selected'); + }); + + it('displays cases actions when user has cases permissions', () => { + const { container } = customRender(); + + expect(container).toHaveTextContent('Add to existing case'); + expect(container).toHaveTextContent('Add to new case'); + }); + + it('does NOT display cases actions when user has NO cases permissions', () => { + mockCanUseCases.mockReturnValue({ + create: false, + read: false, + }); + + const { container } = customRender(); + + expect(container).not.toHaveTextContent('Add to existing case'); + expect(container).not.toHaveTextContent('Add to new case'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions_panels.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions_panels.tsx new file mode 100644 index 0000000000000..176b2a13db72d --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/hooks/use_risk_input_actions_panels.tsx @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiTextTruncate } from '@elastic/eui'; +import React, { useMemo } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { SECURITY_SOLUTION_OWNER } from '@kbn/cases-plugin/common'; +import type { CasesService } from '@kbn/triggers-actions-ui-plugin/public/application/sections/alerts_table/types'; +import { i18n } from '@kbn/i18n'; +import { get } from 'lodash/fp'; +import { ALERT_RULE_NAME } from '@kbn/rule-data-utils'; +import { useRiskInputActions } from './use_risk_input_actions'; +import type { AlertRawData } from '../content'; + +export const useRiskInputActionsPanels = (alerts: AlertRawData[], closePopover: () => void) => { + const { cases: casesService } = useKibana<{ cases?: CasesService }>().services; + const { addToExistingCase, addToNewCaseClick, addToNewTimeline } = useRiskInputActions( + alerts, + closePopover + ); + const userCasesPermissions = casesService?.helpers.canUseCases([SECURITY_SOLUTION_OWNER]); + const hasCasesPermissions = userCasesPermissions?.create && userCasesPermissions?.read; + + return useMemo(() => { + const timelinePanel = { + name: ( + + ), + + onClick: addToNewTimeline, + }; + const ruleName = get(['fields', ALERT_RULE_NAME], alerts[0]) ?? ['']; + const title = i18n.translate( + 'xpack.securitySolution.flyout.entityDetails.riskInputs.actions.title', + { + defaultMessage: 'Risk input: {description}', + values: { + description: + alerts.length === 1 + ? ruleName[0] + : i18n.translate( + 'xpack.securitySolution.flyout.entityDetails.riskInputs.actions.titleDescription', + { + defaultMessage: '{quantity} selected', + values: { + quantity: alerts.length, + }, + } + ), + }, + } + ); + + return [ + { + title: ( + + ), + id: 0, + items: hasCasesPermissions + ? [ + timelinePanel, + { + name: ( + + ), + + onClick: addToNewCaseClick, + }, + + { + name: ( + + ), + + onClick: addToExistingCase, + }, + ] + : [timelinePanel], + }, + ]; + }, [addToExistingCase, addToNewCaseClick, addToNewTimeline, alerts, hasCasesPermissions]); +}; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/index.tsx new file mode 100644 index 0000000000000..386ec25bfeaf8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/index.tsx @@ -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 React from 'react'; +import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; +import type { RiskInputs } from '../../../../common/risk_engine'; +import { RiskInputsPanelContent } from './content'; + +export interface RiskInputsPanelProps extends Record { + riskInputs: RiskInputs; +} + +export interface RiskInputsExpandableFlyoutProps extends FlyoutPanelProps { + key: 'all-risk-inputs'; + params: RiskInputsPanelProps; +} + +export const RiskInputsPanelKey: RiskInputsExpandableFlyoutProps['key'] = 'all-risk-inputs'; + +export const RiskInputsPanel = ({ riskInputs }: RiskInputsPanelProps) => { + return ; +}; + +RiskInputsPanel.displayName = 'RiskInputsPanel'; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/mocks/index.ts b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/mocks/index.ts new file mode 100644 index 0000000000000..9e6f5db17034c --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/risk_inputs_left/mocks/index.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 { ALERT_RULE_NAME, ALERT_RULE_UUID } from '@kbn/rule-data-utils'; +import type { AlertRawData } from '../content'; + +export const alertDataMock: AlertRawData = { + _id: 'test-id', + _index: 'test-index', + fields: { + [ALERT_RULE_UUID]: ['2e051244-b3c6-4779-a241-e1b4f0beceb9'], + '@timestamp': ['2023-07-20T20:31:24.896Z'], + [ALERT_RULE_NAME]: ['Rule Name'], + }, +}; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.stories.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.stories.tsx new file mode 100644 index 0000000000000..e45869115c50f --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.stories.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { Story } from '@storybook/react'; +import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; +import { StorybookProviders } from '../../../../common/mock/storybook_providers'; +import { mockRiskScoreState } from '../../../../timelines/components/side_panel/new_user_detail/__mocks__'; +import { RiskSummary } from './risk_summary'; + +export default { + component: RiskSummary, + title: 'Components/RiskSummary', +}; + +const flyoutContextValue = { + openLeftPanel: () => window.alert('openLeftPanel called'), + panels: {}, +} as unknown as ExpandableFlyoutContext; + +export const Default: Story = () => { + return ( + + +
    + +
    +
    +
    + ); +}; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.test.tsx new file mode 100644 index 0000000000000..774a7c8a8458e --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.test.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; +import { TestProviders } from '../../../../common/mock'; +import { mockRiskScoreState } from '../../user_right/mocks'; +import { RiskSummary } from './risk_summary'; + +jest.mock('../../../../common/components/visualization_actions/visualization_embeddable'); + +describe('RiskSummary', () => { + it('renders risk summary table', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-summary-table')).toBeInTheDocument(); + expect(getByTestId('risk-summary-table')).toHaveTextContent('Inputs1'); + expect(getByTestId('risk-summary-table')).toHaveTextContent('CategoryAlerts'); + }); + + it('renders risk summary table when riskScoreData is empty', () => { + const { getByTestId } = render( + + + + ); + expect(getByTestId('risk-summary-table')).toBeInTheDocument(); + }); + + it('renders visualization embeddable', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('visualization-embeddable')).toBeInTheDocument(); + }); + + it('renders updated at', () => { + const { getByTestId } = render( + + + + ); + + expect(getByTestId('risk-summary-updatedAt')).toHaveTextContent('Updated Nov 8, 1989'); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.tsx new file mode 100644 index 0000000000000..763a6377a9d67 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/shared/components/risk_summary.tsx @@ -0,0 +1,254 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useMemo } from 'react'; +import type { EuiBasicTableColumn } from '@elastic/eui'; +import { + useEuiTheme, + EuiAccordion, + EuiTitle, + EuiSpacer, + EuiBasicTable, + EuiFlexGroup, + EuiFlexItem, + useEuiFontSize, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { euiThemeVars } from '@kbn/ui-theme'; +import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; +import { i18n } from '@kbn/i18n'; +import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; +import { ONE_WEEK_IN_HOURS } from '../../../../timelines/components/side_panel/new_user_detail/constants'; +import { FormattedRelativePreferenceDate } from '../../../../common/components/formatted_date'; +import { RiskScoreEntity } from '../../../../../common/risk_engine'; +import type { RiskScoreState } from '../../../../explore/containers/risk_score'; +import { VisualizationEmbeddable } from '../../../../common/components/visualization_actions/visualization_embeddable'; +import { getRiskScoreSummaryAttributes } from '../../../../common/components/visualization_actions/lens_attributes/common/risk_scores/risk_score_summary'; +import { ExpandablePanel } from '../../../shared/components/expandable_panel'; +import { RiskInputsPanelKey } from '../../risk_inputs_left'; + +export interface RiskSummaryProps { + riskScoreData: RiskScoreState; + queryId: string; +} + +interface TableItem { + category: string; + count: number; +} +const LENS_VISUALIZATION_HEIGHT = 126; // Static height in pixels specified by design +const LAST_30_DAYS = { from: 'now-30d', to: 'now' }; + +export const RiskSummary = React.memo(({ riskScoreData, queryId }: RiskSummaryProps) => { + const { data: userRisk } = riskScoreData; + const userRiskData = userRisk && userRisk.length > 0 ? userRisk[0] : undefined; + const { euiTheme } = useEuiTheme(); + + const { openLeftPanel } = useExpandableFlyoutContext(); + const openPanel = useCallback(() => { + openLeftPanel({ + id: RiskInputsPanelKey, + params: { + riskInputs: userRiskData?.user.risk.inputs, + }, + }); + }, [openLeftPanel, userRiskData?.user.risk.inputs]); + + const lensAttributes = useMemo(() => { + return getRiskScoreSummaryAttributes({ + severity: userRiskData?.user?.risk?.calculated_level, + query: `user.name: ${userRiskData?.user?.name}`, + spaceId: 'default', + riskEntity: RiskScoreEntity.user, + }); + }, [userRiskData]); + + const columns: Array> = useMemo( + () => [ + { + field: 'category', + name: ( + + ), + truncateText: false, + mobileOptions: { show: true }, + sortable: true, + }, + { + field: 'count', + name: ( + + ), + truncateText: false, + mobileOptions: { show: true }, + sortable: true, + dataType: 'number', + }, + ], + [] + ); + + const xsFontSize = useEuiFontSize('xxs').fontSize; + + const items: TableItem[] = useMemo( + () => [ + { + category: i18n.translate('xpack.securitySolution.flyout.entityDetails.alertsGroupLabel', { + defaultMessage: 'Alerts', + }), + count: userRiskData?.user.risk.inputs?.length ?? 0, + }, + ], + [userRiskData?.user.risk.inputs?.length] + ); + + return ( + +

    + +

    + + } + extraAction={ + + {userRiskData && ( + + ), + }} + /> + )} + + } + > + + + + ), + link: { + callback: openPanel, + tooltip: ( + + ), + }, + iconType: 'arrowStart', + }} + expand={{ + expandable: false, + }} + > + + +
    + {userRiskData && ( + + } + /> + )} +
    +
    + + +
    +
    + + } + /> +
    + +
    +
    +
    +
    +
    + +
    + ); +}); +RiskSummary.displayName = 'RiskSummary'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.stories.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.stories.tsx similarity index 79% rename from x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.stories.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.stories.tsx index 1f82d21c65321..746aa8b25e0f1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.stories.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/content.stories.tsx @@ -7,22 +7,33 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; -import { EuiFlyout, EuiFlyoutBody } from '@elastic/eui'; -import { UserDetailsContentComponent } from './user_details_content'; -import { StorybookProviders } from '../../../../common/mock/storybook_providers'; -import { mockManagedUser, mockObservedUser, mockRiskScoreState } from './__mocks__'; +import { EuiFlyout } from '@elastic/eui'; +import { ExpandableFlyoutContext } from '@kbn/expandable-flyout/src/context'; +import { StorybookProviders } from '../../../common/mock/storybook_providers'; +import { + mockManagedUser, + mockObservedUser, + mockRiskScoreState, +} from '../../../timelines/components/side_panel/new_user_detail/__mocks__'; +import { UserPanelContent } from './content'; -storiesOf('UserDetailsContent', module) +const flyoutContextValue = { + openLeftPanel: () => window.alert('openLeftPanel called'), + panels: {}, +} as unknown as ExpandableFlyoutContext; + +storiesOf('Components/UserPanelContent', module) .addDecorator((storyFn) => ( - {}}> - {storyFn()} - + + {}}> + {storyFn()} + + )) .add('default', () => ( - )) .add('integration disabled', () => ( - )) .add('no managed data', () => ( - )) .add('no observed data', () => ( - )) .add('loading', () => ( - ; + contextID: string; + scopeId: string; + isDraggable: boolean; +} + +export const UserPanelContent = ({ + observedUser, + managedUser, + riskScoreState, + contextID, + scopeId, + isDraggable, +}: UserPanelContentProps) => { + return ( + + {riskScoreState.isModuleEnabled && riskScoreState.data?.length !== 0 && ( + <> + + + + )} + + + + + ); +}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/header.test.tsx similarity index 67% rename from x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.test.tsx rename to x-pack/plugins/security_solution/public/flyout/entity_details/user_right/header.test.tsx index 2d984cc926e4f..e4e4186919b6d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/header.test.tsx @@ -7,36 +7,37 @@ import { render } from '@testing-library/react'; import React from 'react'; -import { TestProviders } from '../../../../common/mock'; -import { mockManagedUser, mockObservedUser, mockRiskScoreState } from './__mocks__'; -import { UserDetailsContentComponent } from './user_details_content'; +import { TestProviders } from '../../../common/mock'; +import { + mockManagedUser, + mockObservedUser, +} from '../../../timelines/components/side_panel/new_user_detail/__mocks__'; +import { UserPanelHeader } from './header'; const mockProps = { userName: 'test', managedUser: mockManagedUser, observedUser: mockObservedUser, - riskScoreState: mockRiskScoreState, - contextID: 'test-user-details', - scopeId: 'test-scope-id', - isDraggable: false, }; -describe('UserDetailsContentComponent', () => { +jest.mock('../../../common/components/visualization_actions/visualization_embeddable'); + +describe('UserDetailsContent', () => { it('renders', () => { const { getByTestId } = render( - + ); - expect(getByTestId('user-details-content-header')).toBeInTheDocument(); + expect(getByTestId('user-panel-header')).toBeInTheDocument(); }); it('renders observed user date when it is bigger than managed user date', () => { const futureDay = '2989-03-07T20:00:00.000Z'; const { getByTestId } = render( - { ); - expect(getByTestId('user-details-content-lastSeen').textContent).toContain('Mar 7, 2989'); + expect(getByTestId('user-panel-header-lastSeen').textContent).toContain('Mar 7, 2989'); }); it('renders managed user date when it is bigger than observed user date', () => { const futureDay = '2989-03-07T20:00:00.000Z'; const { getByTestId } = render( - { ); - expect(getByTestId('user-details-content-lastSeen').textContent).toContain('Mar 7, 2989'); + expect(getByTestId('user-panel-header-lastSeen').textContent).toContain('Mar 7, 2989'); }); it('renders observed and managed badges when lastSeen is defined', () => { const { getByTestId } = render( - + ); - expect(getByTestId('user-details-content-observed-badge')).toBeInTheDocument(); - expect(getByTestId('user-details-content-managed-badge')).toBeInTheDocument(); + expect(getByTestId('user-panel-header-observed-badge')).toBeInTheDocument(); + expect(getByTestId('user-panel-header-managed-badge')).toBeInTheDocument(); }); it('does not render observed badge when lastSeen date is undefined', () => { const { queryByTestId } = render( - { ); - expect(queryByTestId('user-details-content-observed-badge')).not.toBeInTheDocument(); + expect(queryByTestId('user-panel-header-observed-badge')).not.toBeInTheDocument(); }); it('does not render managed badge when lastSeen date is undefined', () => { const { queryByTestId } = render( - { ); - expect(queryByTestId('user-details-content-managed-badge')).not.toBeInTheDocument(); + expect(queryByTestId('user-panel-header-managed-badge')).not.toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/header.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/header.tsx new file mode 100644 index 0000000000000..12acfd0d2815d --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/header.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiSpacer, EuiBadge, EuiText, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React, { useMemo } from 'react'; +import { max } from 'lodash/fp'; +import { SecurityPageName } from '@kbn/security-solution-navigation'; +import { getUsersDetailsUrl } from '../../../common/components/link_to/redirect_to_users'; +import type { + ManagedUserData, + ObservedUserData, +} from '../../../timelines/components/side_panel/new_user_detail/types'; + +import { SecuritySolutionLinkAnchor } from '../../../common/components/links'; +import { PreferenceFormattedDate } from '../../../common/components/formatted_date'; +import { FlyoutHeader } from '../../shared/components/flyout_header'; +import { FlyoutTitle } from '../../shared/components/flyout_title'; + +interface UserPanelHeaderProps { + userName: string; + observedUser: ObservedUserData; + managedUser: ManagedUserData; +} + +export const UserPanelHeader = ({ userName, observedUser, managedUser }: UserPanelHeaderProps) => { + const lastSeenDate = useMemo( + () => + max([observedUser.lastSeen, managedUser.lastSeen].map((el) => el.date && new Date(el.date))), + [managedUser.lastSeen, observedUser.lastSeen] + ); + + return ( + + + + + {lastSeenDate && } + + + + + + + + + + + + {observedUser.lastSeen.date && ( + + + + )} + + + {managedUser.lastSeen.date && ( + + + + )} + + + + + + ); +}; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.test.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.test.tsx new file mode 100644 index 0000000000000..e06399305fe05 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.test.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; +import { TestProviders } from '../../../common/mock'; +import type { UserPanelProps } from '.'; +import { UserPanel } from '.'; +import { mockRiskScoreState } from './mocks'; + +import { + mockManagedUser, + mockObservedUser, +} from '../../../timelines/components/side_panel/new_user_detail/__mocks__'; + +const mockProps: UserPanelProps = { + userName: 'test', + contextID: 'test-user-panel', + scopeId: 'test-scope-id', + isDraggable: false, +}; + +jest.mock('../../../common/components/visualization_actions/visualization_embeddable'); + +const mockedUseRiskScore = jest.fn().mockReturnValue(mockRiskScoreState); +jest.mock('../../../explore/containers/risk_score', () => ({ + useRiskScore: () => mockedUseRiskScore(), +})); + +const mockedUseManagedUser = jest.fn().mockReturnValue(mockManagedUser); +const mockedUseObservedUser = jest.fn().mockReturnValue(mockObservedUser); + +jest.mock('../../../timelines/components/side_panel/new_user_detail/hooks', () => { + const originalModule = jest.requireActual( + '../../../timelines/components/side_panel/new_user_detail/hooks' + ); + return { + ...originalModule, + useManagedUser: () => mockedUseManagedUser(), + useObservedUser: () => mockedUseObservedUser(), + }; +}); + +describe('UserPanel', () => { + beforeEach(() => { + mockedUseRiskScore.mockReturnValue(mockRiskScoreState); + mockedUseManagedUser.mockReturnValue(mockManagedUser); + mockedUseObservedUser.mockReturnValue(mockObservedUser); + }); + + it('renders', () => { + const { getByTestId, queryByTestId } = render( + + + + ); + + expect(getByTestId('user-panel-header')).toBeInTheDocument(); + expect(queryByTestId('securitySolutionFlyoutLoading')).not.toBeInTheDocument(); + expect(getByTestId('securitySolutionFlyoutNavigationExpandDetailButton')).toBeInTheDocument(); + }); + + it('renders loading state when risk score is loading', () => { + mockedUseRiskScore.mockReturnValue({ + ...mockRiskScoreState, + data: undefined, + loading: true, + }); + + const { getByTestId } = render( + + + + ); + + expect(getByTestId('securitySolutionFlyoutLoading')).toBeInTheDocument(); + }); + + it('renders loading state when observed user is loading', () => { + mockedUseObservedUser.mockReturnValue({ + ...mockObservedUser, + isLoading: true, + }); + + const { getByTestId } = render( + + + + ); + + expect(getByTestId('securitySolutionFlyoutLoading')).toBeInTheDocument(); + }); + + it('renders loading state when managed user is loading', () => { + mockedUseManagedUser.mockReturnValue({ + ...mockManagedUser, + isLoading: true, + }); + + const { getByTestId } = render( + + + + ); + + expect(getByTestId('securitySolutionFlyoutLoading')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx new file mode 100644 index 0000000000000..8f22560730bf0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/index.tsx @@ -0,0 +1,135 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useMemo } from 'react'; +import type { FlyoutPanelProps } from '@kbn/expandable-flyout'; +import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; +import { useQueryInspector } from '../../../common/components/page/manage_query'; +import { UsersType } from '../../../explore/users/store/model'; +import { getCriteriaFromUsersType } from '../../../common/components/ml/criteria/get_criteria_from_users_type'; +import { useGlobalTime } from '../../../common/containers/use_global_time'; +import { + useManagedUser, + useObservedUser, +} from '../../../timelines/components/side_panel/new_user_detail/hooks'; +import { AnomalyTableProvider } from '../../../common/components/ml/anomaly/anomaly_table_provider'; +import { buildUserNamesFilter } from '../../../../common/search_strategy'; +import { useRiskScore } from '../../../explore/containers/risk_score'; +import { RiskScoreEntity } from '../../../../common/risk_engine'; +import { FlyoutLoading } from '../../shared/components/flyout_loading'; +import { RiskInputsPanelKey } from '../risk_inputs_left'; +import { FlyoutNavigation } from '../../shared/components/flyout_navigation'; +import { UserPanelContent } from './content'; +import { UserPanelHeader } from './header'; + +export interface UserPanelProps extends Record { + contextID: string; + scopeId: string; + userName: string; + isDraggable?: boolean; +} + +export interface UserPanelExpandableFlyoutProps extends FlyoutPanelProps { + key: 'user-panel'; + params: UserPanelProps; +} + +export const UserPanelKey: UserPanelExpandableFlyoutProps['key'] = 'user-panel'; +export const USER_PANEL_RISK_SCORE_QUERY_ID = 'userPanelRiskScoreQuery'; +const FIRST_RECORD_PAGINATION = { + cursorStart: 0, + querySize: 1, +}; + +export const UserPanel = ({ contextID, scopeId, userName, isDraggable }: UserPanelProps) => { + const userNameFilterQuery = useMemo( + () => (userName ? buildUserNamesFilter([userName]) : undefined), + [userName] + ); + + const riskScoreState = useRiskScore({ + riskEntity: RiskScoreEntity.user, + filterQuery: userNameFilterQuery, + onlyLatest: false, + pagination: FIRST_RECORD_PAGINATION, + }); + + const { inspect, refetch, loading } = riskScoreState; + const { to, from, isInitializing, setQuery, deleteQuery } = useGlobalTime(); + + const observedUser = useObservedUser(userName); + const managedUser = useManagedUser(userName); + + const { data: userRisk } = riskScoreState; + const userRiskData = userRisk && userRisk.length > 0 ? userRisk[0] : undefined; + + useQueryInspector({ + deleteQuery, + inspect, + loading, + queryId: USER_PANEL_RISK_SCORE_QUERY_ID, + refetch, + setQuery, + }); + + const { openLeftPanel } = useExpandableFlyoutContext(); + const openPanel = useCallback(() => { + openLeftPanel({ + id: RiskInputsPanelKey, + params: { + riskInputs: userRiskData?.user.risk.inputs, + }, + }); + }, [openLeftPanel, userRiskData?.user.risk.inputs]); + + if (riskScoreState.loading || observedUser.isLoading || managedUser.isLoading) { + return ; + } + + return ( + + {({ isLoadingAnomaliesData, anomaliesData, jobNameById }) => { + const observedUserWithAnomalies = { + ...observedUser, + anomalies: { + isLoading: isLoadingAnomaliesData, + anomalies: anomaliesData, + jobNameById, + }, + }; + return ( + <> + + + + + ); + }} + + ); +}; + +UserPanel.displayName = 'UserPanel'; diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/mocks/index.ts b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/mocks/index.ts new file mode 100644 index 0000000000000..bfd1a9a802199 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_right/mocks/index.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RiskScoreState } from '../../../../explore/containers/risk_score'; +import type { RiskScoreEntity, UserRiskScore } from '../../../../../common/search_strategy'; +import { RiskSeverity } from '../../../../../common/search_strategy'; +import { RiskCategories } from '../../../../../common/risk_engine'; + +const userRiskScore: UserRiskScore = { + '@timestamp': '626569200000', + user: { + name: 'test', + risk: { + rule_risks: [], + calculated_score_norm: 70, + multipliers: [], + calculated_level: RiskSeverity.high, + inputs: [ + { + id: '_id', + index: '_index', + category: RiskCategories.category_1, + description: 'Alert from Rule: My rule', + risk_score: 30, + timestamp: '2021-08-19T18:55:59.000Z', + }, + ], + }, + }, + alertsCount: 0, + oldestAlertTimestamp: '626569200000', +}; + +export const mockRiskScoreState: RiskScoreState = { + data: [userRiskScore], + inspect: { + dsl: [], + response: [], + }, + isInspected: false, + refetch: () => {}, + totalCount: 0, + isModuleEnabled: true, + isAuthorized: true, + isDeprecated: false, + loading: false, +}; diff --git a/x-pack/plugins/security_solution/public/flyout/index.tsx b/x-pack/plugins/security_solution/public/flyout/index.tsx index a29654659c74c..1c8ac6c4cc2c9 100644 --- a/x-pack/plugins/security_solution/public/flyout/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/index.tsx @@ -12,21 +12,28 @@ import { ExpandableFlyoutProvider, } from '@kbn/expandable-flyout'; import type { IsolateHostPanelProps } from './document_details/isolate_host'; -import { IsolateHostPanel, IsolateHostPanelKey } from './document_details/isolate_host'; +import { + IsolateHostPanel, + DocumentDetailsIsolateHostPanelKey, +} from './document_details/isolate_host'; import { IsolateHostPanelProvider } from './document_details/isolate_host/context'; import type { RightPanelProps } from './document_details/right'; -import { RightPanel, RightPanelKey } from './document_details/right'; +import { RightPanel, DocumentDetailsRightPanelKey } from './document_details/right'; import { RightPanelProvider } from './document_details/right/context'; import type { LeftPanelProps } from './document_details/left'; -import { LeftPanel, LeftPanelKey } from './document_details/left'; +import { LeftPanel, DocumentDetailsLeftPanelKey } from './document_details/left'; import { LeftPanelProvider } from './document_details/left/context'; import { SecuritySolutionFlyoutUrlSyncProvider, useSecurityFlyoutUrlSync, } from './document_details/shared/context/url_sync'; import type { PreviewPanelProps } from './document_details/preview'; -import { PreviewPanel, PreviewPanelKey } from './document_details/preview'; +import { PreviewPanel, DocumentDetailsPreviewPanelKey } from './document_details/preview'; import { PreviewPanelProvider } from './document_details/preview/context'; +import type { UserPanelExpandableFlyoutProps } from './entity_details/user_right'; +import { UserPanel, UserPanelKey } from './entity_details/user_right'; +import type { RiskInputsExpandableFlyoutProps } from './entity_details/risk_inputs_left'; +import { RiskInputsPanel, RiskInputsPanelKey } from './entity_details/risk_inputs_left'; /** * List of all panels that will be used within the document details expandable flyout. @@ -34,7 +41,7 @@ import { PreviewPanelProvider } from './document_details/preview/context'; */ const expandableFlyoutDocumentsPanels: ExpandableFlyoutProps['registeredPanels'] = [ { - key: RightPanelKey, + key: DocumentDetailsRightPanelKey, component: (props) => ( @@ -42,7 +49,7 @@ const expandableFlyoutDocumentsPanels: ExpandableFlyoutProps['registeredPanels'] ), }, { - key: LeftPanelKey, + key: DocumentDetailsLeftPanelKey, component: (props) => ( @@ -50,7 +57,7 @@ const expandableFlyoutDocumentsPanels: ExpandableFlyoutProps['registeredPanels'] ), }, { - key: PreviewPanelKey, + key: DocumentDetailsPreviewPanelKey, component: (props) => ( @@ -58,13 +65,23 @@ const expandableFlyoutDocumentsPanels: ExpandableFlyoutProps['registeredPanels'] ), }, { - key: IsolateHostPanelKey, + key: DocumentDetailsIsolateHostPanelKey, component: (props) => ( ), }, + { + key: UserPanelKey, + component: (props) => , + }, + { + key: RiskInputsPanelKey, + component: (props) => ( + + ), + }, ]; const OuterProviders: FC = ({ children }) => { diff --git a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.test.tsx b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.test.tsx index 8668f727201de..1f2d0c128f411 100644 --- a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.test.tsx @@ -9,46 +9,40 @@ import React from 'react'; import { render } from '@testing-library/react'; import { FlyoutTitle } from './flyout_title'; import { - FLYOUT_TITLE_TEST_ID, TITLE_HEADER_ICON_TEST_ID, + TITLE_HEADER_TEXT_TEST_ID, TITLE_LINK_ICON_TEST_ID, } from './test_ids'; const title = 'test title'; +const TEST_ID = 'test'; describe('', () => { it('should render title and icon', () => { const { getByTestId, queryByTestId } = render( - + ); - expect(getByTestId(FLYOUT_TITLE_TEST_ID)).toHaveTextContent(title); - expect( - getByTestId(FLYOUT_TITLE_TEST_ID).querySelector('[data-euiicon-type="warning"]') - ).toBeInTheDocument(); - expect(queryByTestId(TITLE_LINK_ICON_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(TITLE_HEADER_TEXT_TEST_ID(TEST_ID))).toHaveTextContent(title); + expect(getByTestId(TITLE_HEADER_ICON_TEST_ID(TEST_ID))).toBeInTheDocument(); + expect(queryByTestId(TITLE_LINK_ICON_TEST_ID(TEST_ID))).not.toBeInTheDocument(); }); it('should not render icon if iconType is not passed', () => { - const { getByTestId, queryByTestId } = render(); + const { getByTestId, queryByTestId } = render( + + ); - expect(getByTestId(FLYOUT_TITLE_TEST_ID)).toBeInTheDocument(); - expect(queryByTestId(TITLE_HEADER_ICON_TEST_ID)).not.toBeInTheDocument(); - expect(queryByTestId(TITLE_LINK_ICON_TEST_ID)).not.toBeInTheDocument(); + expect(getByTestId(TITLE_HEADER_TEXT_TEST_ID(TEST_ID))).toBeInTheDocument(); + expect(queryByTestId(TITLE_HEADER_ICON_TEST_ID(TEST_ID))).not.toBeInTheDocument(); + expect(queryByTestId(TITLE_LINK_ICON_TEST_ID(TEST_ID))).not.toBeInTheDocument(); }); it('should render popout icon if title is a link', () => { - const { getByTestId } = render(); - - expect(getByTestId(FLYOUT_TITLE_TEST_ID)).toHaveTextContent(title); - expect(getByTestId(TITLE_LINK_ICON_TEST_ID)).toBeInTheDocument(); - expect( - getByTestId(FLYOUT_TITLE_TEST_ID).querySelector('[data-euiicon-type="popout"]') - ).toBeInTheDocument(); - }); + const { getByTestId } = render(); - it('should render title with custom data test subject', () => { - const { getByTestId } = render(); - expect(getByTestId('test-title')).toHaveTextContent(title); + expect(getByTestId(TITLE_HEADER_TEXT_TEST_ID(TEST_ID))).toHaveTextContent(title); + expect(getByTestId(TITLE_LINK_ICON_TEST_ID(TEST_ID))).toBeInTheDocument(); + expect(getByTestId(TITLE_LINK_ICON_TEST_ID(TEST_ID))).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.tsx b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.tsx index d9e9d280d38cc..8c2c12ab80e94 100644 --- a/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.tsx +++ b/x-pack/plugins/security_solution/public/flyout/shared/components/flyout_title.tsx @@ -18,11 +18,6 @@ import { EuiTextColor, } from '@elastic/eui'; import { css } from '@emotion/react'; -import { - FLYOUT_TITLE_TEST_ID, - TITLE_HEADER_ICON_TEST_ID, - TITLE_LINK_ICON_TEST_ID, -} from './test_ids'; export interface FlyoutTitleProps { /** @@ -48,7 +43,7 @@ export interface FlyoutTitleProps { * Title component with optional icon to indicate the type of document, can be used for text or a link */ export const FlyoutTitle: FC = memo( - ({ title, iconType, isLink = false, 'data-test-subj': dataTestSubj = FLYOUT_TITLE_TEST_ID }) => { + ({ title, iconType, isLink = false, 'data-test-subj': dataTestSubj }) => { const { euiTheme } = useEuiTheme(); const titleIcon = useMemo(() => { @@ -57,23 +52,23 @@ export const FlyoutTitle: FC = memo( type={iconType} size="m" className="eui-alignBaseline" - data-test-subj={TITLE_HEADER_ICON_TEST_ID} + data-test-subj={`${dataTestSubj}Icon`} css={css` margin-right: ${euiTheme.size.xs}; `} /> ) : null; - }, [iconType, euiTheme.size.xs]); + }, [dataTestSubj, iconType, euiTheme.size.xs]); const titleComponent = useMemo(() => { return ( - + {title} ); - }, [title, isLink, euiTheme.colors.primaryText]); + }, [dataTestSubj, title, isLink, euiTheme.colors.primaryText]); const linkIcon = useMemo(() => { return ( @@ -83,19 +78,14 @@ export const FlyoutTitle: FC = memo( css={css` margin-bottom: ${euiTheme.size.xs}; `} - data-test-subj={TITLE_LINK_ICON_TEST_ID} + data-test-subj={`${dataTestSubj}LinkIcon`} /> ); - }, [euiTheme.size.xs]); + }, [dataTestSubj, euiTheme.size.xs]); return ( - +
    `${dataTestSubj}Icon`; +export const TITLE_HEADER_TEXT_TEST_ID = (dataTestSubj: string) => `${dataTestSubj}Text`; +export const TITLE_LINK_ICON_TEST_ID = (dataTestSubj: string) => `${dataTestSubj}LinkIcon`; diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx index ac7422619ee07..d872eee2d2cee 100644 --- a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx +++ b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/criteria_conditions.tsx @@ -17,6 +17,7 @@ import { OS_WINDOWS, CONDITION_AND, CONDITION_OPERATOR_TYPE_WILDCARD_MATCHES, + CONDITION_OPERATOR_TYPE_DOES_NOT_MATCH, CONDITION_OPERATOR_TYPE_NESTED, CONDITION_OPERATOR_TYPE_MATCH, CONDITION_OPERATOR_TYPE_MATCH_ANY, @@ -47,6 +48,7 @@ const OPERATOR_TYPE_LABELS_INCLUDED = Object.freeze({ const OPERATOR_TYPE_LABELS_EXCLUDED = Object.freeze({ [ListOperatorTypeEnum.MATCH_ANY]: CONDITION_OPERATOR_TYPE_NOT_MATCH_ANY, [ListOperatorTypeEnum.MATCH]: CONDITION_OPERATOR_TYPE_NOT_MATCH, + [ListOperatorTypeEnum.WILDCARD]: CONDITION_OPERATOR_TYPE_DOES_NOT_MATCH, }); const EuiFlexGroupNested = styled(EuiFlexGroup)` diff --git a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts index 273cda46aa721..2024541091d57 100644 --- a/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts +++ b/x-pack/plugins/security_solution/public/management/components/artifact_entry_card/components/translations.ts @@ -68,6 +68,13 @@ export const CONDITION_OPERATOR_TYPE_WILDCARD_MATCHES = i18n.translate( } ); +export const CONDITION_OPERATOR_TYPE_DOES_NOT_MATCH = i18n.translate( + 'xpack.securitySolution.artifactCard.conditions.wildcardDoesNotMatchOperator', + { + defaultMessage: 'DOES NOT MATCH', + } +); + export const CONDITION_OPERATOR_TYPE_NESTED = i18n.translate( 'xpack.securitySolution.artifactCard.conditions.nestedOperator', { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolation.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts similarity index 51% rename from x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolation.cy.ts rename to x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts index 5b0d198742ede..44fdf9d63fb68 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolation.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts @@ -19,7 +19,6 @@ import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../../t import { checkEndpointListForOnlyIsolatedHosts, checkEndpointListForOnlyUnIsolatedHosts, - isolateHostFromEndpointList, } from '../../../tasks/isolate'; import { login } from '../../../tasks/login'; @@ -27,59 +26,44 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -// Failing: See https://github.com/elastic/kibana/issues/170470 -describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { - beforeEach(() => { - login(); - }); - - describe('Host Isolation:', () => { - let indexedPolicy: IndexedFleetEndpointPolicyResponse; - let policy: PolicyData; - let createdHost: CreateAndEnrollEndpointHostResponse; +describe('Response console', { tags: ['@ess', '@serverless'] }, () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; + let createdHost: CreateAndEnrollEndpointHostResponse; - before(() => { - getEndpointIntegrationVersion().then((version) => - createAgentPolicyTask(version).then((data) => { - indexedPolicy = data; - policy = indexedPolicy.integrationPolicies[0]; + before(() => { + getEndpointIntegrationVersion().then((version) => + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; - return enableAllPolicyProtections(policy.id).then(() => { - // Create and enroll a new Endpoint host - return createEndpointHost(policy.policy_id).then((host) => { - createdHost = host as CreateAndEnrollEndpointHostResponse; - }); + return enableAllPolicyProtections(policy.id).then(() => { + // Create and enroll a new Endpoint host + return createEndpointHost(policy.policy_id).then((host) => { + createdHost = host as CreateAndEnrollEndpointHostResponse; }); - }) - ); - }); + }); + }) + ); + }); - after(() => { - if (createdHost) { - cy.task('destroyEndpointHost', createdHost); - } + after(() => { + if (createdHost) { + cy.task('destroyEndpointHost', createdHost); + } - if (indexedPolicy) { - cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); - } + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } - if (createdHost) { - deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); - } - }); + if (createdHost) { + deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); + } + }); - it('should release an isolated host from response console', () => { - const command = 'release'; - waitForEndpointListPageToBeLoaded(createdHost.hostname); - // isolate the host first - isolateHostFromEndpointList(); - checkEndpointListForOnlyIsolatedHosts(); - openResponseConsoleFromEndpointList(); - performCommandInputChecks(command); - submitCommand(); - waitForCommandToBeExecuted(command); - waitForEndpointListPageToBeLoaded(createdHost.hostname); - checkEndpointListForOnlyUnIsolatedHosts(); + describe('Host Isolation:', () => { + beforeEach(() => { + login(); }); it('should isolate a host from response console', () => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts new file mode 100644 index 0000000000000..8de8ca22ae8bf --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.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 { PolicyData } from '../../../../../../common/endpoint/types'; +import type { CreateAndEnrollEndpointHostResponse } from '../../../../../../scripts/endpoint/common/endpoint_host_services'; +import { + openResponseConsoleFromEndpointList, + performCommandInputChecks, + submitCommand, + waitForCommandToBeExecuted, + waitForEndpointListPageToBeLoaded, +} from '../../../tasks/response_console'; +import type { IndexedFleetEndpointPolicyResponse } from '../../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; +import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../../tasks/fleet'; +import { + checkEndpointListForOnlyIsolatedHosts, + checkEndpointListForOnlyUnIsolatedHosts, + isolateHostActionViaAPI, +} from '../../../tasks/isolate'; + +import { login } from '../../../tasks/login'; +import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; +import { createEndpointHost } from '../../../tasks/create_endpoint_host'; +import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; + +describe('Response console', { tags: ['@ess', '@serverless'] }, () => { + let indexedPolicy: IndexedFleetEndpointPolicyResponse; + let policy: PolicyData; + let createdHost: CreateAndEnrollEndpointHostResponse; + + before(() => { + getEndpointIntegrationVersion().then((version) => + createAgentPolicyTask(version).then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; + + return enableAllPolicyProtections(policy.id).then(() => { + // Create and enroll a new Endpoint host + return createEndpointHost(policy.policy_id).then((host) => { + createdHost = host as CreateAndEnrollEndpointHostResponse; + }); + }); + }) + ); + }); + + after(() => { + if (createdHost) { + cy.task('destroyEndpointHost', createdHost); + } + + if (indexedPolicy) { + cy.task('deleteIndexedFleetEndpointPolicies', indexedPolicy); + } + + if (createdHost) { + deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); + } + }); + + describe('Host Isolation:', () => { + beforeEach(() => { + login(); + }); + + it('should release an isolated host via response console', () => { + const command = 'release'; + waitForEndpointListPageToBeLoaded(createdHost.hostname); + // isolate the host first + isolateHostActionViaAPI(createdHost.agentId); + // verify and find the isolated host + checkEndpointListForOnlyIsolatedHosts(); + openResponseConsoleFromEndpointList(); + performCommandInputChecks(command); + submitCommand(); + waitForCommandToBeExecuted(command); + waitForEndpointListPageToBeLoaded(createdHost.hostname); + checkEndpointListForOnlyUnIsolatedHosts(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/isolate.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/isolate.ts index 10aec51af291d..20d57ba7a94b5 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/isolate.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/isolate.ts @@ -7,9 +7,11 @@ /* eslint-disable cypress/no-unnecessary-waiting */ +import { API_VERSIONS } from '@kbn/fleet-plugin/common'; import { openAlertDetailsView } from '../screens/alerts'; import type { ActionDetails } from '../../../../common/endpoint/types'; import { loadPage } from './common'; +import { waitForActionToSucceed } from './response_actions'; const API_ENDPOINT_ACTION_PATH = '/api/endpoint/action/*'; export const interceptActionRequests = ( @@ -41,29 +43,6 @@ export const isolateHostWithComment = (comment: string, hostname: string): void cy.getByTestSubj('host_isolation_comment').type(comment); }; -export const isolateHostFromEndpointList = (index: number = 0): void => { - // open the action menu and click isolate action - cy.getByTestSubj('endpointTableRowActions').eq(index).click(); - cy.getByTestSubj('isolateLink').click(); - // isolation form, click confirm button - cy.getByTestSubj('hostIsolateConfirmButton').click(); - // return to endpoint details - cy.getByTestSubj('hostIsolateSuccessCompleteButton').click(); - // close details flyout - cy.getByTestSubj('euiFlyoutCloseButton').click(); - - // ensure the host is isolated, wait for 3 minutes for the host to be isolated - cy.wait(18000); - - cy.getByTestSubj('endpointListTable').within(() => { - cy.get('tbody tr') - .eq(index) - .within(() => { - cy.get('td').eq(1).should('contain.text', 'Isolated'); - }); - }); -}; - export const releaseHostWithComment = (comment: string, hostname: string): void => { cy.contains(`${hostname} is currently isolated.`); cy.getByTestSubj('endpointHostIsolationForm'); @@ -139,28 +118,46 @@ export const filterOutIsolatedHosts = (): void => { cy.getByTestSubj('querySubmitButton').click(); }; -const checkEndpointListForIsolatedHosts = (expectIsolated: boolean): void => { - const chainer = expectIsolated ? 'contain.text' : 'not.contain.text'; +const checkEndpointListForIsolationStatus = (expectIsolated: boolean): void => { + const chainer = expectIsolated ? 'contain' : 'not.contain'; cy.getByTestSubj('endpointListTable').within(() => { - cy.get('tbody tr').each(($tr) => { - cy.wrap($tr).within(() => { + cy.get('tbody tr') + .eq(0) + .within(() => { cy.get('td').eq(1).should(chainer, 'Isolated'); }); - }); }); }; export const checkEndpointListForOnlyUnIsolatedHosts = (): void => - checkEndpointListForIsolatedHosts(false); + checkEndpointListForIsolationStatus(false); export const checkEndpointListForOnlyIsolatedHosts = (): void => - checkEndpointListForIsolatedHosts(true); + checkEndpointListForIsolationStatus(true); + +export const isolateHostActionViaAPI = (agentId: string): void => { + cy.request({ + headers: { + 'kbn-xsrf': 'cypress-creds', + 'elastic-api-version': API_VERSIONS.public.v1, + }, + method: 'POST', + url: 'api/endpoint/action/isolate', + body: { + endpoint_ids: [agentId], + }, + }) + // verify action was successful + .then((response) => waitForActionToSucceed(response.body.data.id)) + .then((actionResponse) => { + expect(actionResponse.status).to.equal('successful'); + }); +}; export const checkEndpointIsolationStatus = ( endpointHostname: string, expectIsolated: boolean ): void => { - const chainer = expectIsolated ? 'contain.text' : 'not.contain.text'; - + const chainer = expectIsolated ? 'contain' : 'not.contain'; cy.contains(endpointHostname).parents('td').siblings('td').eq(0).should(chainer, 'Isolated'); }; diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts index 387f86c0dd160..126d637f07edb 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/response_actions.ts @@ -139,6 +139,38 @@ export const waitForActionToComplete = ( }); }; +export const waitForActionToSucceed = ( + actionId: string, + timeout = 180000 +): Cypress.Chainable => { + let action: ActionDetails | undefined; + + return cy + .waitUntil( + () => { + return request({ + method: 'GET', + url: resolvePathVariables(ACTION_DETAILS_ROUTE, { action_id: actionId || 'undefined' }), + }).then((response) => { + if (response.body.data.isCompleted && response.body.data.status === 'successful') { + action = response.body.data; + return true; + } + + return false; + }); + }, + { timeout, interval: 2000 } + ) + .then(() => { + if (!action) { + throw new Error('Failed to retrieve successful action'); + } + + return action; + }); +}; + /** * Ensure user has the given `accessLevel` to the type of response action * @param accessLevel diff --git a/x-pack/plugins/security_solution/public/mocks.ts b/x-pack/plugins/security_solution/public/mocks.ts index 044e58192f2d3..6564697c95f08 100644 --- a/x-pack/plugins/security_solution/public/mocks.ts +++ b/x-pack/plugins/security_solution/public/mocks.ts @@ -16,7 +16,7 @@ const upselling = new UpsellingService(); export const contractStartServicesMock: ContractStartServices = { extraRoutes$: of([]), - getComponent$: jest.fn(), + getComponents$: jest.fn(() => of({})), upselling, }; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.tsx b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.tsx index 2ee81c42949be..2bb850e0c312c 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/risk_score_donut_chart.tsx @@ -8,11 +8,11 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; +import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; import { useRiskDonutChartData } from './use_risk_donut_chart_data'; import type { FillColor } from '../../../../common/components/charts/donutchart'; import { emptyDonutColor } from '../../../../common/components/charts/donutchart_empty'; -import { RISK_SEVERITY_COLOUR } from '../../../../explore/components/risk_score/severity/common'; import { DonutChart } from '../../../../common/components/charts/donutchart'; import { Legend } from '../../../../common/components/charts/legend'; import { ChartLabel } from '../../detection_response/alerts_by_status/chart_label'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.ts b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.ts index 6ba4ad7c03d1b..4b31142aef3c9 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.ts +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/common/use_risk_donut_chart_data.ts @@ -6,10 +6,10 @@ */ import { sum } from 'lodash/fp'; import { useMemo } from 'react'; +import { RISK_SEVERITY_COLOUR } from '../../../../entity_analytics/common/utils'; import type { LegendItem } from '../../../../common/components/charts/legend_item'; import type { SeverityCount } from '../../../../explore/components/risk_score/severity/types'; import type { DonutChartProps } from '../../../../common/components/charts/donutchart'; -import { RISK_SEVERITY_COLOUR } from '../../../../explore/components/risk_score/severity/common'; import type { RiskSeverity } from '../../../../../common/search_strategy'; const legendField = 'kibana.alert.severity'; diff --git a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts index f2e3296133ffd..22fe8a3d52823 100644 --- a/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts +++ b/x-pack/plugins/security_solution/public/overview/components/entity_analytics/risk_score/translations.ts @@ -25,7 +25,7 @@ export const VIEW_ALL = i18n.translate( } ); -export const LEARN_MORE = (riskEntity: RiskScoreEntity) => +export const LEARN_MORE = (riskEntity?: RiskScoreEntity) => i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.learnMore', { defaultMessage: 'Learn more about {riskEntity} risk', values: { diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index c07273e59ed4a..e36dcd7991720 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -235,11 +235,6 @@ export class Plugin implements IPlugin { - const originalModule = jest.requireActual('@kbn/i18n-react'); - const FormattedRelative = jest.fn().mockImplementation(() => '20 hours ago'); - - return { - ...originalModule, - FormattedRelative, - }; -}); - -// Restore the useGetUserCasesPermissions so the calling functions can receive a valid permissions object -// The returned permissions object will indicate that the user does not have permissions by default -const mockUseGetUserCasesPermissions = useGetUserCasesPermissions as jest.Mock; -mockUseGetUserCasesPermissions.mockImplementation(originalKibanaLib.useGetUserCasesPermissions); - -jest.mock('../../../../common/utils/normalize_time_range'); - -jest.mock('../../../../common/hooks/use_resolve_conflict', () => { - return { - useResolveConflict: jest.fn().mockImplementation(() => null), - }; -}); - -// FLAKY: https://github.com/elastic/kibana/issues/168026 -describe.skip('Pane', () => { - test('renders with display block by default', async () => { - const EmptyComponent = render( - - - - ); - - await waitFor(() => { - expect(EmptyComponent.getByTestId('flyout-pane')).toHaveStyle('display: block'); - }); - }); - - test.skip('renders with display none when visibility is set to false', async () => { - const EmptyComponent = render( - - - - ); - await waitFor(() => { - expect(EmptyComponent.getByTestId('timeline-flyout')).toHaveStyle('display: none'); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.ts b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/index.ts new file mode 100644 index 0000000000000..7cfdf2a31aca2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/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 { Pane } from './pane'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.styles.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.styles.tsx new file mode 100644 index 0000000000000..6824756f8bb0c --- /dev/null +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/pane/pane.styles.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { css } from '@emotion/css'; +import { Global } from '@emotion/react'; +import { + useEuiTheme, + euiAnimFadeIn, + transparentize, + euiBackgroundColor, + euiCanAnimate, + euiAnimSlideInUp, +} from '@elastic/eui'; + +export const usePaneStyles = () => { + const EuiTheme = useEuiTheme(); + const { euiTheme } = EuiTheme; + return css` + // euiOverlayMask styles + position: fixed; + top: var(--euiFixedHeadersOffset, 0); + left: 0; + right: 0; + bottom: 0; + display: flex; + align-items: center; + justify-content: center; + background: ${transparentize(euiTheme.colors.ink, 0.5)}; + z-index: ${euiTheme.levels.flyout}; + + ${euiCanAnimate} { + animation: ${euiAnimFadeIn} ${euiTheme.animation.fast} ease-in; + } + + &.timeline-wrapper--hidden { + display: none; + } + + .timeline-flyout { + min-width: 150px; + height: inherit; + position: fixed; + top: var(--euiFixedHeadersOffset, 0); + right: 0; + bottom: 0; + left: 0; + background: ${euiBackgroundColor(EuiTheme, 'plain')}; + ${euiCanAnimate} { + animation: ${euiAnimSlideInUp(euiTheme.size.xxl)} ${euiTheme.animation.normal} + cubic-bezier(0.39, 0.575, 0.565, 1); + } + + .timeline-body { + height: 100%; + display: flex; + flex-direction: column; + } + } + + &:not(.timeline-wrapper--full-screen) .timeline-flyout { + margin: ${euiTheme.size.m}; + border-radius: ${euiTheme.border.radius.medium}; + + .timeline-template-badge { + border-radius: ${euiTheme.border.radius.medium} ${euiTheme.border.radius.medium} 0 0; // top corners only + } + .timeline-body { + padding: 0 ${euiTheme.size.s}; + } + } + `; +}; + +export const OverflowHiddenGlobalStyles = () => { + return

    } - body={

    {i18n.NO_ACTIVE_INTEGRATION_TEXT}

    } - actions={ - - {i18n.ADD_EXTERNAL_INTEGRATION_BUTTON} - - } - /> - - - ); - } + const xsFontSize = useEuiFontSize('xxs').fontSize; return ( <> - -
    {i18n.MANAGED_DATA_TITLE}
    -
    - +
    {i18n.MANAGED_DATA_TITLE}
    +
    } - onToggle={onToggleManagedData} extraAction={ <> {managedUser.lastSeen.date && ( - - ), - }} - /> + + + ), + }} + /> + )} } @@ -138,16 +118,34 @@ export const ManagedUser = ({ } `} > - - {managedItems || managedUser.isLoading ? ( - + {!managedUser.isLoading && !managedUser.isIntegrationEnabled ? ( + + {i18n.NO_ACTIVE_INTEGRATION_TITLE}} + titleSize="s" + body={

    {i18n.NO_ACTIVE_INTEGRATION_TEXT}

    } + actions={ + + {i18n.ADD_EXTERNAL_INTEGRATION_BUTTON} + + } /> - ) : ( - <> +
    + ) : ( + <> + {managedItems || managedUser.isLoading ? ( + + ) : (

    {i18n.NO_AZURE_DATA_TEXT}

    - - )} -
    + )} + + )} diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.test.tsx index f57eda9b1fb26..90934c533a2c4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { fireEvent, render } from '@testing-library/react'; +import { render } from '@testing-library/react'; import React from 'react'; import { TestProviders } from '../../../../common/mock'; import { mockObservedUser } from './__mocks__'; @@ -29,19 +29,6 @@ describe('ObservedUser', () => { expect(getByTestId('observedUser-data')).toBeInTheDocument(); }); - it('updates the accordion button title when visibility toggles', () => { - const { getByTestId } = render( - - - - ); - const accordionButton = getByTestId('observedUser-accordion-button'); - - expect(accordionButton).toHaveTextContent('Show observed data'); - fireEvent.click(accordionButton); - expect(accordionButton).toHaveTextContent('Hide observed data'); - }); - it('renders the formatted date', () => { const { getByTestId } = render( diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.tsx index 01335997813a0..9a0891c24a925 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/observed_user.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import { EuiAccordion, EuiSpacer, EuiTitle, useEuiTheme, EuiPanel } from '@elastic/eui'; +import { EuiAccordion, EuiSpacer, EuiTitle, useEuiTheme, useEuiFontSize } from '@elastic/eui'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useMemo } from 'react'; import { css } from '@emotion/react'; import { FormattedMessage } from '@kbn/i18n-react'; import * as i18n from './translations'; @@ -33,27 +33,21 @@ export const ObservedUser = ({ }) => { const { euiTheme } = useEuiTheme(); const observedItems = useObservedUserItems(observedUser); - const [isObservedDataToggleOpen, setObservedDataToggleOpen] = useState(false); - const onToggleObservedData = useCallback(() => { - setObservedDataToggleOpen((isOpen) => !isOpen); - }, [setObservedDataToggleOpen]); + const observedUserTableColumns = useMemo( () => getObservedUserTableColumns(contextID, scopeId, isDraggable), [contextID, scopeId, isDraggable] ); + const xsFontSize = useEuiFontSize('xxs').fontSize; return ( <> - -
    {i18n.OBSERVED_DATA_TITLE}
    -
    - +

    {i18n.OBSERVED_DATA_TITLE}

    + } - onToggle={onToggleObservedData} extraAction={ <> {observedUser.lastSeen.date && ( - - ), - }} - /> + + + ), + }} + /> + )} } @@ -101,19 +100,19 @@ export const ObservedUser = ({ } `} > - - - + + +
    diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/translations.ts index 01563fcb94781..4671cf815162d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/translations.ts @@ -46,20 +46,6 @@ export const OBSERVED_DATA_TITLE = i18n.translate( } ); -export const HIDE_OBSERVED_DATA_BUTTON = i18n.translate( - 'xpack.securitySolution.timeline.userDetails.hideObservedDataButton', - { - defaultMessage: 'Hide observed data', - } -); - -export const SHOW_OBSERVED_DATA_BUTTON = i18n.translate( - 'xpack.securitySolution.timeline.userDetails.showObservedDataButton', - { - defaultMessage: 'Show observed data', - } -); - export const HIDE_AZURE_DATA_BUTTON = i18n.translate( 'xpack.securitySolution.timeline.userDetails.hideManagedDataButton', { @@ -166,7 +152,7 @@ export const PHONE = i18n.translate('xpack.securitySolution.timeline.userDetails export const NO_ACTIVE_INTEGRATION_TITLE = i18n.translate( 'xpack.securitySolution.timeline.userDetails.noActiveIntegrationTitle', { - defaultMessage: 'You don’t have any active integrations', + defaultMessage: 'You don’t have any active asset repository integrations', } ); @@ -174,14 +160,14 @@ export const NO_ACTIVE_INTEGRATION_TEXT = i18n.translate( 'xpack.securitySolution.timeline.userDetails.noActiveIntegrationText', { defaultMessage: - 'External integrations can provide additional metadata and help you manage users.', + 'Additional metadata from integrations may help you to manage and identify risky entities.', } ); export const ADD_EXTERNAL_INTEGRATION_BUTTON = i18n.translate( 'xpack.securitySolution.timeline.userDetails.addExternalIntegrationButton', { - defaultMessage: 'Add external integrations', + defaultMessage: 'Add asset repository integrations', } ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.tsx deleted file mode 100644 index 95ffb05a16889..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/user_details_content.tsx +++ /dev/null @@ -1,197 +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 { - EuiSpacer, - EuiHorizontalRule, - EuiIcon, - EuiBadge, - EuiText, - EuiFlexItem, - EuiFlexGroup, - useEuiFontSize, - useEuiTheme, - euiTextBreakWord, - EuiProgress, -} from '@elastic/eui'; - -import React, { useMemo } from 'react'; -import { css } from '@emotion/react'; -import { max } from 'lodash'; -import * as i18n from './translations'; - -import { RiskScoreEntity } from '../../../../../common/search_strategy'; -import { UserDetailsLink } from '../../../../common/components/links'; -import { useGlobalTime } from '../../../../common/containers/use_global_time'; -import type { RiskScoreState } from '../../../../explore/containers/risk_score'; -import { useRiskScore } from '../../../../explore/containers/risk_score'; - -import { useManagedUser, useObservedUser } from './hooks'; -import { AnomalyTableProvider } from '../../../../common/components/ml/anomaly/anomaly_table_provider'; -import { getCriteriaFromUsersType } from '../../../../common/components/ml/criteria/get_criteria_from_users_type'; -import { UsersType } from '../../../../explore/users/store/model'; -import { PreferenceFormattedDate } from '../../../../common/components/formatted_date'; -import type { ManagedUserData, ObservedUserData } from './types'; -import { RiskScoreField } from './risk_score_field'; -import { ObservedUser } from './observed_user'; -import { ManagedUser } from './managed_user'; - -export const QUERY_ID = 'usersDetailsQuery'; - -interface UserDetailsContentComponentProps { - userName: string; - observedUser: ObservedUserData; - managedUser: ManagedUserData; - riskScoreState: RiskScoreState; - contextID: string; - scopeId: string; - isDraggable: boolean; -} - -/** - * This is a visual component. It doesn't access any external Context or API. - * It designed for unit testing the UI and previewing changes on storybook. - */ -export const UserDetailsContentComponent = ({ - userName, - observedUser, - managedUser, - riskScoreState, - contextID, - scopeId, - isDraggable, -}: UserDetailsContentComponentProps) => { - const { euiTheme } = useEuiTheme(); - const { fontSize: xlFontSize } = useEuiFontSize('xl'); - - const lastSeenDate = useMemo( - () => - max([observedUser.lastSeen, managedUser.lastSeen].map((el) => el.date && new Date(el.date))), - [managedUser.lastSeen, observedUser.lastSeen] - ); - - return ( - <> - - - - - {i18n.USER} - - - {observedUser.lastSeen.date && ( - - {i18n.OBSERVED_BADGE} - - )} - - - {managedUser.lastSeen.date && ( - - {i18n.MANAGED_BADGE} - - )} - - - - - {observedUser.lastSeen.isLoading || managedUser.lastSeen.isLoading ? ( - - ) : ( - - )} - - - - - {userName} - - - - - {i18n.LAST_SEEN} - {': '} - {lastSeenDate && } - - - - - - - - - - ); -}; - -export const UserDetailsContent = ({ - userName, - contextID, - scopeId, - isDraggable = false, -}: { - userName: string; - contextID: string; - scopeId: string; - isDraggable?: boolean; -}) => { - const { to, from, isInitializing } = useGlobalTime(); - const riskScoreState = useRiskScore({ - riskEntity: RiskScoreEntity.user, - }); - const observedUser = useObservedUser(userName); - const managedUser = useManagedUser(userName); - - return ( - - {({ isLoadingAnomaliesData, anomaliesData, jobNameById }) => ( - - )} - - ); -}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/index.tsx index 17a1e21ceebd0..4eefc6aa44f8a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/index.tsx @@ -6,13 +6,9 @@ */ import React from 'react'; -import { EuiFlyoutBody, EuiSpacer, EuiButtonIcon } from '@elastic/eui'; -import { css } from '@emotion/react'; import { UserDetailsFlyout } from './user_details_flyout'; import { UserDetailsSidePanel } from './user_details_side_panel'; import type { UserDetailsProps } from './types'; -import { UserDetailsContent } from '../new_user_detail/user_details_content'; -import * as i18n from './translations'; const UserDetailsPanelComponent = ({ contextID, @@ -21,40 +17,7 @@ const UserDetailsPanelComponent = ({ handleOnClose, isFlyoutView, isDraggable, - isNewUserDetailsFlyoutEnable, }: UserDetailsProps) => { - if (isNewUserDetailsFlyoutEnable) { - return isFlyoutView ? ( - - - - ) : ( -
    - - - - -
    - ); - } - return isFlyoutView ? ( ) : ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/types.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/types.ts index 96d17c57c08f4..9e1fd0a6b1498 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/user_details/types.ts @@ -12,5 +12,4 @@ export interface UserDetailsProps { handleOnClose: () => void; isFlyoutView?: boolean; isDraggable?: boolean; - isNewUserDetailsFlyoutEnable?: boolean; } 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 58b2a8fbbbb97..083d0651fbab4 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 @@ -9,9 +9,13 @@ import React, { useCallback, useContext, useMemo } from 'react'; import type { EuiButtonEmpty, EuiButtonIcon } from '@elastic/eui'; import { useDispatch } from 'react-redux'; import { isString } from 'lodash/fp'; +import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; +import { TableId } from '@kbn/securitysolution-data-table'; +import { UserPanelKey } from '../../../../../flyout/entity_details/user_right'; +import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; import { StatefulEventContext } from '../../../../../common/components/events_viewer/stateful_event_context'; import type { ExpandedDetailType } from '../../../../../../common/types'; -import { getScopedActions } from '../../../../../helpers'; +import { getScopedActions, isTimelineScope } from '../../../../../helpers'; import { TimelineId, TimelineTabs } from '../../../../../../common/types/timeline'; import { DefaultDraggable } from '../../../../../common/components/draggables'; import { getEmptyTagValue } from '../../../../../common/components/empty_value'; @@ -48,9 +52,11 @@ const UserNameComponent: React.FC = ({ }) => { const dispatch = useDispatch(); const eventContext = useContext(StatefulEventContext); + const isNewUserDetailsFlyoutEnable = useIsExperimentalFeatureEnabled('newUserDetailsFlyout'); const userName = `${value}`; - const isInTimelineContext = userName && eventContext?.timelineID; + const { openRightPanel } = useExpandableFlyoutContext(); + const openUserDetailsSidePanel = useCallback( (e) => { e.preventDefault(); @@ -58,31 +64,55 @@ const UserNameComponent: React.FC = ({ if (onClick) { onClick(); } + if (eventContext && isInTimelineContext) { const { timelineID, tabType } = eventContext; - const updatedExpandedDetail: ExpandedDetailType = { - panelView: 'userDetail', - params: { - userName, - }, - }; - const scopedActions = getScopedActions(timelineID); - if (scopedActions) { - dispatch( - scopedActions.toggleDetailPanel({ - ...updatedExpandedDetail, - id: timelineID, - tabType: tabType as TimelineTabs, - }) - ); - } - if (timelineID === TimelineId.active && tabType === TimelineTabs.query) { - activeTimeline.toggleExpandedDetail({ ...updatedExpandedDetail }); + if (isNewUserDetailsFlyoutEnable && !isTimelineScope(timelineID)) { + openRightPanel({ + id: UserPanelKey, + params: { + userName, + contextID: contextId, + scopeId: TableId.alertsOnAlertsPage, + isDraggable, + }, + }); + } else { + const updatedExpandedDetail: ExpandedDetailType = { + panelView: 'userDetail', + params: { + userName, + }, + }; + const scopedActions = getScopedActions(timelineID); + if (scopedActions) { + dispatch( + scopedActions.toggleDetailPanel({ + ...updatedExpandedDetail, + id: timelineID, + tabType: tabType as TimelineTabs, + }) + ); + } + + if (timelineID === TimelineId.active && tabType === TimelineTabs.query) { + activeTimeline.toggleExpandedDetail({ ...updatedExpandedDetail }); + } } } }, - [onClick, eventContext, isInTimelineContext, userName, dispatch] + [ + onClick, + eventContext, + isNewUserDetailsFlyoutEnable, + isInTimelineContext, + openRightPanel, + userName, + contextId, + isDraggable, + dispatch, + ] ); // The below is explicitly defined this way as the onClick takes precedence when it and the href are both defined diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/esql_tab_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/esql_tab_content/index.tsx index b3697421906ef..25e8452e35d6d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/esql_tab_content/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/esql_tab_content/index.tsx @@ -238,8 +238,25 @@ export const DiscoverTabContent: FC = ({ timelineId }) const finalAppState = savedSearchAppState?.appState ?? discoverAppState ?? defaultDiscoverAppState; - stateContainer.appState.set(finalAppState); - await stateContainer.appState.replaceUrlState(finalAppState); + const urlAppState = stateContainer.appState.isEmptyURL() + ? undefined + : stateContainer.appState.getState(); + + const hasESQLURlState = urlAppState?.query && 'esql' in urlAppState.query; + + /* + * Url state should NOT apply if there is already a saved search being loaded + * */ + const shouldApplyESQLUrlState = !savedSearchAppState?.appState && hasESQLURlState; + + if (!shouldApplyESQLUrlState) { + /* + * If url state applies, it should be a no-op and there is no need to update the state container. + * Discover should automatically pick up url state + * */ + stateContainer.appState.set(finalAppState); + await stateContainer.appState.replaceUrlState(finalAppState); + } const unsubscribeState = stateContainer.appState.state$.subscribe({ next: setDiscoverAppState, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx index 7a025259a6574..f7e7c397e08ad 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx @@ -14,7 +14,6 @@ import { TimelineStatus } from '../../../../../common/api/timeline'; import { useUserPrivileges } from '../../../../common/components/user_privileges'; import { useIsElementMounted } from '../../../../detection_engine/rule_management_ui/components/rules_table/rules_table/guided_onboarding/use_is_element_mounted'; import { useLocalStorage } from '../../../../common/components/local_storage'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; import { SaveTimelineModal } from './save_timeline_modal'; import * as timelineTranslations from './translations'; @@ -24,11 +23,9 @@ export interface SaveTimelineButtonProps { } const SAVE_BUTTON_ELEMENT_ID = 'SAVE_BUTTON_ELEMENT_ID'; -const LOCAL_STORAGE_KEY = 'security.timelineFlyoutHeader.saveTimelineTourSeen'; +const LOCAL_STORAGE_KEY = 'security.timelineFlyoutHeader.saveTimelineTour'; export const SaveTimelineButton = React.memo(({ timelineId }) => { - const isTimelineSaveTourSaveTourDisabled = - useIsExperimentalFeatureEnabled('disableTimelineSaveTour'); const [showEditTimelineOverlay, setShowEditTimelineOverlay] = useState(false); const closeSaveTimeline = useCallback(() => { @@ -56,9 +53,12 @@ export const SaveTimelineButton = React.memo(({ timelin } = useDeepEqualSelector((state) => getTimelineStatus(state, timelineId)); const isSaveButtonMounted = useIsElementMounted(SAVE_BUTTON_ELEMENT_ID); - const [hasSeenTimelineSaveTour, setHasSeenTimelineSaveTour] = useLocalStorage({ - defaultValue: false, + const [timelineTourStatus, setTimelineTourStatus] = useLocalStorage({ + defaultValue: { isTourActive: true }, key: LOCAL_STORAGE_KEY, + isInvalidDefault: (valueFromStorage) => { + return !valueFromStorage; + }, }); // Why are we checking for so many flags here? // The tour popup should only show when timeline is fully populated and all necessary @@ -66,17 +66,15 @@ export const SaveTimelineButton = React.memo(({ timelin // popup would show too early and in the wrong place in the DOM. // The last flag, checks if the tour has been dismissed before. const showTimelineSaveTour = - // The timeline save tour could be disabled on a plugin level - !isTimelineSaveTourSaveTourDisabled && canEditTimeline && isVisible && !isLoading && isSaveButtonMounted && - !hasSeenTimelineSaveTour; + timelineTourStatus?.isTourActive; const markTimelineSaveTourAsSeen = useCallback(() => { - setHasSeenTimelineSaveTour(true); - }, [setHasSeenTimelineSaveTour]); + setTimelineTourStatus({ isTourActive: false }); + }, [setTimelineTourStatus]); const isUnsaved = timelineStatus === TimelineStatus.draft; const tooltipContent = canEditTimeline ? null : timelineTranslations.CALL_OUT_UNAUTHORIZED_MSG; 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 1bbeb32ae0e87..7ebd3093d8cfc 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 @@ -193,27 +193,31 @@ const StatefulTimelineComponent: React.FC = ({ > {timelineType === TimelineType.template && ( - {i18n.TIMELINE_TEMPLATE} + + {i18n.TIMELINE_TEMPLATE} + )} - {resolveConflictComponent} - - - - - - +
    + {resolveConflictComponent} + + + + + + +
    ); diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index 0dcd00d3db78b..16a75ce105262 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -81,7 +81,7 @@ import type { BreadcrumbsNav } from './common/breadcrumbs/types'; import type { TopValuesPopoverService } from './app/components/top_values_popover/top_values_popover_service'; import type { ExperimentalFeatures } from '../common/experimental_features'; import type { DeepLinksFormatter } from './common/links/deep_links'; -import type { SetComponents, GetComponent$ } from './contract_components'; +import type { SetComponents, GetComponents$ } from './contract_components'; import type { ConfigSettings } from '../common/config_settings'; export interface SetupPlugins { @@ -147,7 +147,7 @@ export interface StartPluginsDependencies extends StartPlugins { export interface ContractStartServices { extraRoutes$: Observable; - getComponent$: GetComponent$; + getComponents$: GetComponents$; upselling: UpsellingService; } diff --git a/x-pack/plugins/security_solution/scripts/junit_transformer/lib.ts b/x-pack/plugins/security_solution/scripts/junit_transformer/lib.ts index d9033c75d485b..725baa689cd20 100644 --- a/x-pack/plugins/security_solution/scripts/junit_transformer/lib.ts +++ b/x-pack/plugins/security_solution/scripts/junit_transformer/lib.ts @@ -16,6 +16,7 @@ import * as t from 'io-ts'; import { isLeft } from 'fp-ts/lib/Either'; import { PathReporter } from 'io-ts/lib/PathReporter'; import globby from 'globby'; +import del from 'del'; /** * Updates the `name` and `classname` attributes of each testcase. @@ -195,6 +196,9 @@ ${boilerplate} if ('error' in maybeValidationResult) { logError(maybeValidationResult.error); + // Sending broken XML to Failed Test Reporter will cause a job to fail + await del(path); + log.warning(`${path} file was deleted.`); // If there is an error, continue trying to process other files. continue; } @@ -203,9 +207,11 @@ ${boilerplate} const { processed, hadTestCases } = isReportAlreadyProcessed(reportJson); if (hadTestCases === false) { - log.warning(`${path} had no test cases. Skipping it. + log.warning(`${path} had no test cases. ${boilerplate} `); + await del(path); + log.warning(`${path} file was deleted.`); // If there is an error, continue trying to process other files. continue; } @@ -222,6 +228,9 @@ ${boilerplate} if ('error' in maybeSpecFilePath) { logError(maybeSpecFilePath.error); + // Sending broken XML to Failed Test Reporter will cause a job to fail + await del(path); + log.warning(`${path} file was deleted.`); // If there is an error, continue trying to process other files. continue; } diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/get_ftr_config.ts b/x-pack/plugins/security_solution/scripts/run_cypress/get_ftr_config.ts index cc3972cba0b2f..de5cb675a42e1 100644 --- a/x-pack/plugins/security_solution/scripts/run_cypress/get_ftr_config.ts +++ b/x-pack/plugins/security_solution/scripts/run_cypress/get_ftr_config.ts @@ -171,17 +171,6 @@ export const getFTRConfig = ({ } } - // Serverless Specific - if (vars.serverless) { - log.info(`Serverless mode detected`); - - vars.esTestCluster.serverArgs.push( - `xpack.security.authc.realms.saml.cloud-saml-kibana.sp.entity_id=http://host.docker.internal:${kibanaPort}`, - `xpack.security.authc.realms.saml.cloud-saml-kibana.sp.logout=http://host.docker.internal:${kibanaPort}/logout`, - `xpack.security.authc.realms.saml.cloud-saml-kibana.sp.acs=http://host.docker.internal:${kibanaPort}/api/security/saml/callback` - ); - } - if (specFileFTRConfig?.productTypes) { if (vars.serverless) { vars.kbnTestServer.serverArgs.push( diff --git a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts index a64f4027f456e..22b51692eb33f 100644 --- a/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts +++ b/x-pack/plugins/security_solution/scripts/run_cypress/parallel_serverless.ts @@ -148,7 +148,8 @@ async function resetCredentials( apiKey: string ): Promise { log.info(`${runnerId} : Reseting credentials`); - try { + + const fetchResetCredentialsStatusAttempt = async (attemptNum: number) => { const response = await axios.post( `${BASE_ENV_URL}/api/v1/serverless/projects/security/${projectId}/_reset-credentials`, {}, @@ -158,13 +159,27 @@ async function resetCredentials( }, } ); + log.info('Credentials have ben reset'); return { password: response.data.password, username: response.data.username, }; - } catch (error) { - throw new Error(`${error.message}`); - } + }; + + const retryOptions = { + onFailedAttempt: (error: Error | AxiosError) => { + if (error instanceof AxiosError && error.code === 'ENOTFOUND') { + log.info('Project is not reachable. A retry will be triggered soon..'); + } else { + log.info(error); + } + }, + retries: 100, + factor: 2, + maxTimeout: 20000, + }; + + return pRetry(fetchResetCredentialsStatusAttempt, retryOptions); } // Wait until Project is initialized @@ -180,7 +195,7 @@ function waitForProjectInitialized(projectId: string, apiKey: string): Promise { if (error instanceof AxiosError && error.code === 'ENOTFOUND') { - log.info('Project is not reachable. Retrying in 20s...'); + log.info('Project is not reachable. A retry will be triggered soon...'); } else { log.info(error); } @@ -239,7 +254,7 @@ function waitForKibanaAvailable(kbUrl: string, auth: string, runnerId: string): }, }); if (response.data.status.overall.level !== 'available') { - throw new Error(`${runnerId}: Kibana is not available. Retrying in 20s...`); + throw new Error(`${runnerId}: Kibana is not available. A retry will be triggered soon...`); } else { log.info(`${runnerId}: Kibana status overall is ${response.data.status.overall.level}.`); } @@ -247,7 +262,9 @@ function waitForKibanaAvailable(kbUrl: string, auth: string, runnerId: string): const retryOptions = { onFailedAttempt: (error: Error | AxiosError) => { if (error instanceof AxiosError && error.code === 'ENOTFOUND') { - log.info(`${runnerId}: The Kibana URL is not yet reachable. Retrying in 20s...`); + log.info( + `${runnerId}: The Kibana URL is not yet reachable. A retry will be triggered soon...` + ); } else { log.info(`${runnerId}: ${error}`); } @@ -264,17 +281,11 @@ function waitForEsAccess(esUrl: string, auth: string, runnerId: string): Promise const fetchEsAccessAttempt = async (attemptNum: number) => { log.info(`Retry number ${attemptNum} to check if can be accessed.`); - const response = await axios.get(`${esUrl}`, { + await axios.get(`${esUrl}`, { headers: { Authorization: `Basic ${auth}`, }, }); - - if (response.status !== 200) { - throw new Error('Cannot access. Retrying in 20s...'); - } else { - log.info('Access performed successfully'); - } }; const retryOptions = { onFailedAttempt: (error: Error | AxiosError) => { @@ -302,19 +313,14 @@ function waitForKibanaLogin(kbUrl: string, credentials: Credentials): Promise { log.info(`Retry number ${attemptNum} to check if login can be performed.`); - const response = await axios.post(`${kbUrl}/internal/security/login`, body, { + axios.post(`${kbUrl}/internal/security/login`, body, { headers: API_HEADERS, }); - if (response.status !== 200) { - throw new Error('Cannot login. Retrying in 20s...'); - } else { - log.info('Login can be performed successfully'); - } }; const retryOptions = { onFailedAttempt: (error: Error | AxiosError) => { if (error instanceof AxiosError && error.code === 'ENOTFOUND') { - log.info('Project is not reachable. Retrying login in 20s...'); + log.info('Project is not reachable. A retry will be triggered soon...'); } else { log.info(error); } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts index f5718895fff26..3260a3e188242 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts @@ -9,7 +9,7 @@ import moment from 'moment'; import type { ConcreteTaskInstance } from '@kbn/task-manager-plugin/server'; import { TaskStatus } from '@kbn/task-manager-plugin/server'; import type { TelemetryEventsSender } from '../sender'; -import type { TelemetryReceiver } from '../receiver'; +import type { ITelemetryReceiver, TelemetryReceiver } from '../receiver'; import type { SecurityTelemetryTaskConfig } from '../task'; import type { PackagePolicy } from '@kbn/fleet-plugin/common/types/models/package_policy'; import { stubEndpointAlertResponse, stubProcessTree, stubFetchTimelineEvents } from './timeline'; @@ -71,7 +71,7 @@ export const stubLicenseInfo: ESLicense = { export const createMockTelemetryReceiver = ( diagnosticsAlert?: unknown, emptyTimelineTree?: boolean -): jest.Mocked => { +): jest.Mocked => { const processTreeResponse = emptyTimelineTree ? Promise.resolve([]) : Promise.resolve(Promise.resolve(stubProcessTree())); @@ -91,12 +91,11 @@ export const createMockTelemetryReceiver = ( fetchEndpointList: jest.fn(), fetchDetectionRules: jest.fn().mockReturnValue({ body: null }), fetchEndpointMetadata: jest.fn(), - fetchTimelineEndpointAlerts: jest - .fn() - .mockReturnValue(Promise.resolve(stubEndpointAlertResponse())), + fetchTimelineAlerts: jest.fn().mockReturnValue(Promise.resolve(stubEndpointAlertResponse())), buildProcessTree: jest.fn().mockReturnValue(processTreeResponse), fetchTimelineEvents: jest.fn().mockReturnValue(Promise.resolve(stubFetchTimelineEvents())), fetchValueListMetaData: jest.fn(), + getAlertsIndex: jest.fn().mockReturnValue('test-alerts-index'), } as unknown as jest.Mocked; }; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts b/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts index 1404f8dba94e9..8e50e4590a72f 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/constants.ts @@ -9,6 +9,8 @@ export const TELEMETRY_CHANNEL_LISTS = 'security-lists-v2'; export const TELEMETRY_CHANNEL_ENDPOINT_META = 'endpoint-metadata'; +export const TELEMETRY_CHANNEL_ENDPOINT_ALERTS = 'alerts-endpoint'; + export const TELEMETRY_CHANNEL_DETECTION_ALERTS = 'alerts-detections'; export const TELEMETRY_CHANNEL_TIMELINE = 'alerts-timeline'; @@ -25,6 +27,8 @@ export const INSIGHTS_CHANNEL = 'security-insights-v1'; export const TASK_METRICS_CHANNEL = 'task-metrics'; +export const DEFAULT_DIAGNOSTIC_INDEX = '.logs-endpoint.diagnostic.collection-*' as const; + export const DEFAULT_ADVANCED_POLICY_CONFIG_SETTINGS = { linux: { advanced: { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/index.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/index.test.ts index d61a3e9206818..5ccbb0f53a331 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/index.test.ts @@ -279,6 +279,25 @@ describe('Security Telemetry filters', () => { }); }); + it('copies over github integration fields', () => { + const event = { + not_event: 'much data, much wow', + github: { + org: 'elastic', + repo: 'kibana', + team: 'elastic/security-data-analytics', + sensitive: 'i contain sensitive data', + }, + }; + expect(copyAllowlistedFields(prebuiltRuleAllowlistFields, event)).toStrictEqual({ + github: { + org: 'elastic', + repo: 'kibana', + team: 'elastic/security-data-analytics', + }, + }); + }); + it('copies over process/parent fields', () => { const event = { not_event: 'much data, much wow', diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/prebuilt_rules_alerts.ts b/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/prebuilt_rules_alerts.ts index c08c66a572245..a7e797227d24b 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/prebuilt_rules_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/filterlists/prebuilt_rules_alerts.ts @@ -350,6 +350,14 @@ export const prebuiltRuleAllowlistFields: AllowlistFields = { original_file_name: true, }, }, + github: { + org: true, + team: true, + repo: true, + category: true, + permission: true, + repository_public: true, + }, // Google/GCP google_workspace: { actor: { diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts index f5d6bc41ee349..3bd6a0d595a79 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts @@ -11,17 +11,25 @@ import type { PackagePolicy } from '@kbn/fleet-plugin/common/types/models/packag import { merge, set } from 'lodash'; import type { Logger } from '@kbn/core/server'; import { sha256 } from 'js-sha256'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { copyAllowlistedFields, filterList } from './filterlists'; -import type { PolicyConfig, PolicyData } from '../../../common/endpoint/types'; +import type { PolicyConfig, PolicyData, SafeEndpointEvent } from '../../../common/endpoint/types'; +import type { ITelemetryReceiver } from './receiver'; import type { - ExceptionListItem, + EnhancedAlertEvent, ESClusterInfo, ESLicense, + ExceptionListItem, + ExtraInfo, ListTemplate, + TaskMetric, TelemetryEvent, + TimeFrame, + TimelineResult, + TimelineTelemetryEvent, ValueListResponse, - TaskMetric, } from './types'; +import type { TaskExecutionPeriod } from './task'; import { LIST_DETECTION_RULE_EXCEPTION, LIST_ENDPOINT_EXCEPTION, @@ -30,6 +38,7 @@ import { DEFAULT_ADVANCED_POLICY_CONFIG_SETTINGS, } from './constants'; import { tagsToEffectScope } from '../../../common/endpoint/service/trusted_apps/mapping'; +import { resolverEntity } from '../../endpoint/routes/resolver/entity/utils/build_resolver_entity'; /** * Determines the when the last run was in order to execute to. @@ -345,3 +354,114 @@ export const processK8sUsernames = (clusterId: string, event: TelemetryEvent): T return event; }; + +export const ranges = ( + taskExecutionPeriod: TaskExecutionPeriod, + defaultIntervalInHours: number = 3 +) => { + const rangeFrom = taskExecutionPeriod.last ?? `now-${defaultIntervalInHours}h`; + const rangeTo = taskExecutionPeriod.current; + + return { rangeFrom, rangeTo }; +}; + +export class TelemetryTimelineFetcher { + startTime: number; + private receiver: ITelemetryReceiver; + private extraInfo: Promise; + private timeFrame: TimeFrame; + + constructor(receiver: ITelemetryReceiver) { + this.receiver = receiver; + this.startTime = Date.now(); + this.extraInfo = this.lookupExtraInfo(); + this.timeFrame = this.calculateTimeFrame(); + } + + async fetchTimeline(event: estypes.SearchHit): Promise { + const eventId = event._source ? event._source['event.id'] : 'unknown'; + const alertUUID = event._source ? event._source['kibana.alert.uuid'] : 'unknown'; + + const entities = resolverEntity([event]); + + // Build Tree + const tree = await this.receiver.buildProcessTree( + entities[0].id, + entities[0].schema, + this.timeFrame.startOfDay, + this.timeFrame.endOfDay + ); + + const nodeIds = Array.isArray(tree) ? tree.map((node) => node?.id.toString()) : []; + + const eventsStore = await this.fetchEventLineage(nodeIds); + + const telemetryTimeline: TimelineTelemetryEvent[] = Array.isArray(tree) + ? tree.map((node) => { + return { + ...node, + event: eventsStore.get(node.id.toString()), + }; + }) + : []; + + let record; + if (telemetryTimeline.length >= 1) { + const { clusterInfo, licenseInfo } = await this.extraInfo; + record = { + '@timestamp': moment().toISOString(), + version: clusterInfo.version?.number, + cluster_name: clusterInfo.cluster_name, + cluster_uuid: clusterInfo.cluster_uuid, + license_uuid: licenseInfo?.uid, + alert_id: alertUUID, + event_id: eventId, + timeline: telemetryTimeline, + }; + } + + const result: TimelineResult = { + nodes: nodeIds.length, + events: eventsStore.size, + timeline: record, + }; + + return result; + } + + private async fetchEventLineage(nodeIds: string[]): Promise> { + const timelineEvents = await this.receiver.fetchTimelineEvents(nodeIds); + const eventsStore = new Map(); + for (const event of timelineEvents.hits.hits) { + const doc = event._source; + + if (doc !== null && doc !== undefined) { + const entityId = doc?.process?.entity_id?.toString(); + if (entityId !== null && entityId !== undefined) eventsStore.set(entityId, doc); + } + } + return eventsStore; + } + + private async lookupExtraInfo(): Promise { + const [clusterInfoPromise, licenseInfoPromise] = await Promise.allSettled([ + this.receiver.fetchClusterInfo(), + this.receiver.fetchLicenseInfo(), + ]); + + const clusterInfo: ESClusterInfo = + clusterInfoPromise.status === 'fulfilled' ? clusterInfoPromise.value : ({} as ESClusterInfo); + + const licenseInfo: ESLicense | undefined = + licenseInfoPromise.status === 'fulfilled' ? licenseInfoPromise.value : ({} as ESLicense); + + return { clusterInfo, licenseInfo }; + } + + private calculateTimeFrame(): TimeFrame { + const now = moment(); + const startOfDay = now.startOf('day').toISOString(); + const endOfDay = now.endOf('day').toISOString(); + return { startOfDay, endOfDay }; + } +} diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts index c699f6a1e9698..a2360617c48f3 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts @@ -18,7 +18,7 @@ import type { SearchRequest, SearchResponse, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { ENDPOINT_TRUSTED_APPS_LIST_ID } from '@kbn/securitysolution-list-constants'; +import { ENDPOINT_ARTIFACT_LISTS } from '@kbn/securitysolution-list-constants'; import { EQL_RULE_TYPE_ID, INDICATOR_RULE_TYPE_ID, @@ -43,6 +43,7 @@ import type { PackageService, } from '@kbn/fleet-plugin/server'; import type { ExceptionListClient } from '@kbn/lists-plugin/server'; +import moment from 'moment'; import type { EndpointAppContextService } from '../../endpoint/endpoint_app_context_services'; import { exceptionListItemToTelemetryEntry, @@ -70,6 +71,7 @@ import type { import { telemetryConfiguration } from './configuration'; import { ENDPOINT_METRICS_INDEX } from '../../../common/constants'; import { PREBUILT_RULES_PACKAGE_NAME } from '../../../common/detection_engine/constants'; +import { DEFAULT_DIAGNOSTIC_INDEX } from './constants'; export interface ITelemetryReceiver { start( @@ -163,7 +165,11 @@ export interface ITelemetryReceiver { fetchPrebuiltRuleAlerts(): Promise<{ events: TelemetryEvent[]; count: number }>; - fetchTimelineEndpointAlerts(interval: number): Promise>>; + fetchTimelineAlerts( + index: string, + rangeFrom: string, + rangeTo: string + ): Promise>>; buildProcessTree( entityId: string, @@ -177,6 +183,8 @@ export interface ITelemetryReceiver { ): Promise>>; fetchValueListMetaData(interval: number): Promise; + + getAlertsIndex(): string | undefined; } export class TelemetryReceiver implements ITelemetryReceiver { @@ -224,6 +232,10 @@ export class TelemetryReceiver implements ITelemetryReceiver { return this.clusterInfo; } + public getAlertsIndex(): string | undefined { + return this.alertsIndex; + } + public async fetchDetectionRulesPackageVersion(): Promise { return this.packageService?.asInternalUser.getInstallation(PREBUILT_RULES_PACKAGE_NAME); } @@ -396,7 +408,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { const query = { expand_wildcards: ['open' as const, 'hidden' as const], - index: '.logs-endpoint.diagnostic.collection-*', + index: `${DEFAULT_DIAGNOSTIC_INDEX}-*`, ignore_unavailable: true, size: telemetryConfiguration.telemetry_max_buffer_size, body: { @@ -439,11 +451,12 @@ export class TelemetryReceiver implements ITelemetryReceiver { // Ensure list is created if it does not exist await this.exceptionListClient.createTrustedAppsList(); + const timeFrom = moment.utc().subtract(1, 'day').valueOf(); const results = await this.exceptionListClient.findExceptionListItem({ - listId: ENDPOINT_TRUSTED_APPS_LIST_ID, + listId: ENDPOINT_ARTIFACT_LISTS.trustedApps.id, page: 1, perPage: 10_000, - filter: undefined, + filter: `exception-list-agnostic.attributes.created_at >= ${timeFrom}`, namespaceType: 'agnostic', sortField: 'name', sortOrder: 'asc', @@ -465,11 +478,12 @@ export class TelemetryReceiver implements ITelemetryReceiver { // Ensure list is created if it does not exist await this.exceptionListClient.createEndpointList(); + const timeFrom = moment.utc().subtract(1, 'day').valueOf(); const results = await this.exceptionListClient.findExceptionListItem({ listId, page: 1, perPage: this.maxRecords, - filter: undefined, + filter: `exception-list-agnostic.attributes.created_at >= ${timeFrom}`, namespaceType: 'agnostic', sortField: 'name', sortOrder: 'asc', @@ -545,9 +559,14 @@ export class TelemetryReceiver implements ITelemetryReceiver { // Ensure list is created if it does not exist await this.exceptionListClient.createTrustedAppsList(); + const timeFrom = `exception-list.attributes.created_at >= ${moment + .utc() + .subtract(24, 'hours') + .valueOf()}`; + const results = await this.exceptionListClient?.findExceptionListsItem({ listId: [listId], - filter: [], + filter: [timeFrom], perPage: this.maxRecords, page: 1, sortField: 'exception-list.created_at', @@ -697,7 +716,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { return { events: telemetryEvents, count: aggregations?.prebuilt_rule_alert_count.value ?? 0 }; } - public async fetchTimelineEndpointAlerts(interval: number) { + async fetchTimelineAlerts(index: string, rangeFrom: string, rangeTo: string) { if (this.esClient === undefined || this.esClient === null) { throw Error('elasticsearch client is unavailable: cannot retrieve cluster infomation'); } @@ -708,7 +727,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { // create and assign an initial point in time let pitId: OpenPointInTimeResponse['id'] = ( await this.esClient.openPointInTime({ - index: `${this.alertsIndex}*`, + index: `${index}*`, keep_alive: keepAlive, }) ).id; @@ -746,8 +765,8 @@ export class TelemetryReceiver implements ITelemetryReceiver { { range: { '@timestamp': { - gte: `now-${interval}h`, - lte: 'now', + gte: rangeFrom, + lte: rangeTo, }, }, }, @@ -807,7 +826,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { } tlog(this.logger, `Timeline alerts to return: ${alertsToReturn.length}`); - return alertsToReturn; + return alertsToReturn || []; } public async buildProcessTree( diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts index 4562cbb725cb4..00da024b0049e 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts @@ -11,7 +11,13 @@ import { TELEMETRY_CHANNEL_LISTS, TASK_METRICS_CHANNEL, } from '../constants'; -import { batchTelemetryRecords, templateExceptionList, tlog, createTaskMetric } from '../helpers'; +import { + batchTelemetryRecords, + templateExceptionList, + tlog, + createTaskMetric, + createUsageCounterLabel, +} from '../helpers'; import type { ITelemetryEventsSender } from '../sender'; import type { ITelemetryReceiver } from '../receiver'; import type { ExceptionListItem, ESClusterInfo, ESLicense, RuleSearchResult } from '../types'; @@ -31,8 +37,18 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n sender: ITelemetryEventsSender, taskExecutionPeriod: TaskExecutionPeriod ) => { + const usageCollector = sender.getTelemetryUsageCluster(); + + const usageLabelPrefix: string[] = ['security_telemetry', 'detection-rules']; + const startTime = Date.now(); const taskName = 'Security Solution Detection Rule Lists Telemetry'; + + tlog( + logger, + `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` + ); + try { const [clusterInfoPromise, licenseInfoPromise] = await Promise.allSettled([ receiver.fetchClusterInfo(), @@ -98,6 +114,13 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n LIST_DETECTION_RULE_EXCEPTION ); tlog(logger, `Detection rule exception json length ${detectionRuleExceptionsJson.length}`); + + usageCollector?.incrementCounter({ + counterName: createUsageCounterLabel(usageLabelPrefix), + counterType: 'detection_rule_count', + incrementBy: detectionRuleExceptionsJson.length, + }); + const batches = batchTelemetryRecords(detectionRuleExceptionsJson, maxTelemetryBatch); for (const batch of batches) { await sender.sendOnDemand(TELEMETRY_CHANNEL_LISTS, batch); @@ -105,7 +128,7 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ createTaskMetric(taskName, true, startTime), ]); - return detectionRuleExceptions.length; + return detectionRuleExceptionsJson.length; } catch (err) { await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ createTaskMetric(taskName, false, startTime, err.message), diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.test.ts index a83326334c9d7..223e732f946e9 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.test.ts @@ -37,15 +37,10 @@ describe('diagnostics telemetry task test', () => { mockTelemetryEventsSender, testTaskExecutionPeriod ); - expect(mockTelemetryReceiver.fetchDiagnosticAlerts).toHaveBeenCalledWith( testTaskExecutionPeriod.last, testTaskExecutionPeriod.current ); - - expect(mockTelemetryEventsSender.queueTelemetryEvents).toHaveBeenCalledWith( - testDiagnosticsAlerts.hits.hits.flatMap((doc) => [doc._source]) - ); - expect(mockTelemetryEventsSender.sendOnDemand).toBeCalledTimes(1); + expect(mockTelemetryEventsSender.sendOnDemand).toBeCalledTimes(2); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts index 5c4604289eb51..290c5cfc44a6e 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/diagnostic.ts @@ -11,7 +11,7 @@ import type { ITelemetryEventsSender } from '../sender'; import type { TelemetryEvent } from '../types'; import type { ITelemetryReceiver } from '../receiver'; import type { TaskExecutionPeriod } from '../task'; -import { TASK_METRICS_CHANNEL } from '../constants'; +import { TELEMETRY_CHANNEL_ENDPOINT_ALERTS, TASK_METRICS_CHANNEL } from '../constants'; export function createTelemetryDiagnosticsTaskConfig() { return { @@ -49,14 +49,15 @@ export function createTelemetryDiagnosticsTaskConfig() { return 0; } tlog(logger, `Received ${hits.length} diagnostic alerts`); - const diagAlerts: TelemetryEvent[] = hits.flatMap((h) => + const alerts: TelemetryEvent[] = hits.flatMap((h) => h._source != null ? [h._source] : [] ); - sender.queueTelemetryEvents(diagAlerts); + + await sender.sendOnDemand(TELEMETRY_CHANNEL_ENDPOINT_ALERTS, alerts); await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ createTaskMetric(taskName, true, startTime), ]); - return diagAlerts.length; + return alerts.length; } catch (err) { await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ createTaskMetric(taskName, false, startTime, err.message), diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/index.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/index.ts index e25b3690ee88d..d237757616f3e 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/index.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/index.ts @@ -12,6 +12,7 @@ import { createTelemetrySecurityListTaskConfig } from './security_lists'; import { createTelemetryDetectionRuleListsTaskConfig } from './detection_rule'; import { createTelemetryPrebuiltRuleAlertsTaskConfig } from './prebuilt_rule_alerts'; import { createTelemetryTimelineTaskConfig } from './timelines'; +import { createTelemetryDiagnosticTimelineTaskConfig } from './timelines_diagnostic'; import { createTelemetryConfigurationTaskConfig } from './configuration'; import { telemetryConfiguration } from '../configuration'; import { createTelemetryFilterListArtifactTaskConfig } from './filterlists'; @@ -26,6 +27,7 @@ export function createTelemetryTaskConfigs(): SecurityTelemetryTaskConfig[] { ), createTelemetryPrebuiltRuleAlertsTaskConfig(telemetryConfiguration.max_detection_alerts_batch), createTelemetryTimelineTaskConfig(), + createTelemetryDiagnosticTimelineTaskConfig(), createTelemetryConfigurationTaskConfig(), createTelemetryFilterListArtifactTaskConfig(), ]; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts index 04312e8843e28..863d66d55c4e7 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts @@ -6,10 +6,7 @@ */ import type { Logger } from '@kbn/core/server'; -import { - ENDPOINT_LIST_ID, - ENDPOINT_EVENT_FILTERS_LIST_ID, -} from '@kbn/securitysolution-list-constants'; +import { ENDPOINT_LIST_ID, ENDPOINT_ARTIFACT_LISTS } from '@kbn/securitysolution-list-constants'; import { LIST_ENDPOINT_EXCEPTION, LIST_ENDPOINT_EVENT_FILTER, @@ -23,6 +20,8 @@ import { templateExceptionList, createTaskMetric, formatValueListMetaData, + createUsageCounterLabel, + tlog, } from '../helpers'; import type { ITelemetryEventsSender } from '../sender'; import type { ITelemetryReceiver } from '../receiver'; @@ -42,10 +41,16 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) sender: ITelemetryEventsSender, taskExecutionPeriod: TaskExecutionPeriod ) => { + const usageCollector = sender.getTelemetryUsageCluster(); + + const usageLabelPrefix: string[] = ['security_telemetry', 'lists']; + const startTime = Date.now(); const taskName = 'Security Solution Lists Telemetry'; try { - let count = 0; + let trustedApplicationsCount = 0; + let endpointExceptionsCount = 0; + let endpointEventFiltersCount = 0; const [clusterInfoPromise, licenseInfoPromise] = await Promise.allSettled([ receiver.fetchClusterInfo(), @@ -71,7 +76,14 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) licenseInfo, LIST_TRUSTED_APPLICATION ); - count += trustedAppsJson.length; + trustedApplicationsCount = trustedAppsJson.length; + tlog(logger, `Trusted Apps: ${trustedApplicationsCount}`); + + usageCollector?.incrementCounter({ + counterName: createUsageCounterLabel(usageLabelPrefix), + counterType: 'trusted_apps_count', + incrementBy: trustedApplicationsCount, + }); const batches = batchTelemetryRecords(trustedAppsJson, maxTelemetryBatch); for (const batch of batches) { @@ -89,7 +101,14 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) licenseInfo, LIST_ENDPOINT_EXCEPTION ); - count += epExceptionsJson.length; + endpointExceptionsCount = epExceptionsJson.length; + tlog(logger, `EP Exceptions: ${endpointExceptionsCount}`); + + usageCollector?.incrementCounter({ + counterName: createUsageCounterLabel(usageLabelPrefix), + counterType: 'endpoint_exceptions_count', + incrementBy: endpointExceptionsCount, + }); const batches = batchTelemetryRecords(epExceptionsJson, maxTelemetryBatch); for (const batch of batches) { @@ -99,7 +118,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) // Lists Telemetry: Endpoint Event Filters - const epFilters = await receiver.fetchEndpointList(ENDPOINT_EVENT_FILTERS_LIST_ID); + const epFilters = await receiver.fetchEndpointList(ENDPOINT_ARTIFACT_LISTS.eventFilters.id); if (epFilters?.data) { const epFiltersJson = templateExceptionList( epFilters.data, @@ -107,7 +126,14 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) licenseInfo, LIST_ENDPOINT_EVENT_FILTER ); - count += epFiltersJson.length; + endpointEventFiltersCount = epFiltersJson.length; + tlog(logger, `EP Event Filters: ${endpointEventFiltersCount}`); + + usageCollector?.incrementCounter({ + counterName: createUsageCounterLabel(usageLabelPrefix), + counterType: 'endpoint_event_filters_count', + incrementBy: endpointEventFiltersCount, + }); const batches = batchTelemetryRecords(epFiltersJson, maxTelemetryBatch); for (const batch of batches) { @@ -130,7 +156,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ createTaskMetric(taskName, true, startTime), ]); - return count; + return trustedApplicationsCount + endpointExceptionsCount + endpointEventFiltersCount; } catch (err) { await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ createTaskMetric(taskName, false, startTime, err.message), diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/tasks.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/tasks.test.ts index f91de7fe5b194..75da7e5084ab2 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/tasks.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/tasks.test.ts @@ -52,8 +52,8 @@ describe('security telemetry - ', () => { expect(taskConfig.interval).toEqual('24h'); }); - test('timelines task is set to 3h', async () => { + test('timelines task is set to 1h', async () => { const taskConfig = createTelemetryTimelineTaskConfig(); - expect(taskConfig.interval).toEqual('3h'); + expect(taskConfig.interval).toEqual('1h'); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.test.ts index 16794dfa3f68f..930ef076edd3f 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.test.ts @@ -35,7 +35,7 @@ describe('timeline telemetry task test', () => { expect(mockTelemetryReceiver.buildProcessTree).toHaveBeenCalled(); expect(mockTelemetryReceiver.fetchTimelineEvents).toHaveBeenCalled(); - expect(mockTelemetryReceiver.fetchTimelineEndpointAlerts).toHaveBeenCalled(); + expect(mockTelemetryReceiver.fetchTimelineAlerts).toHaveBeenCalled(); expect(mockTelemetryEventsSender.getTelemetryUsageCluster).toHaveBeenCalled(); expect(mockTelemetryEventsSender.sendOnDemand).toHaveBeenCalled(); }); @@ -59,6 +59,6 @@ describe('timeline telemetry task test', () => { expect(mockTelemetryReceiver.buildProcessTree).toHaveBeenCalled(); expect(mockTelemetryReceiver.fetchTimelineEvents).toHaveBeenCalled(); - expect(mockTelemetryReceiver.fetchTimelineEndpointAlerts).toHaveBeenCalled(); + expect(mockTelemetryReceiver.fetchTimelineAlerts).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts index bd50ffcd92817..7e0c41e57eec4 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines.ts @@ -5,29 +5,22 @@ * 2.0. */ -import moment from 'moment'; import type { Logger } from '@kbn/core/server'; -import type { SafeEndpointEvent } from '../../../../common/endpoint/types'; import type { ITelemetryEventsSender } from '../sender'; import type { ITelemetryReceiver } from '../receiver'; import type { TaskExecutionPeriod } from '../task'; -import type { - ESClusterInfo, - ESLicense, - TimelineTelemetryTemplate, - TimelineTelemetryEvent, -} from '../types'; import { TELEMETRY_CHANNEL_TIMELINE, TASK_METRICS_CHANNEL } from '../constants'; -import { resolverEntity } from '../../../endpoint/routes/resolver/entity/utils/build_resolver_entity'; -import { tlog, createTaskMetric } from '../helpers'; +import { createTaskMetric, ranges, TelemetryTimelineFetcher, tlog } from '../helpers'; export function createTelemetryTimelineTaskConfig() { + const taskName = 'Security Solution Timeline telemetry'; + return { type: 'security:telemetry-timelines', - title: 'Security Solution Timeline telemetry', - interval: '3h', - timeout: '10m', - version: '1.0.0', + title: taskName, + interval: '1h', + timeout: '15m', + version: '1.0.1', runTask: async ( taskId: string, logger: Logger, @@ -35,142 +28,59 @@ export function createTelemetryTimelineTaskConfig() { sender: ITelemetryEventsSender, taskExecutionPeriod: TaskExecutionPeriod ) => { - const startTime = Date.now(); - const taskName = 'Security Solution Timeline telemetry'; - try { - let counter = 0; - - tlog(logger, `Running task: ${taskId}`); - - const [clusterInfoPromise, licenseInfoPromise] = await Promise.allSettled([ - receiver.fetchClusterInfo(), - receiver.fetchLicenseInfo(), - ]); - - const clusterInfo = - clusterInfoPromise.status === 'fulfilled' - ? clusterInfoPromise.value - : ({} as ESClusterInfo); - - const licenseInfo = - licenseInfoPromise.status === 'fulfilled' - ? licenseInfoPromise.value - : ({} as ESLicense | undefined); + tlog( + logger, + `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` + ); - const now = moment(); - const startOfDay = now.startOf('day').toISOString(); - const endOfDay = now.endOf('day').toISOString(); + const fetcher = new TelemetryTimelineFetcher(receiver); - const baseDocument = { - version: clusterInfo.version?.number, - cluster_name: clusterInfo.cluster_name, - cluster_uuid: clusterInfo.cluster_uuid, - license_uuid: licenseInfo?.uid, - }; - - // Fetch EP Alerts + try { + let counter = 0; - const endpointAlerts = await receiver.fetchTimelineEndpointAlerts(3); + const { rangeFrom, rangeTo } = ranges(taskExecutionPeriod); - // No EP Alerts -> Nothing to do - if (endpointAlerts.length === 0 || endpointAlerts.length === undefined) { - tlog(logger, 'no endpoint alerts received. exiting telemetry task.'); - await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ - createTaskMetric(taskName, true, startTime), - ]); - return counter; + const alertsIndex = receiver.getAlertsIndex(); + if (!alertsIndex) { + throw Error('alerts index is not ready yet, skipping telemetry task'); } + const alerts = await receiver.fetchTimelineAlerts(alertsIndex, rangeFrom, rangeTo); - // Build process tree for each EP Alert recieved - - for (const alert of endpointAlerts) { - const eventId = alert._source ? alert._source['event.id'] : 'unknown'; - const alertUUID = alert._source ? alert._source['kibana.alert.uuid'] : 'unknown'; + tlog(logger, `found ${alerts.length} alerts to process`); - const entities = resolverEntity([alert]); - - // Build Tree - - const tree = await receiver.buildProcessTree( - entities[0].id, - entities[0].schema, - startOfDay, - endOfDay - ); - - const nodeIds = [] as string[]; - if (Array.isArray(tree)) { - for (const node of tree) { - const nodeId = node?.id.toString(); - nodeIds.push(nodeId); - } - } + for (const alert of alerts) { + const result = await fetcher.fetchTimeline(alert); sender.getTelemetryUsageCluster()?.incrementCounter({ counterName: 'telemetry_timeline', counterType: 'timeline_node_count', - incrementBy: nodeIds.length, + incrementBy: result.nodes, }); - // Fetch event lineage - - const timelineEvents = await receiver.fetchTimelineEvents(nodeIds); - const eventsStore = new Map(); - for (const event of timelineEvents.hits.hits) { - const doc = event._source; - - if (doc !== null && doc !== undefined) { - const entityId = doc?.process?.entity_id?.toString(); - if (entityId !== null && entityId !== undefined) eventsStore.set(entityId, doc); - } - } - sender.getTelemetryUsageCluster()?.incrementCounter({ counterName: 'telemetry_timeline', counterType: 'timeline_event_count', - incrementBy: eventsStore.size, + incrementBy: result.events, }); - // Create telemetry record - - const telemetryTimeline: TimelineTelemetryEvent[] = []; - if (Array.isArray(tree)) { - for (const node of tree) { - const id = node.id.toString(); - const event = eventsStore.get(id); - - const timelineTelemetryEvent: TimelineTelemetryEvent = { - ...node, - event, - }; - - telemetryTimeline.push(timelineTelemetryEvent); - } - } - - if (telemetryTimeline.length >= 1) { - const record: TimelineTelemetryTemplate = { - '@timestamp': moment().toISOString(), - ...baseDocument, - alert_id: alertUUID, - event_id: eventId, - timeline: telemetryTimeline, - }; - - sender.sendOnDemand(TELEMETRY_CHANNEL_TIMELINE, [record]); + if (result.timeline) { + sender.sendOnDemand(TELEMETRY_CHANNEL_TIMELINE, [result.timeline]); counter += 1; } else { tlog(logger, 'no events in timeline'); } } - tlog(logger, `sent ${counter} timelines. concluding timeline task.`); + + tlog(logger, `sent ${counter} timelines. Concluding timeline task.`); + await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ - createTaskMetric(taskName, true, startTime), + createTaskMetric(taskName, true, fetcher.startTime), ]); + return counter; } catch (err) { await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ - createTaskMetric(taskName, false, startTime, err.message), + createTaskMetric(taskName, false, fetcher.startTime, err.message), ]); return 0; } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.test.ts new file mode 100644 index 0000000000000..887e0789e7754 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.test.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { loggingSystemMock } from '@kbn/core/server/mocks'; +import { createTelemetryDiagnosticTimelineTaskConfig } from './timelines_diagnostic'; +import { createMockTelemetryEventsSender, createMockTelemetryReceiver } from '../__mocks__'; + +describe('timeline telemetry diagnostic task test', () => { + let logger: ReturnType; + + beforeEach(() => { + logger = loggingSystemMock.createLogger(); + }); + + test('timeline telemetry task should be correctly set up', async () => { + const testTaskExecutionPeriod = { + last: undefined, + current: new Date().toISOString(), + }; + const mockTelemetryEventsSender = createMockTelemetryEventsSender(); + const mockTelemetryReceiver = createMockTelemetryReceiver(); + const telemetryTelemetryDiagnosticTaskConfig = createTelemetryDiagnosticTimelineTaskConfig(); + + await telemetryTelemetryDiagnosticTaskConfig.runTask( + 'test-timeline-diagnostic-task-id', + logger, + mockTelemetryReceiver, + mockTelemetryEventsSender, + testTaskExecutionPeriod + ); + + expect(mockTelemetryReceiver.buildProcessTree).toHaveBeenCalled(); + expect(mockTelemetryReceiver.fetchTimelineEvents).toHaveBeenCalled(); + expect(mockTelemetryReceiver.fetchTimelineAlerts).toHaveBeenCalled(); + expect(mockTelemetryEventsSender.getTelemetryUsageCluster).toHaveBeenCalled(); + expect(mockTelemetryEventsSender.sendOnDemand).toHaveBeenCalled(); + }); + + test('if no timeline events received it should not send a telemetry record', async () => { + const testTaskExecutionPeriod = { + last: undefined, + current: new Date().toISOString(), + }; + const mockTelemetryEventsSender = createMockTelemetryEventsSender(); + const mockTelemetryReceiver = createMockTelemetryReceiver(null, true); + const telemetryTelemetryDiagnosticTaskConfig = createTelemetryDiagnosticTimelineTaskConfig(); + + await telemetryTelemetryDiagnosticTaskConfig.runTask( + 'test-timeline-diagnostic-task-id', + logger, + mockTelemetryReceiver, + mockTelemetryEventsSender, + testTaskExecutionPeriod + ); + + expect(mockTelemetryReceiver.buildProcessTree).toHaveBeenCalled(); + expect(mockTelemetryReceiver.fetchTimelineEvents).toHaveBeenCalled(); + expect(mockTelemetryReceiver.fetchTimelineAlerts).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts new file mode 100644 index 0000000000000..7148848984b0a --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/timelines_diagnostic.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { Logger } from '@kbn/core/server'; +import type { ITelemetryEventsSender } from '../sender'; +import type { ITelemetryReceiver } from '../receiver'; +import type { TaskExecutionPeriod } from '../task'; +import { + DEFAULT_DIAGNOSTIC_INDEX, + TELEMETRY_CHANNEL_TIMELINE, + TASK_METRICS_CHANNEL, +} from '../constants'; +import { createTaskMetric, ranges, TelemetryTimelineFetcher, tlog } from '../helpers'; + +export function createTelemetryDiagnosticTimelineTaskConfig() { + const taskName = 'Security Solution Diagnostic Timeline telemetry'; + + return { + type: 'security:telemetry-diagnostic-timelines', + title: taskName, + interval: '1h', + timeout: '15m', + version: '1.0.0', + runTask: async ( + taskId: string, + logger: Logger, + receiver: ITelemetryReceiver, + sender: ITelemetryEventsSender, + taskExecutionPeriod: TaskExecutionPeriod + ) => { + tlog( + logger, + `Running task: ${taskId} [last: ${taskExecutionPeriod.last} - current: ${taskExecutionPeriod.current}]` + ); + + const fetcher = new TelemetryTimelineFetcher(receiver); + + try { + let counter = 0; + + const { rangeFrom, rangeTo } = ranges(taskExecutionPeriod); + + const alerts = await receiver.fetchTimelineAlerts( + DEFAULT_DIAGNOSTIC_INDEX, + rangeFrom, + rangeTo + ); + + tlog(logger, `found ${alerts.length} alerts to process`); + + for (const alert of alerts) { + const result = await fetcher.fetchTimeline(alert); + + sender.getTelemetryUsageCluster()?.incrementCounter({ + counterName: 'telemetry_timeline_diagnostic', + counterType: 'timeline_diagnostic_node_count', + incrementBy: result.nodes, + }); + + sender.getTelemetryUsageCluster()?.incrementCounter({ + counterName: 'telemetry_timeline_diagnostic', + counterType: 'timeline_diagnostic_event_count', + incrementBy: result.events, + }); + + if (result.timeline) { + sender.sendOnDemand(TELEMETRY_CHANNEL_TIMELINE, [result.timeline]); + counter += 1; + } else { + tlog(logger, 'no events in timeline'); + } + } + + tlog(logger, `sent ${counter} timelines. Concluding timeline task.`); + + await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ + createTaskMetric(taskName, true, fetcher.startTime), + ]); + + return counter; + } catch (err) { + await sender.sendOnDemand(TASK_METRICS_CHANNEL, [ + createTaskMetric(taskName, false, fetcher.startTime, err.message), + ]); + return 0; + } + }, + }; +} diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts index df3b571714b29..433c1c01cf0bc 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts @@ -457,3 +457,19 @@ export interface ValueListResponse { exceptionListMetricsResponse: ValueListExceptionListResponseAggregation; indicatorMatchMetricsResponse: ValueListIndicatorMatchResponseAggregation; } + +export interface ExtraInfo { + clusterInfo: ESClusterInfo; + licenseInfo: ESLicense | undefined; +} + +export interface TimeFrame { + startOfDay: string; + endOfDay: string; +} + +export interface TimelineResult { + nodes: number; + events: number; + timeline: TimelineTelemetryTemplate | undefined; +} diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index 4d2b16e355c6c..4b762590b2274 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -170,7 +170,6 @@ "@kbn/security-solution-features", "@kbn/content-management-plugin", "@kbn/discover-utils", - "@kbn/subscription-tracking", "@kbn/core-application-common", "@kbn/openapi-generator", "@kbn/es", @@ -178,6 +177,6 @@ "@kbn/unified-doc-viewer-plugin", "@kbn/shared-ux-error-boundary", "@kbn/zod-helpers", - "@kbn/core-http-common", + "@kbn/core-http-common" ] } diff --git a/x-pack/plugins/security_solution_ess/public/plugin.ts b/x-pack/plugins/security_solution_ess/public/plugin.ts index 7857c0ffa553d..68b902a95dc84 100644 --- a/x-pack/plugins/security_solution_ess/public/plugin.ts +++ b/x-pack/plugins/security_solution_ess/public/plugin.ts @@ -45,7 +45,7 @@ export class SecuritySolutionEssPlugin }); securitySolution.setComponents({ - getStarted: getSecurityGetStartedComponent(services), + GetStarted: getSecurityGetStartedComponent(services), }); subscribeBreadcrumbs(services); diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.test.ts b/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.test.ts index 5b3502225e769..74979b0549b91 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.test.ts +++ b/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.test.ts @@ -119,7 +119,7 @@ describe('formatChromeProjectNavNodes', () => { { id: chromeNavLink1.id, title: link1.title, - path: [chromeNavLink1.id], + path: chromeNavLink1.id, deepLink: chromeNavLink1, }, ]); @@ -132,7 +132,7 @@ describe('formatChromeProjectNavNodes', () => { { id: chromeNavLink3.id, title: chromeNavLink3.title, - path: [chromeNavLink3.id], + path: chromeNavLink3.id, deepLink: chromeNavLink3, }, ]); @@ -145,13 +145,13 @@ describe('formatChromeProjectNavNodes', () => { { id: chromeNavLink1.id, title: link1.title, - path: [chromeNavLink1.id], + path: chromeNavLink1.id, deepLink: chromeNavLink1, children: [ { id: chromeNavLink2.id, title: link2.title, - path: [chromeNavLink1.id, chromeNavLink2.id], + path: [chromeNavLink1.id, chromeNavLink2.id].join('.'), deepLink: chromeNavLink2, }, ], @@ -173,24 +173,24 @@ describe('formatChromeProjectNavNodes', () => { { id: chromeNavLinkTest.id, title: link1.title, - path: [chromeNavLinkTest.id], + path: chromeNavLinkTest.id, deepLink: chromeNavLinkTest, children: [ { id: chromeNavLinkMl1.id, title: chromeNavLinkMl1.title, - path: [chromeNavLinkTest.id, chromeNavLinkMl1.id], + path: [chromeNavLinkTest.id, chromeNavLinkMl1.id].join('.'), deepLink: chromeNavLinkMl1, }, { id: defaultNavCategory1.id, title: defaultNavCategory1.title, - path: [chromeNavLinkTest.id, defaultNavCategory1.id], + path: [chromeNavLinkTest.id, defaultNavCategory1.id].join('.'), children: [ { id: chromeNavLinkMl2.id, title: 'Overridden ML SubLink 2', - path: [chromeNavLinkTest.id, defaultNavCategory1.id, chromeNavLinkMl2.id], + path: [chromeNavLinkTest.id, defaultNavCategory1.id, chromeNavLinkMl2.id].join('.'), deepLink: chromeNavLinkMl2, }, ], @@ -208,7 +208,7 @@ describe('formatChromeProjectNavNodes', () => { { id: chromeNavLink2.id, title: link2.title, - path: [chromeNavLink2.id], + path: chromeNavLink2.id, deepLink: chromeNavLink2, }, ]); @@ -230,14 +230,14 @@ describe('formatChromeProjectNavNodes', () => { { id: chromeNavLinkTest.id, title: link1.title, - path: [chromeNavLinkTest.id], + path: chromeNavLinkTest.id, deepLink: chromeNavLinkTest, breadcrumbStatus: 'hidden', }, { id: chromeNavLink2.id, title: link2.title, - path: [chromeNavLink2.id], + path: chromeNavLink2.id, deepLink: chromeNavLink2, }, ]); diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.ts b/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.ts index 0dc8a1140aaab..b787aeb927361 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.ts +++ b/x-pack/plugins/security_solution_serverless/public/navigation/navigation_tree/chrome_navigation_tree.ts @@ -19,7 +19,7 @@ import { isBreadcrumbHidden } from './utils'; export const getFormatChromeProjectNavNodes = (services: Services) => { const formatChromeProjectNavNodes = ( projectNavLinks: ProjectNavigationLink[], - path: string[] = [] + path?: string ): ChromeProjectNavigationNode[] => { const { chrome } = services; @@ -31,7 +31,7 @@ export const getFormatChromeProjectNavNodes = (services: Services) => { const link: ChromeProjectNavigationNode = { id: navLinkId, title, - path: [...path, navLinkId], + path: path ? [path, navLinkId].join('.') : navLinkId, deepLink: chrome.navLinks.get(navLinkId), ...(isBreadcrumbHidden(id) && { breadcrumbStatus: 'hidden' }), }; @@ -63,7 +63,7 @@ export const getFormatChromeProjectNavNodes = (services: Services) => { const processDefaultNav = ( children: NodeDefinition[], - path: string[] + path: string ): ChromeProjectNavigationNode[] => { const { chrome } = services; return children.reduce((navNodes, node) => { @@ -80,7 +80,7 @@ export const getFormatChromeProjectNavNodes = (services: Services) => { const navNode: ChromeProjectNavigationNode = { id, title: node.title || '', - path: [...path, id], + path: [path, id].join('.'), breadcrumbStatus: node.breadcrumbStatus, getIsActive: node.getIsActive, }; diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/project_navigation/project_navigation.tsx b/x-pack/plugins/security_solution_serverless/public/navigation/project_navigation/project_navigation.tsx index b26700eb8e4b3..2532589d1c994 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/project_navigation/project_navigation.tsx +++ b/x-pack/plugins/security_solution_serverless/public/navigation/project_navigation/project_navigation.tsx @@ -13,7 +13,7 @@ import type { import { SolutionSideNavPanelContent } from '@kbn/security-solution-side-nav/panel'; import useObservable from 'react-use/lib/useObservable'; import { useKibana } from '../../common/services'; -import type { ProjectNavigationLink, ProjectPageName } from '../links/types'; +import type { ProjectNavigationLink } from '../links/types'; import { useFormattedSideNavItems } from '../side_navigation/use_side_nav_items'; import { CATEGORIES, FOOTER_CATEGORIES } from '../categories'; import { formatNavigationTree } from '../navigation_tree/navigation_tree'; @@ -21,8 +21,7 @@ import { formatNavigationTree } from '../navigation_tree/navigation_tree'; const getPanelContentProvider = ( projectNavLinks: ProjectNavigationLink[] ): React.FC => - React.memo(function PanelContentProvider({ selectedNode: { path }, closePanel }) { - const linkId = path[path.length - 1] as ProjectPageName; + React.memo(function PanelContentProvider({ selectedNode: { id: linkId }, closePanel }) { const currentPanelItem = projectNavLinks.find((item) => item.id === linkId); const { title = '', links = [], categories } = currentPanelItem ?? {}; diff --git a/x-pack/plugins/security_solution_serverless/public/plugin.ts b/x-pack/plugins/security_solution_serverless/public/plugin.ts index e7e58c42bcaac..77fcbc19d6e26 100644 --- a/x-pack/plugins/security_solution_serverless/public/plugin.ts +++ b/x-pack/plugins/security_solution_serverless/public/plugin.ts @@ -69,8 +69,8 @@ export class SecuritySolutionServerlessPlugin registerUpsellings(securitySolution.getUpselling(), productTypes, services); securitySolution.setComponents({ - getStarted: getSecurityGetStartedComponent(services, productTypes), - dashboardsLandingCallout: getDashboardsLandingCallout(services), + GetStarted: getSecurityGetStartedComponent(services, productTypes), + DashboardsLandingCallout: getDashboardsLandingCallout(services), }); startNavigation(services); diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts index 1a9501424ba00..0dde94b409875 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/cloud_security_metering_task.ts @@ -205,14 +205,17 @@ const indexHasDataInDateRange = async ( cloudSecuritySolution: CloudSecuritySolutions, searchFrom: Date ) => { - const response = await esClient.search({ - index: METERING_CONFIGS[cloudSecuritySolution].index, - size: 1, - _source: false, - query: getSearchQueryByCloudSecuritySolution(cloudSecuritySolution, searchFrom), - }); + const response = await esClient.search( + { + index: METERING_CONFIGS[cloudSecuritySolution].index, + size: 1, + _source: false, + query: getSearchQueryByCloudSecuritySolution(cloudSecuritySolution, searchFrom), + }, + { ignore: [404] } + ); - return response.hits.hits.length > 0; + return response.hits?.hits.length > 0; }; const getSearchStartDate = (lastSuccessfulReport: Date): Date => { diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx index a130e08654bcb..c6ec0469168f3 100644 --- a/x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx @@ -72,7 +72,13 @@ export const BasicSetupForm: React.FC = ({ defaultMessage: 'User', })} > - {}} /> + {}} + /> = ({ }) => { return (
    - + {i18n.translate('xpack.serverlessSearch.apiKey.metadataLinkLabel', { defaultMessage: 'Learn how to structure role metadata', })} diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx index a92224b2b45d6..aefc7971d0a4b 100644 --- a/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx @@ -24,7 +24,11 @@ export const SecurityPrivilegesForm: React.FC = ({ }) => { return (
    - + {i18n.translate('xpack.serverlessSearch.apiKey.roleDescriptorsLinkLabel', { defaultMessage: 'Learn how to structure role descriptors', })} diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/api_key_panel.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/api_key_panel.tsx index dd42310a05cd6..eb1f4aba2ec2d 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/api_key_panel.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/api_key_panel.tsx @@ -58,6 +58,7 @@ export const ApiKeyPanel: React.FC = ({ connector }) => { = ({ connecto = ({ connecto = ( - + {i18n.translate('xpack.serverlessSearch.connectors.runWithDockerLink', { defaultMessage: 'Run with Docker', })} @@ -73,6 +79,7 @@ export const ConnectorLinkElasticsearch: React.FC

    - {i18n.translate('xpack.serverlessSearch.connectors.variablesTitle', { - defaultMessage: 'Variables for your ', - })} - elastic/connectors/config.yml + elastic/connectors/config.yml }} + />

    diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_overview.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_overview.tsx index adf6523167739..d141ae51c25ce 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/connector_config/connector_overview.tsx @@ -71,6 +71,7 @@ export const ConnectorOverview: React.FC = ({ connector { name: nameLabel, render: (name: string, connector: Connector) => ( navigateToUrl(generatePath(EDIT_CONNECTOR_PATH, { id: connector.id }))} > {name || connector.id} @@ -235,6 +236,7 @@ export const ConnectorsTable: React.FC = () => {
    setFilter(e.currentTarget.value as Filter)} options={filterOptions} /> @@ -294,6 +296,7 @@ const DeleteConnectorModalAction: React.FC<{ connector: Connector }> = ({ connec )} setModalIsOpen(true)} iconType="trash" diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx index 7e9ebb631fc43..a2e4b96176dc0 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/delete_connector_modal.tsx @@ -97,6 +97,7 @@ export const DeleteConnectorModal: React.FC = ({ )} > setInputConnectorName(e.target.value)} value={inputConnectorName} /> diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx index f979f7dff283d..78d47421420e0 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_connector.tsx @@ -72,7 +72,12 @@ export const EditConnector: React.FC = () => { } actions={ - navigateToUrl(`./`)}> + navigateToUrl(`./`)} + > {i18n.translate('xpack.serverlessSearch.connectors.goBack', { defaultMessage: 'Go back', })} @@ -107,6 +112,7 @@ export const EditConnector: React.FC = () => { id={'connectorMenu'} button={ = ({ connector }) = defaultMessage: 'Description', })} labelAppend={ - setIsEditing(true)}> + setIsEditing(true)} + > {EDIT_LABEL} } > {isEditing ? ( setNewDescription(event.target.value)} value={newDescription || ''} /> @@ -102,6 +107,7 @@ export const EditDescription: React.FC = ({ connector }) = `} > mutate(newDescription)} @@ -119,6 +125,7 @@ export const EditDescription: React.FC = ({ connector }) = `} > { diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx index bba3dbec5376a..e8073796c7c9c 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/edit_name.tsx @@ -80,6 +80,7 @@ export const EditName: React.FC = ({ connector }) => { `} > = ({ connector }) => { defaultMessage: 'Name', })} - setNewName(event.target.value)} value={newName} /> + setNewName(event.target.value)} + value={newName} + /> @@ -108,6 +113,7 @@ export const EditName: React.FC = ({ connector }) => { `} > = ({ connector }) => { `} > { diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx index a997c8086225f..abb0ad64242d7 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors/empty_connectors_prompt.tsx @@ -90,7 +90,10 @@ export const EmptyConnectorsPrompt: React.FC = () => { defaultMessage="Deploy connector code on your own infrastructure by running from {source}, or using {docker}" values={{ source: ( - + {i18n.translate( 'xpack.serverlessSearch.connectorsEmpty.sourceLabel', { defaultMessage: 'source' } @@ -98,7 +101,10 @@ export const EmptyConnectorsPrompt: React.FC = () => { ), docker: ( - + {i18n.translate( 'xpack.serverlessSearch.connectorsEmpty.dockerLabel', { defaultMessage: 'Docker' } @@ -157,7 +163,11 @@ export const EmptyConnectorsPrompt: React.FC = () => {
    - + {i18n.translate('xpack.serverlessSearch.connectorsEmpty.createConnector', { defaultMessage: 'Create connector', })} diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_ingestion.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_ingestion.tsx new file mode 100644 index 0000000000000..ede574abba12b --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_ingestion.tsx @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiFlexGroup, + EuiFlexItem, + EuiTitle, + EuiSpacer, + EuiText, + EuiLink, + EuiIcon, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { GithubLink } from '@kbn/search-api-panels'; + +import React from 'react'; +import { useCreateConnector } from '../hooks/api/use_create_connector'; + +export const ConnectorIngestionPanel: React.FC<{ assetBasePath: string }> = ({ assetBasePath }) => { + const { createConnector } = useCreateConnector(); + return ( + + + +
    + {i18n.translate( + 'xpack.serverlessSearch.ingestData.alternativeOptions.connectorsTitle', + { + defaultMessage: 'Connectors', + } + )} +
    +
    + + +

    + {i18n.translate( + 'xpack.serverlessSearch.ingestData.alternativeOptions.connectorsDescription', + { + defaultMessage: + 'Sync third-party data sources to Elasticsearch, by deploying open code Elastic connectors on your own infrastructure. ', + } + )} +

    +
    +
    + + + createConnector()} + > + {i18n.translate( + 'xpack.serverlessSearch.ingestData.alternativeOptions.setupConnectorLabel', + { + defaultMessage: 'Set up a connector', + } + )} + + + + + + + + + + + + + + {i18n.translate( + 'xpack.serverlessSearch.ingestData.alternativeOptions.connectorDockerLabel', + { + defaultMessage: 'Docker', + } + )} + + + + + + + +
    + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx index ebd7afc288d27..fd774f3dd4911 100644 --- a/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/connectors_overview.tsx @@ -56,7 +56,11 @@ export const ConnectorsOverview = () => {
    - + {i18n.translate('xpack.serverlessSearch.connectorsPythonLink', { defaultMessage: 'elastic/connectors', })} @@ -67,6 +71,7 @@ export const ConnectorsOverview = () => { { defaultMessage="Sync third-party data sources to Elasticsearch, by deploying Elastic connectors on your own infrastructure. {learnMoreLink}" values={{ learnMoreLink: ( - + {LEARN_MORE_LABEL} ), diff --git a/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx b/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx index fc1699beffa8f..9949b40e3c63f 100644 --- a/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/index_mappings_docs_link.tsx @@ -51,7 +51,12 @@ const IndexMappingsDocsLink: FunctionComponent<{ docLinks: CoreStart['docLinks']

    - + `using System; using Elastic.Clients.Elasticsearch.Serverless; -using Elastic.Clients.Elasticsearch.QueryDsl; +using Elastic.Clients.Elasticsearch.Serverless.QueryDsl; var client = new ElasticsearchClient("${cloudId}", new ApiKey("${apiKey}"));`, testConnection: `var info = await client.InfoAsync();`, diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.tsx b/x-pack/plugins/serverless_search/public/application/components/overview.tsx index cb32a66cea20d..6b5c6a1b4b4b1 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/overview.tsx @@ -52,6 +52,7 @@ import { LanguageGrid } from './languages/language_grid'; import './overview.scss'; import { ApiKeyPanel } from './api_key/api_key'; import { ConnectorsCallout } from './connectors_callout'; +import { ConnectorIngestionPanel } from './connectors_ingestion'; export const ElasticsearchOverview = () => { const [selectedLanguage, setSelectedLanguage] = useState(javaDefinition); @@ -302,6 +303,7 @@ export const ElasticsearchOverview = () => { docLinks={docLinks} application={application} sharePlugin={share} + additionalIngestionPanel={} /> { {cloud.usersAndRolesUrl && ( - + {i18n.translate('xpack.serverlessSearch.overview.footer.links.inviteUsers', { defaultMessage: 'Invite more users', })} @@ -452,14 +458,22 @@ const OverviewFooter = () => { )} - + {i18n.translate('xpack.serverlessSearch.overview.footer.links.community', { defaultMessage: 'Join our community', })} - + {i18n.translate('xpack.serverlessSearch.overview.footer.links.feedback', { defaultMessage: 'Give feedback', })} diff --git a/x-pack/plugins/session_view/server/routes/alerts_client_mock.test.ts b/x-pack/plugins/session_view/server/routes/alerts_client_mock.test.ts index 10f1c48977c34..ff76314776025 100644 --- a/x-pack/plugins/session_view/server/routes/alerts_client_mock.test.ts +++ b/x-pack/plugins/session_view/server/routes/alerts_client_mock.test.ts @@ -65,6 +65,7 @@ const alertsClientParams: jest.Mocked = { ruleDataService: ruleDataServiceMock.create(), esClient: esClientMock, getRuleType: jest.fn(), + getRuleList: jest.fn(), getAlertIndicesAlias: getAlertIndicesAliasMock, }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/links_list.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/links_list.test.tsx new file mode 100644 index 0000000000000..10c78d4029d9a --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/links_list.test.tsx @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { screen, render } from '@testing-library/react'; +import { LinksList } from './links_list'; +import userEvent from '@testing-library/user-event'; + +describe('LinksList', () => { + const editAction = jest.fn(); + + const options = { + index: 0, + errors: { + links: [], + }, + editAction, + links: [], + }; + + beforeEach(() => jest.clearAllMocks()); + + it('the list is empty by default', () => { + render(); + + expect(screen.queryByTestId('linksListItemRow')).not.toBeInTheDocument(); + }); + + it('clicking add button calls editAction with correct params', async () => { + render(); + + userEvent.click(await screen.findByTestId('pagerDutyAddLinkButton')); + + expect(editAction).toHaveBeenCalledWith('links', [{ href: '', text: '' }], 0); + }); + + it('clicking remove link button calls editAction with correct params', async () => { + render( + + ); + + expect(await screen.findAllByTestId('linksListItemRow', { exact: false })).toHaveLength(3); + + userEvent.click((await screen.findAllByTestId('pagerDutyRemoveLinkButton'))[1]); + + expect(editAction).toHaveBeenCalledWith( + 'links', + [ + { href: '1', text: 'foobar' }, + { href: '3', text: 'foobar' }, + ], + 0 + ); + }); + + it('editing a link href field calls editAction with correct params', async () => { + render(); + + expect(await screen.findByTestId('linksListItemRow', { exact: false })).toBeInTheDocument(); + + userEvent.paste(await screen.findByTestId('linksHrefInput'), 'newHref'); + + expect(editAction).toHaveBeenCalledWith('links', [{ href: 'newHref', text: 'foobar' }], 0); + }); + + it('editing a link text field calls editAction with correct params', async () => { + render(); + + expect(await screen.findByTestId('linksListItemRow', { exact: false })).toBeInTheDocument(); + + userEvent.paste(await screen.findByTestId('linksTextInput'), 'newText'); + + expect(editAction).toHaveBeenCalledWith('links', [{ href: 'foobar', text: 'newText' }], 0); + }); + + it('correctly displays error messages', async () => { + render(); + + expect(await screen.findByText('FoobarError')); + }); +}); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/links_list.tsx b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/links_list.tsx new file mode 100644 index 0000000000000..70477fc03683a --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/links_list.tsx @@ -0,0 +1,138 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { + EuiButton, + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiSpacer, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { + ActionParamsProps, + TextFieldWithMessageVariables, +} from '@kbn/triggers-actions-ui-plugin/public'; +import { PagerDutyActionParams } from '../types'; + +type LinksListProps = Pick< + ActionParamsProps, + 'index' | 'editAction' | 'errors' | 'messageVariables' +> & + Pick; + +export const LinksList: React.FC = ({ + editAction, + errors, + index, + links, + messageVariables, +}) => { + const areLinksInvalid = Array.isArray(errors.links) && errors.links.length > 0; + + return ( + + + {links && + links.map((link, currentLinkIndex) => ( + + + + + + { + const newLinks = [...links]; + newLinks[currentLinkIndex] = { text: link.text, href: value }; + editAction('links', newLinks, actionIndex); + }} + messageVariables={messageVariables} + paramsProperty={'linksHref'} + inputTargetValue={link.href} + /> + + + + + { + const newLinks = [...links]; + newLinks[currentLinkIndex] = { href: link.href, text: value }; + editAction('links', newLinks, actionIndex); + }} + messageVariables={messageVariables} + paramsProperty={'linksText'} + inputTargetValue={link.text} + /> + + + + { + links.splice(currentLinkIndex, 1); + editAction('links', links, index); + }} + iconType="minusInCircle" + css={{ marginTop: 28 }} + data-test-subj="pagerDutyRemoveLinkButton" + /> + + + + ))} + +
    + + editAction( + 'links', + links ? [...links, { href: '', text: '' }] : [{ href: '', text: '' }], + index + ) + } + data-test-subj="pagerDutyAddLinkButton" + > + {i18n.translate('xpack.stackConnectors.components.pagerDuty.addLinkButtonLabel', { + defaultMessage: 'Add Link', + })} + +
    +
    +
    +
    + ); +}; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.test.tsx index 311d4bfac8679..4df68dee15880 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.test.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.test.tsx @@ -43,6 +43,8 @@ describe('pagerduty action params validation', () => { component: 'test', group: 'group', class: 'test class', + customDetails: '{}', + links: [], }; expect(await connectorTypeModel.validateParams(actionParams)).toEqual({ @@ -50,6 +52,8 @@ describe('pagerduty action params validation', () => { dedupKey: [], summary: [], timestamp: [], + links: [], + customDetails: [], }, }); }); @@ -74,6 +78,142 @@ describe('pagerduty action params validation', () => { dedupKey: [], summary: [], timestamp: expect.arrayContaining(expected), + links: [], + customDetails: [], + }, + }); + }); + + test('action params validation fails when customDetails are not valid JSON', async () => { + const actionParams = { + eventAction: 'trigger', + dedupKey: 'test', + summary: '2323', + source: 'source', + severity: 'critical', + timestamp: new Date().toISOString(), + component: 'test', + group: 'group', + class: 'test class', + customDetails: '{foo:bar}', + links: [], + }; + + expect(await connectorTypeModel.validateParams(actionParams)).toEqual({ + errors: { + dedupKey: [], + summary: [], + timestamp: [], + links: [], + customDetails: ['Custom details must be a valid JSON.'], + }, + }); + }); + + test('action params validation does not fail when customDetails are not JSON but have mustache templates inside', async () => { + const actionParams = { + eventAction: 'trigger', + dedupKey: 'test', + summary: '2323', + source: 'source', + severity: 'critical', + timestamp: new Date().toISOString(), + component: 'test', + group: 'group', + class: 'test class', + customDetails: '{"details": {{alert.flapping}}}', + links: [], + }; + + expect(await connectorTypeModel.validateParams(actionParams)).toEqual({ + errors: { + dedupKey: [], + summary: [], + timestamp: [], + links: [], + customDetails: [], + }, + }); + }); + + test('action params validation fails when a link is missing the href field', async () => { + const actionParams = { + eventAction: 'trigger', + dedupKey: 'test', + summary: '2323', + source: 'source', + severity: 'critical', + timestamp: new Date().toISOString(), + component: 'test', + group: 'group', + class: 'test class', + customDetails: '{}', + links: [{ href: '', text: 'foobar' }], + }; + + expect(await connectorTypeModel.validateParams(actionParams)).toEqual({ + errors: { + dedupKey: [], + summary: [], + timestamp: [], + links: ['Link properties cannot be empty.'], + customDetails: [], + }, + }); + }); + + test('action params validation fails when a link is missing the text field', async () => { + const actionParams = { + eventAction: 'trigger', + dedupKey: 'test', + summary: '2323', + source: 'source', + severity: 'critical', + timestamp: new Date().toISOString(), + component: 'test', + group: 'group', + class: 'test class', + customDetails: '{}', + links: [{ href: 'foobar', text: '' }], + }; + + expect(await connectorTypeModel.validateParams(actionParams)).toEqual({ + errors: { + dedupKey: [], + summary: [], + timestamp: [], + links: ['Link properties cannot be empty.'], + customDetails: [], + }, + }); + }); + + test('action params validation does not throw the same error multiple times for links', async () => { + const actionParams = { + eventAction: 'trigger', + dedupKey: 'test', + summary: '2323', + source: 'source', + severity: 'critical', + timestamp: new Date().toISOString(), + component: 'test', + group: 'group', + class: 'test class', + customDetails: '{}', + links: [ + { href: 'foobar', text: '' }, + { href: '', text: 'foobar' }, + { href: '', text: '' }, + ], + }; + + expect(await connectorTypeModel.validateParams(actionParams)).toEqual({ + errors: { + dedupKey: [], + summary: [], + timestamp: [], + links: ['Link properties cannot be empty.'], + customDetails: [], }, }); }); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.tsx b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.tsx index 0dd1513ac55ac..b02665eec66be 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty.tsx @@ -50,6 +50,8 @@ export function getConnectorType(): ConnectorTypeModel< summary: new Array(), timestamp: new Array(), dedupKey: new Array(), + links: new Array(), + customDetails: new Array(), }; const validationResult = { errors }; if ( @@ -79,6 +81,31 @@ export function getConnectorType(): ConnectorTypeModel< ); } } + if (Array.isArray(actionParams.links)) { + actionParams.links.forEach(({ href, text }) => { + if ((!href || !text) && errors.links.length === 0) { + errors.links.push( + i18n.translate('xpack.stackConnectors.components.pagerDuty.error.invalidLink', { + defaultMessage: 'Link properties cannot be empty.', + }) + ); + } + }); + } + if (actionParams.customDetails?.length && !hasMustacheTokens(actionParams.customDetails)) { + try { + JSON.parse(actionParams.customDetails); + } catch { + errors.customDetails.push( + i18n.translate( + 'xpack.stackConnectors.components.pagerDuty.error.invalidCustomDetails', + { + defaultMessage: 'Custom details must be a valid JSON.', + } + ) + ); + } + } return validationResult; }, actionConnectorFields: lazy(() => import('./pagerduty_connectors')), diff --git a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.test.tsx index 19f47166b2726..aa1e6be9bebe0 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.test.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.test.tsx @@ -11,7 +11,7 @@ import { EventActionOptions, SeverityActionOptions } from '../types'; import PagerDutyParamsFields from './pagerduty_params'; describe('PagerDutyParamsFields renders', () => { - test('all params fields is rendered', () => { + test('all params fields are rendered', () => { const actionParams = { eventAction: EventActionOptions.TRIGGER, dedupKey: 'test', @@ -22,6 +22,11 @@ describe('PagerDutyParamsFields renders', () => { component: 'test', group: 'group', class: 'test class', + customDetails: '{"foo":"bar"}', + links: [ + { href: 'foo', text: 'bar' }, + { href: 'foo', text: 'bar' }, + ], }; const wrapper = mountWithIntl( @@ -55,6 +60,9 @@ describe('PagerDutyParamsFields renders', () => { expect(wrapper.find('[data-test-subj="sourceInput"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="summaryInput"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="dedupKeyAddVariableButton"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="customDetailsJsonEditor"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="linksList"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="pagerDutyAddLinkButton"]').length > 0).toBeTruthy(); }); test('params select fields do not auto set values eventActionSelect', () => { diff --git a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx index 970ef6ae1ecbf..8505adfee17f8 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/pagerduty/pagerduty_params.tsx @@ -6,12 +6,23 @@ */ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiSelect, EuiSpacer } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiSelect, + EuiSpacer, + useEuiTheme, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { isUndefined } from 'lodash'; -import type { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public'; +import { + ActionParamsProps, + JsonEditorWithMessageVariables, +} from '@kbn/triggers-actions-ui-plugin/public'; import { TextFieldWithMessageVariables } from '@kbn/triggers-actions-ui-plugin/public'; import { PagerDutyActionParams } from '../types'; +import { LinksList } from './links_list'; const PagerDutyParamsFields: React.FunctionComponent> = ({ actionParams, @@ -20,8 +31,20 @@ const PagerDutyParamsFields: React.FunctionComponent { - const { eventAction, dedupKey, summary, source, severity, timestamp, component, group } = - actionParams; + const { euiTheme } = useEuiTheme(); + + const { + eventAction, + dedupKey, + summary, + source, + severity, + timestamp, + component, + group, + customDetails, + links, + } = actionParams; const severityOptions = [ { value: 'critical', @@ -125,7 +148,7 @@ const PagerDutyParamsFields: React.FunctionComponent
    - + - {isTriggerPagerDutyEvent ? ( + {isTriggerPagerDutyEvent && ( <> + + { + editAction('customDetails', json, index); + }} + onBlur={() => { + if (!customDetails) { + editAction('customDetails', '', index); + } + }} + data-test-subj="customDetailsJsonEditor" + /> + + - ) : null} + )} ); }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/types.ts b/x-pack/plugins/stack_connectors/public/connector_types/types.ts index 72319df375e1f..eb0cb9927dce1 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/types.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/types.ts @@ -39,6 +39,8 @@ export interface PagerDutyActionParams { component?: string; group?: string; class?: string; + customDetails?: string; + links?: Array<{ href: string; text: string }>; } export interface IndexActionParams { diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts index 708e8cd4e0364..0eeb309dd2257 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.test.ts @@ -5,13 +5,10 @@ * 2.0. */ import aws from 'aws4'; -import { Transform } from 'stream'; +import { PassThrough, Transform } from 'stream'; import { BedrockConnector } from './bedrock'; -import { waitFor } from '@testing-library/react'; import { actionsConfigMock } from '@kbn/actions-plugin/server/actions_config.mock'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; -import { EventStreamCodec } from '@smithy/eventstream-codec'; -import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; import { actionsMock } from '@kbn/actions-plugin/server/mocks'; import { RunActionResponseSchema, StreamingResponseSchema } from '../../../common/bedrock/schema'; import { @@ -105,7 +102,7 @@ describe('BedrockConnector', () => { let stream; beforeEach(() => { stream = createStreamMock(); - stream.write(encodeBedrockResponse(mockResponseString)); + stream.write(new Uint8Array([1, 2, 3])); mockRequest = jest.fn().mockResolvedValue({ ...mockResponse, data: stream.transform }); // @ts-ignore connector.request = mockRequest; @@ -199,16 +196,9 @@ describe('BedrockConnector', () => { }); }); - it('transforms the response into a string', async () => { + it('responds with a readable stream', async () => { const response = await connector.invokeStream(aiAssistantBody); - - let responseBody: string = ''; - response.on('data', (data: string) => { - responseBody += data.toString(); - }); - await waitFor(() => { - expect(responseBody).toEqual(mockResponseString); - }); + expect(response instanceof PassThrough).toEqual(true); }); it('errors during API calls are properly handled', async () => { @@ -364,16 +354,3 @@ function createStreamMock() { }, }; } - -function encodeBedrockResponse(completion: string) { - return new EventStreamCodec(toUtf8, fromUtf8).encode({ - headers: {}, - body: Uint8Array.from( - Buffer.from( - JSON.stringify({ - bytes: Buffer.from(JSON.stringify({ completion })).toString('base64'), - }) - ) - ), - }); -} diff --git a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts index 70f8e121e1519..ade589e54dc14 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/bedrock/bedrock.ts @@ -9,9 +9,7 @@ import { ServiceParams, SubActionConnector } from '@kbn/actions-plugin/server'; import aws from 'aws4'; import type { AxiosError } from 'axios'; import { IncomingMessage } from 'http'; -import { PassThrough, Transform } from 'stream'; -import { EventStreamCodec } from '@smithy/eventstream-codec'; -import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; +import { PassThrough } from 'stream'; import { RunActionParamsSchema, RunActionResponseSchema, @@ -178,12 +176,12 @@ export class BedrockConnector extends SubActionConnector { * @param messages An array of messages to be sent to the API * @param model Optional model to be used for the API request. If not provided, the default model from the connector will be used. */ - public async invokeStream({ messages, model }: InvokeAIActionParams): Promise { + public async invokeStream({ messages, model }: InvokeAIActionParams): Promise { const res = (await this.streamApi({ body: JSON.stringify(formatBedrockBody({ messages })), model, })) as unknown as IncomingMessage; - return res.pipe(transformToString()); + return res; } /** @@ -222,25 +220,3 @@ const formatBedrockBody = ({ stop_sequences: ['\n\nHuman:'], }; }; - -/** - * Takes in a readable stream of data and returns a Transform stream that - * uses the AWS proprietary codec to parse the proprietary bedrock response into - * a string of the response text alone, returning the response string to the stream - */ -const transformToString = () => - new Transform({ - transform(chunk, encoding, callback) { - const encoder = new TextEncoder(); - const decoder = new EventStreamCodec(toUtf8, fromUtf8); - const event = decoder.decode(chunk); - const body = JSON.parse( - Buffer.from( - JSON.parse(new TextDecoder('utf-8').decode(event.body)).bytes, - 'base64' - ).toString() - ); - const newChunk = encoder.encode(body.completion); - callback(null, newChunk); - }, - }); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts index 7769dd8592faf..c7d6feb6887ad 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts @@ -17,8 +17,7 @@ import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { actionsMock } from '@kbn/actions-plugin/server/mocks'; import { RunActionResponseSchema, StreamingResponseSchema } from '../../../common/openai/schema'; import { initDashboard } from './create_dashboard'; -import { Transform } from 'stream'; -import { waitFor } from '@testing-library/react'; +import { PassThrough, Transform } from 'stream'; jest.mock('./create_dashboard'); describe('OpenAIConnector', () => { @@ -315,53 +314,11 @@ describe('OpenAIConnector', () => { await expect(connector.invokeStream(sampleOpenAiBody)).rejects.toThrow('API Error'); }); - it('transforms the response into a string', async () => { + it('responds with a readable stream', async () => { // @ts-ignore connector.request = mockStream(); const response = await connector.invokeStream(sampleOpenAiBody); - - let responseBody: string = ''; - response.on('data', (data: string) => { - responseBody += data.toString(); - }); - await waitFor(() => { - expect(responseBody).toEqual('My new'); - }); - }); - it('correctly buffers stream of json lines', async () => { - const chunk1 = `data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"My"}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" new"}}]}`; - const chunk2 = `\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" message"}}]}\ndata: [DONE]`; - - // @ts-ignore - connector.request = mockStream([chunk1, chunk2]); - - const response = await connector.invokeStream(sampleOpenAiBody); - - let responseBody: string = ''; - response.on('data', (data: string) => { - responseBody += data.toString(); - }); - await waitFor(() => { - expect(responseBody).toEqual('My new message'); - }); - }); - it('correctly buffers partial lines', async () => { - const chunk1 = `data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"My"}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" new"`; - - const chunk2 = `}}]}\ndata: {"object":"chat.completion.chunk","choices":[{"delta":{"content":" message"}}]}\ndata: [DONE]`; - - // @ts-ignore - connector.request = mockStream([chunk1, chunk2]); - - const response = await connector.invokeStream(sampleOpenAiBody); - - let responseBody: string = ''; - response.on('data', (data: string) => { - responseBody += data.toString(); - }); - await waitFor(() => { - expect(responseBody).toEqual('My new message'); - }); + expect(response instanceof PassThrough).toEqual(true); }); }); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts index 78fca4bd84198..8dfeac0be8502 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts @@ -7,8 +7,8 @@ import { ServiceParams, SubActionConnector } from '@kbn/actions-plugin/server'; import type { AxiosError } from 'axios'; -import { PassThrough, Transform } from 'stream'; import { IncomingMessage } from 'http'; +import { PassThrough } from 'stream'; import { RunActionParamsSchema, RunActionResponseSchema, @@ -198,13 +198,13 @@ export class OpenAIConnector extends SubActionConnector { * the response from the streamApi method and returns the response string alone. * @param body - the OpenAI Invoke request body */ - public async invokeStream(body: InvokeAIActionParams): Promise { + public async invokeStream(body: InvokeAIActionParams): Promise { const res = (await this.streamApi({ body: JSON.stringify(body), stream: true, })) as unknown as IncomingMessage; - return res.pipe(new PassThrough()).pipe(transformToString()); + return res.pipe(new PassThrough()); } /** @@ -229,44 +229,3 @@ export class OpenAIConnector extends SubActionConnector { }; } } - -/** - * Takes in a readable stream of data and returns a Transform stream that - * parses the proprietary OpenAI response into a string of the response text alone, - * returning the response string to the stream - */ -const transformToString = () => { - let lineBuffer: string = ''; - const decoder = new TextDecoder(); - - return new Transform({ - transform(chunk, encoding, callback) { - const chunks = decoder.decode(chunk); - const lines = chunks.split('\n'); - lines[0] = lineBuffer + lines[0]; - lineBuffer = lines.pop() || ''; - callback(null, getNextChunk(lines)); - }, - flush(callback) { - // Emit an additional chunk with the content of lineBuffer if it has length - if (lineBuffer.length > 0) { - callback(null, getNextChunk([lineBuffer])); - } else { - callback(); - } - }, - }); -}; - -const getNextChunk = (lines: string[]) => { - const encoder = new TextEncoder(); - const nextChunk = lines - .map((str) => str.substring(6)) - .filter((str) => !!str && str !== '[DONE]') - .map((line) => { - const openaiResponse = JSON.parse(line); - return openaiResponse.choices[0]?.delta.content ?? ''; - }) - .join(''); - return encoder.encode(nextChunk); -}; diff --git a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts index 1602a7d29f12f..fd37aa678ce63 100644 --- a/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts +++ b/x-pack/plugins/synthetics/server/synthetics_service/synthetics_service.ts @@ -423,49 +423,48 @@ export class SyntheticsService { }; for await (const result of finder.find()) { - if (result.saved_objects.length === 0) { - return; - } - try { - if (!output) { - output = await this.getOutput(); + if (result.saved_objects.length > 0) { + try { if (!output) { - sendErrorTelemetryEvents(service.logger, service.server.telemetry, { - reason: 'API key is not valid.', - message: 'Failed to push configs. API key is not valid.', - type: 'invalidApiKey', - stackVersion: service.server.stackVersion, - }); - return; + output = await this.getOutput(); + if (!output) { + sendErrorTelemetryEvents(service.logger, service.server.telemetry, { + reason: 'API key is not valid.', + message: 'Failed to push configs. API key is not valid.', + type: 'invalidApiKey', + stackVersion: service.server.stackVersion, + }); + return; + } } - } - const monitors = result.saved_objects.filter(({ error }) => !error); - const formattedConfigs = this.normalizeConfigs(monitors, paramsBySpace); + const monitors = result.saved_objects.filter(({ error }) => !error); + const formattedConfigs = this.normalizeConfigs(monitors, paramsBySpace); - this.logger.debug( - `${formattedConfigs.length} monitors will be pushed to synthetics service.` - ); + this.logger.debug( + `${formattedConfigs.length} monitors will be pushed to synthetics service.` + ); - formattedConfigs.forEach((monitor) => { - monitor.locations.forEach((location) => { - if (location.isServiceManaged) { - bucketsByLocation[location.id]?.push(monitor); - } + formattedConfigs.forEach((monitor) => { + monitor.locations.forEach((location) => { + if (location.isServiceManaged) { + bucketsByLocation[location.id]?.push(monitor); + } + }); }); - }); - await syncAllLocations(PER_PAGE); - } catch (e) { - sendErrorTelemetryEvents(service.logger, service.server.telemetry, { - reason: 'Failed to push configs to service', - message: e?.message, - type: 'pushConfigsError', - code: e?.code, - status: e.status, - stackVersion: service.server.stackVersion, - }); - this.logger.error(e); + await syncAllLocations(PER_PAGE); + } catch (e) { + sendErrorTelemetryEvents(service.logger, service.server.telemetry, { + reason: 'Failed to push configs to service', + message: e?.message, + type: 'pushConfigsError', + code: e?.code, + status: e.status, + stackVersion: service.server.stackVersion, + }); + this.logger.error(e); + } } } diff --git a/x-pack/plugins/threat_intelligence/cypress/e2e/block_list.cy.ts b/x-pack/plugins/threat_intelligence/cypress/e2e/block_list.cy.ts index 63f58acf99484..a6ce796d4f3f1 100644 --- a/x-pack/plugins/threat_intelligence/cypress/e2e/block_list.cy.ts +++ b/x-pack/plugins/threat_intelligence/cypress/e2e/block_list.cy.ts @@ -35,7 +35,8 @@ const FIRST_BLOCK_LIST_NEW_DESCRIPTION = 'the first description'; const SECOND_BLOCK_LIST_NEW_NAME = 'second blocklist entry'; const SECOND_BLOCK_LIST_NEW_DESCRIPTION = 'the second description'; -describe('Block list with invalid indicators', { tags: '@ess' }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/171783 +describe.skip('Block list with invalid indicators', { tags: '@ess' }, () => { beforeEach(() => { esArchiverLoad('threat_intelligence/invalid_indicators_data'); login(); diff --git a/x-pack/plugins/threat_intelligence/cypress/e2e/indicators.cy.ts b/x-pack/plugins/threat_intelligence/cypress/e2e/indicators.cy.ts index cbb95e9a610f1..6ad05c0472577 100644 --- a/x-pack/plugins/threat_intelligence/cypress/e2e/indicators.cy.ts +++ b/x-pack/plugins/threat_intelligence/cypress/e2e/indicators.cy.ts @@ -56,7 +56,11 @@ const THREAT_INTELLIGENCE = '/app/security/threat_intelligence/indicators'; const URL_WITH_CONTRADICTORY_FILTERS = '/app/security/threat_intelligence/indicators?indicators=(filterQuery:(language:kuery,query:%27%27),filters:!((%27$state%27:(store:appState),meta:(alias:!n,disabled:!f,index:%27%27,key:threat.indicator.type,negate:!f,params:(query:file),type:phrase),query:(match_phrase:(threat.indicator.type:file))),(%27$state%27:(store:appState),meta:(alias:!n,disabled:!f,index:%27%27,key:threat.indicator.type,negate:!f,params:(query:url),type:phrase),query:(match_phrase:(threat.indicator.type:url)))),timeRange:(from:now/d,to:now/d))'; -describe('Invalid Indicators', { tags: '@ess' }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/171779 +// FLAKY: https://github.com/elastic/kibana/issues/171778 +// FLAKY: https://github.com/elastic/kibana/issues/171785 +// FLAKY: https://github.com/elastic/kibana/issues/171786 +describe.skip('Invalid Indicators', { tags: '@ess' }, () => { describe('verify the grid loads even with missing fields', () => { beforeEach(() => { esArchiverLoad('threat_intelligence/invalid_indicators_data'); @@ -132,7 +136,9 @@ describe('Invalid Indicators', { tags: '@ess' }, () => { }); }); -describe('Indicators', () => { +// FLAKY: https://github.com/elastic/kibana/issues/171781 +// FLAKY: https://github.com/elastic/kibana/issues/171780 +describe.skip('Indicators', () => { before(() => { esArchiverLoad('threat_intelligence/indicators_data'); }); diff --git a/x-pack/plugins/threat_intelligence/public/components/paywall.tsx b/x-pack/plugins/threat_intelligence/public/components/paywall.tsx index a01ca32a06946..8a010550e8a6b 100644 --- a/x-pack/plugins/threat_intelligence/public/components/paywall.tsx +++ b/x-pack/plugins/threat_intelligence/public/components/paywall.tsx @@ -6,17 +6,21 @@ */ import React, { VFC } from 'react'; -import { EuiButton, EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; +import { + EuiButton, + EuiButtonEmpty, + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, +} from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { SubscriptionButtonEmpty } from '@kbn/subscription-tracking'; -import type { SubscriptionContextData } from '@kbn/subscription-tracking'; - -const subscriptionContext: SubscriptionContextData = { - feature: 'threat-intelligence', - source: 'security__threat-intelligence', -}; +import { useKibana } from '../hooks/use_kibana'; export const Paywall: VFC = () => { + const { + services: { application }, + } = useKibana(); return ( } @@ -52,12 +56,18 @@ export const Paywall: VFC = () => {
    - + + application.navigateToApp('management', { + path: 'stack/license_management/home', + }) + } + > - +
    diff --git a/x-pack/plugins/threat_intelligence/public/mocks/story_providers.tsx b/x-pack/plugins/threat_intelligence/public/mocks/story_providers.tsx index d13c3f561e748..249a9d05afbc9 100644 --- a/x-pack/plugins/threat_intelligence/public/mocks/story_providers.tsx +++ b/x-pack/plugins/threat_intelligence/public/mocks/story_providers.tsx @@ -12,7 +12,6 @@ import { CoreStart, IUiSettingsClient } from '@kbn/core/public'; import { TimelinesUIStart } from '@kbn/timelines-plugin/public'; import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; -import { MockSubscriptionTrackingProvider } from '@kbn/subscription-tracking/mocks'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import type { SettingsStart } from '@kbn/core-ui-settings-browser'; import { mockIndicatorsFiltersContext } from './mock_indicators_filters_context'; @@ -108,9 +107,7 @@ export const StoryProvidersComponent: VFC = ({ - - {children} - + {children} diff --git a/x-pack/plugins/threat_intelligence/public/mocks/test_providers.tsx b/x-pack/plugins/threat_intelligence/public/mocks/test_providers.tsx index 12c42052ee26f..37360284b6aa7 100644 --- a/x-pack/plugins/threat_intelligence/public/mocks/test_providers.tsx +++ b/x-pack/plugins/threat_intelligence/public/mocks/test_providers.tsx @@ -17,7 +17,6 @@ import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks import { createTGridMocks } from '@kbn/timelines-plugin/public/mock'; import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; -import { MockSubscriptionTrackingProvider } from '@kbn/subscription-tracking/mocks'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { MemoryRouter } from 'react-router-dom'; import { casesPluginMock } from '@kbn/cases-plugin/public/mocks'; @@ -142,13 +141,11 @@ export const TestProvidersComponent: FC = ({ children }) => ( - - - - {children} - - - + + + {children} + + diff --git a/x-pack/plugins/threat_intelligence/public/plugin.tsx b/x-pack/plugins/threat_intelligence/public/plugin.tsx index e30e9f92c0a5b..49f6b3b7724bf 100755 --- a/x-pack/plugins/threat_intelligence/public/plugin.tsx +++ b/x-pack/plugins/threat_intelligence/public/plugin.tsx @@ -11,7 +11,6 @@ import { Provider as ReduxStoreProvider } from 'react-redux'; import React, { Suspense } from 'react'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import { ExternalReferenceAttachmentType } from '@kbn/cases-plugin/public/client/attachment_framework/types'; -import { SubscriptionTrackingProvider } from '@kbn/subscription-tracking'; import { generateAttachmentType } from './modules/cases/utils/attachments'; import { KibanaContextProvider } from './hooks/use_kibana'; import { @@ -44,16 +43,11 @@ export const createApp = - - - }> - - - - + + }> + + + diff --git a/x-pack/plugins/threat_intelligence/tsconfig.json b/x-pack/plugins/threat_intelligence/tsconfig.json index 661186c943b54..2e390483ab22c 100644 --- a/x-pack/plugins/threat_intelligence/tsconfig.json +++ b/x-pack/plugins/threat_intelligence/tsconfig.json @@ -32,8 +32,7 @@ "@kbn/utility-types", "@kbn/ui-theme", "@kbn/securitysolution-io-ts-list-types", - "@kbn/core-ui-settings-browser", - "@kbn/subscription-tracking" + "@kbn/core-ui-settings-browser" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/transform/public/app/hooks/use_index_data.ts b/x-pack/plugins/transform/public/app/hooks/use_index_data.ts index 471146f583dc8..61403df035090 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_index_data.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_index_data.ts @@ -17,7 +17,7 @@ import { getFieldType, getDataGridSchemaFromKibanaFieldType, getDataGridSchemaFromESFieldType, - getFieldsFromKibanaIndexPattern, + getFieldsFromKibanaDataView, showDataGridColumnChartErrorMessageToast, useDataGrid, useRenderCellValue, @@ -140,7 +140,7 @@ export const useIndexData = ( allPopulatedFields = [...new Set(docs.map(Object.keys).flat(1))]; } - const allDataViewFields = getFieldsFromKibanaIndexPattern(dataView); + const allDataViewFields = getFieldsFromKibanaDataView(dataView); return allPopulatedFields.filter((d) => allDataViewFields.includes(d)).sort(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [dataViewFieldsData, populatedFields]); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c656e54ee8f5f..09f56544d2aa3 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -5308,7 +5308,6 @@ "savedSearch.kibana_context.savedSearchId.help": "Spécifier l'ID de recherche enregistrée à utiliser pour les requêtes et les filtres", "savedSearch.kibana_context.timeRange.help": "Spécifier le filtre de plage temporelle Kibana", "searchApiPanels.welcomeBanner.header.greeting.customTitle": "Bonjour {name} !", - "searchApiPanels.welcomeBanner.ingestData.clientDocLink": "Référence d’API {languageName}", "searchApiPanels.welcomeBanner.installClient.clientDocLink": "Documentation du client {languageName}", "searchApiPanels.welcomeBanner.selectClient.description": "Elastic construit et assure la maintenance des clients dans plusieurs langues populaires et notre communauté a contribué à beaucoup d'autres. Sélectionnez votre client linguistique favori or explorez la {console} pour commencer.", "searchApiPanels.welcomeBanner.codeBox.copyButtonLabel": "Copier", @@ -5316,22 +5315,7 @@ "searchApiPanels.welcomeBanner.header.description": "Configurez votre client de langage de programmation, ingérez des données, et vous serez prêt à commencer vos recherches en quelques minutes.", "searchApiPanels.welcomeBanner.header.greeting.defaultTitle": "Bonjour !", "searchApiPanels.welcomeBanner.header.title": "Lancez-vous avec Elasticsearch", - "searchApiPanels.welcomeBanner.ingestData.beatsDescription": "Des agents légers conçus pour le transfert de données pour Elasticsearch. Utilisez Beats pour envoyer des données opérationnelles depuis vos serveurs.", - "searchApiPanels.welcomeBanner.ingestData.beatsLink": "Beats", - "searchApiPanels.welcomeBanner.ingestData.beatsTitle": "Beats", - "searchApiPanels.welcomeBanner.ingestData.connectorsDescription": "Des intégrations spécialisées pour synchroniser des données de sources tierces avec Elasticsearch. Utilisez des connecteurs Elastic pour synchroniser du contenu d’une plage de bases de données et de stockage d’objets.", - "searchApiPanels.welcomeBanner.ingestData.connectorsPythonLink": "connecteurs-python", - "searchApiPanels.welcomeBanner.ingestData.connectorsTitle": "Client de connecteur", "searchApiPanels.welcomeBanner.ingestData.description": "Ajoutez des données à votre flux de données ou à votre index pour les rendre interrogeables. Choisissez une méthode d’ingestion qui correspond à votre application et à votre workflow.", - "searchApiPanels.welcomeBanner.ingestData.ingestApiDescription": "La façon la plus flexible d’indexer des données, ce qui vous donne un contrôle total sur vos options de personnalisation et d’optimisation.", - "searchApiPanels.welcomeBanner.ingestData.ingestApiLabel": "Ingérer via une API", - "searchApiPanels.welcomeBanner.ingestData.ingestIntegrationDescription": "Des outils d’ingestion spécialisés optimisés pour transformer des données et les transférer à Elasticsearch.", - "searchApiPanels.welcomeBanner.ingestData.ingestIntegrationLabel": "Ingérer via l’intégration", - "searchApiPanels.welcomeBanner.ingestData.ingestLegendLabel": "Sélectionner une méthode d'ingestion", - "searchApiPanels.welcomeBanner.ingestData.integrationsLink": "À propos des intégrations", - "searchApiPanels.welcomeBanner.ingestData.logstashDescription": "Ajoutez des données à votre flux de données ou à votre index pour les rendre interrogeables. Choisissez une méthode d’ingestion qui correspond à votre application et à votre workflow.", - "searchApiPanels.welcomeBanner.ingestData.logstashLink": "Logstash", - "searchApiPanels.welcomeBanner.ingestData.logstashTitle": "Logstash", "searchApiPanels.welcomeBanner.ingestData.title": "Ingérer des données", "searchApiPanels.welcomeBanner.installClient.description": "Elastic construit et assure la maintenance des clients dans plusieurs langues populaires et notre communauté a contribué à beaucoup d'autres. Installez votre client de langage favori pour commencer.", "searchApiPanels.welcomeBanner.installClient.title": "Installer un client", @@ -8684,7 +8668,6 @@ "xpack.apm.dashboard.addDashboard.useContextFilterLabel.tooltip": "L'activation de cette option applique des filtres au tableau de bord en fonction du service et de l'environnement choisis.", "xpack.apm.data_view.creation_failed": "Une erreur s'est produite lors de la création de la vue de données", "xpack.apm.dataView.alreadyExistsInActiveSpace": "La vue de données existe déjà dans l'espace actif", - "xpack.apm.dataView.alreadyExistsInAnotherSpace": "La vue de données existe déjà dans un autre espace mais elle n'est pas disponible dans cet espace", "xpack.apm.dataView.autoCreateDisabled": "La création automatique des vues de données a été désactivée via l'option de configuration \"autoCreateApmDataView\"", "xpack.apm.dataView.noApmData": "Aucune donnée APM", "xpack.apm.dependecyOperationDetailView.header.backLinkLabel": "Toutes les opérations", @@ -17101,7 +17084,6 @@ "xpack.fleet.agentActivityFlyout.inProgressTitle": "En cours", "xpack.fleet.agentActivityFlyout.noActivityDescription": "Le fil d'activités s'affichera ici au fur et à mesure que les agents seront réaffectés, mis à niveau ou désenregistrés.", "xpack.fleet.agentActivityFlyout.noActivityText": "Aucune activité à afficher", - "xpack.fleet.agentActivityFlyout.reviewErrorLogs": "Vérifier les logs d'erreur", "xpack.fleet.agentActivityFlyout.scheduledDescription": "Planifié pour ", "xpack.fleet.agentActivityFlyout.title": "Activité des agents", "xpack.fleet.agentActivityFlyout.todayTitle": "Aujourd'hui", @@ -17910,7 +17892,6 @@ "xpack.fleet.initializationErrorMessageTitle": "Initialisation de Fleet impossible", "xpack.fleet.integrations.customInputsLink": "entrées personnalisées", "xpack.fleet.integrations.discussForumLink": "forum", - "xpack.fleet.integrations.endpointsButton": "Points de terminaison", "xpack.fleet.integrations.installPackage.uploadedTooltip": "Cette intégration a été installée par le biais d'un chargement et ne peut pas être réinstallée automatiquement. Veuillez la charger à nouveau pour la réinstaller.", "xpack.fleet.integrations.integrationSaved": "Paramètres de l'intégration enregistrés", "xpack.fleet.integrations.integrationSavedError": "Erreur lors de l’enregistrement des paramètres de l'intégration", @@ -18639,9 +18620,7 @@ "xpack.grokDebugger.unknownErrorTitle": "Un problème est survenu", "xpack.idxMgmt.badgeAriaLabel": "{label}. Sélectionnez pour filtrer selon cet élément.", "xpack.idxMgmt.clearCacheIndicesAction.indexCacheClearedMessage": "Le cache de l'index {indexNames} a été effacé.", - "xpack.idxMgmt.clearCacheIndicesAction.successMessage": "Le cache a bien été effacé : [{indexNames}]", "xpack.idxMgmt.closeIndicesAction.indexClosedMessage": "L'index {indexNames} a été fermé.", - "xpack.idxMgmt.closeIndicesAction.successfullyClosedIndicesMessage": "Fermeture réussie : [{indexNames}]", "xpack.idxMgmt.componentTemplateDetails.summaryTab.notInUseDescription": "{createLink} un modèle d'index ou {editLink}-en un existant.", "xpack.idxMgmt.componentTemplateForm.stepLogistics.metaDescription": "Informations arbitraires sur le modèle stockées dans l'état du cluster. {learnMoreLink}", "xpack.idxMgmt.componentTemplateForm.stepLogistics.metaHelpText": "Utiliser le format JSON : {code}", @@ -18660,7 +18639,6 @@ "xpack.idxMgmt.deleteDataStreamsConfirmationModal.multipleErrorsNotificationMessageText": "Erreur lors de la suppression de {count} flux de données", "xpack.idxMgmt.deleteDataStreamsConfirmationModal.successDeleteMultipleNotificationMessageText": "{numSuccesses, plural, one {# flux de données} many {# flux de données} other {# flux de données}} supprimé", "xpack.idxMgmt.deleteIndicesAction.indexDeletedMessage": "L'index {indexNames} a été supprimé.", - "xpack.idxMgmt.deleteIndicesAction.successfullyDeletedIndicesMessage": "Suppression réussie : [{indexNames}]", "xpack.idxMgmt.deleteTemplatesModal.confirmButtonLabel": "Supprimer {numTemplatesToDelete, plural, one {modèle} many {modèles} other {modèles}}", "xpack.idxMgmt.deleteTemplatesModal.deleteDescription": "Vous êtes sur le point de supprimer {numTemplatesToDelete, plural, one {ce modèle} many {ces modèles} other {ces modèles}} :", "xpack.idxMgmt.deleteTemplatesModal.modalTitleText": "Supprimer {numTemplatesToDelete, plural, one {modèle} many {# modèles} other {# modèles}}", @@ -18678,9 +18656,7 @@ "xpack.idxMgmt.enrichPolicyCreate.configurationStep.queryHelpText": "Valeur par défaut : requête {code}.", "xpack.idxMgmt.enrichPolicyCreate.configurationStep.rangeTypePopOver": "{type} correspond à un nombre, une date ou une plage d'adresses IP.", "xpack.idxMgmt.flushIndicesAction.indexFlushedMessage": "L'index {indexNames} a été vidé.", - "xpack.idxMgmt.flushIndicesAction.successfullyFlushedIndicesMessage": "Vidage effectué avec succès : [{indexNames}]", "xpack.idxMgmt.forceMergeIndicesAction.indexForcemergedMessage": "L'index {indexNames} a fait l'objet d'une fusion forcée.", - "xpack.idxMgmt.forceMergeIndicesAction.successfullyForceMergedIndicesMessage": "Fusion forcée effectué avec succès : [{indexNames}]", "xpack.idxMgmt.formWizard.stepAliases.aliasesEditorHelpText": "Utiliser le format JSON : {code}", "xpack.idxMgmt.formWizard.stepSettings.settingsEditorHelpText": "Utiliser le format JSON : {code}", "xpack.idxMgmt.goToDiscover.showIndexToolTip": "Afficher {indexName} dans Discover", @@ -18777,9 +18753,7 @@ "xpack.idxMgmt.mappingsEditor.sourceFieldDescription": "Le champ _source contient le corps du document JSON d'origine qui a été fourni au moment de l'indexation. Vous pouvez nettoyer des champs individuels en définissant ceux à inclure ou exclure du champ _source. {docsLink}", "xpack.idxMgmt.mappingsEditor.typeField.documentationLinkLabel": "Documentation de {typeName}", "xpack.idxMgmt.openIndicesAction.indexOpenedMessage": "L'index {indexNames} a été ouvert.", - "xpack.idxMgmt.openIndicesAction.successfullyOpenedIndicesMessage": "Ouverture réussie : [{indexNames}]", "xpack.idxMgmt.refreshIndicesAction.indexRefreshedMessage": "L'index {indexNames} a été actualisé.", - "xpack.idxMgmt.refreshIndicesAction.successfullyRefreshedIndicesMessage": "Actualisation réussie : [{indexNames}]", "xpack.idxMgmt.templateDetails.summaryTab.indexPatternsDescriptionListTitle": "{numIndexPatterns, plural, one {Modèle} many {Modèles d''indexation manquants} other {Modèles}} d'index", "xpack.idxMgmt.templateForm.stepLogistics.dataStreamDescription": "Le modèle crée des flux de données au lieu d'index. {docsLink}", "xpack.idxMgmt.templateForm.stepLogistics.fieldIndexPatternsHelpText": "Les espaces et les caractères {invalidCharactersList} ne sont pas autorisés.", @@ -22351,7 +22325,6 @@ "xpack.lens.config.configFlyoutCallout": "ES|QL propose actuellement des options de configuration limitées", "xpack.lens.config.editLabel": "Modifier la configuration", "xpack.lens.config.editLinkLabel": "Modifier dans Lens", - "xpack.lens.config.editVisualizationLabel": "Modifier la visualisation", "xpack.lens.config.experimentalLabel": "Version d'évaluation technique", "xpack.lens.configPanel.addLayerButton": "Ajouter un calque", "xpack.lens.configPanel.experimentalLabel": "Version d'évaluation technique", @@ -25348,7 +25321,7 @@ "xpack.ml.dataFrame.analytics.create.searchSelection.CcsErrorCallOutTitle": "Les vues de données utilisant la recherche inter-clusters ne sont pas prises en charge.", "xpack.ml.dataFrame.analytics.create.searchSelection.errorGettingDataViewTitle": "Erreur lors du chargement de la vue de données utilisée par la recherche enregistrée", "xpack.ml.dataFrame.analytics.create.searchSelection.notFoundLabel": "Aucun recherche enregistrée ni aucun index correspondants n'ont été trouvés.", - "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.indexPattern": "Vue de données", + "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.dataView": "Vue de données", "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.search": "Recherche enregistrée", "xpack.ml.dataframe.analytics.create.shouldCreateDataViewMessage": "Vous ne pourrez peut-être pas visualiser les résultats de la tâche si aucune vue de données n'est créée pour l'index de destination.", "xpack.ml.dataframe.analytics.create.softTreeDepthLimitInputAriaLabel": "Les arbres de décision dépassant cette profondeur sont pénalisés dans les calculs de perte.", @@ -29237,7 +29210,6 @@ "xpack.observability.customThreshold.rule.alertFlyout.customEquationTooltip": "Ceci est compatible avec des calculs de base (A + B / C) et la logique booléenne (A < B ? A : B).", "xpack.observability.customThreshold.rule.alertFlyout.dataViewError.noTimestamp": "La vue de données sélectionnée ne dispose pas de champ d'horodatage. Veuillez sélectionner une autre vue de données.", "xpack.observability.customThreshold.rule.alertFlyout.defineTextQueryPrompt": "Définir le filtre de recherche (facultatif)", - "xpack.observability.customThreshold.rule.alertFlyout.error.aggregationRequired": "L'agrégation est requise.", "xpack.observability.customThreshold.rule.alertFlyout.error.equation.invalidCharacters": "Le champ d'équation prend en charge uniquement les caractères suivants : A-Z, +, -, /, *, (, ), ?, !, &, :, |, >, <, =", "xpack.observability.customThreshold.rule.alertFlyout.error.invalidFilterQuery": "La requête de filtre n'est pas valide.", "xpack.observability.customThreshold.rule.alertFlyout.error.invalidSearchConfiguration": "La vue de données est requise.", @@ -32361,12 +32333,7 @@ "xpack.securitySolution.responseActionsList.list.recordRange": "Affichage de {range} sur {total} {recordsLabel}", "xpack.securitySolution.responseActionsList.list.recordRangeLabel": "{records, plural, one {action de réponse} many {actions de réponse} other {actions de réponse}}", "xpack.securitySolution.riskInformation.howCalculatedText": "Le dispositif Entity Risk s'exécute toutes les heures afin de regrouper les alertes \"Open\" et \"Acknowledged\" des 30 derniers jours et attribue un score de risque à l'hôte ou à l'utilisateur. Il agrège ensuite les scores de risque individuels et les normalise dans une fourchette de 0 à 100 à l'aide de {riemannZetaLink} .", - "xpack.securitySolution.riskInformation.learnMore": "En savoir plus sur les risques {riskEntity}.", "xpack.securitySolution.riskInformation.riskHeader": "Plage de scores de risque de {riskEntity}", - "xpack.securitySolution.riskInformation.riskScoreFieldLabel": "Score de risque de {riskEntity}", - "xpack.securitySolution.riskInformation.riskScoreFieldText": "Le champ {riskScoreField} représente le risque normalisé du {riskEntity} sous la forme d'une valeur numérique unique. Vous pouvez utiliser cette valeur comme indicateur relatif du risque dans les playbooks de triage et de réponse.", - "xpack.securitySolution.riskInformation.riskScoreLevelLabel": "Niveau de risque {riskEntity}", - "xpack.securitySolution.riskInformation.riskScoreLevelText": "Le champ {riskLevelField} représente l'un des six niveaux de risque de {riskEntity}, sur la base d'indicateurs de risque prédéfinis.", "xpack.securitySolution.riskScore.api.ingestPipeline.delete.errorMessageTitle": "Impossible de supprimer {totalCount, plural, =1 {pipeline} one {pipelines} many {pipelines} other {pipelines}} d'ingestion", "xpack.securitySolution.riskScore.api.transforms.delete.errorMessageTitle": "Impossible de supprimer {totalCount, plural, =1 {Transformer} one {Transformations} many {Transformations} other {Transformations}}", "xpack.securitySolution.riskScore.api.transforms.start.errorMessageTitle": "Impossible de démarrer {totalCount, plural, =1 {Transformer} one {Transformations} many {Transformations} other {Transformations}}", @@ -36768,7 +36735,6 @@ "xpack.securitySolution.timeline.userDetails.firstSeenLabel": "Vu en premier", "xpack.securitySolution.timeline.userDetails.fullNameLabel": "Nom complet", "xpack.securitySolution.timeline.userDetails.hideManagedDataButton": "Masquer les données Azure AD", - "xpack.securitySolution.timeline.userDetails.hideObservedDataButton": "Masquer les données observées", "xpack.securitySolution.timeline.userDetails.hostOsNameLabel": "Système d'exploitation", "xpack.securitySolution.timeline.userDetails.ipAddressesLabel": "Adresses IP", "xpack.securitySolution.timeline.userDetails.lastNameLabel": "Nom", @@ -36787,7 +36753,6 @@ "xpack.securitySolution.timeline.userDetails.phoneLabel": "Téléphone", "xpack.securitySolution.timeline.userDetails.riskScoreLabel": "Score de risque", "xpack.securitySolution.timeline.userDetails.showManagedDataButton": "Afficher les données Azure AD", - "xpack.securitySolution.timeline.userDetails.showObservedDataButton": "Afficher les données observées", "xpack.securitySolution.timeline.userDetails.userIdLabel": "ID utilisateur", "xpack.securitySolution.timeline.userDetails.userLabel": "Utilisateur", "xpack.securitySolution.timeline.userDetails.valuesColumnTitle": "Valeurs", @@ -43047,7 +43012,6 @@ "cloud.deploymentDetails.cloudIDLabel": "Identifiant du cloud", "cloud.deploymentDetails.createManageApiKeysButtonLabel": "Créer et gérer des clés d'API", "cloud.deploymentDetails.elasticEndpointLabel": "Point de terminaison Elastic", - "cloud.deploymentDetails.helpMenuLinks.endpoints": "Points de terminaison", "cloud.deploymentDetails.learnMoreButtonLabel": "En savoir plus", "cloud.deploymentDetails.modal.closeButtonLabel": "Fermer", "cloud.deploymentDetails.modal.learnMoreButtonLabel": "En savoir plus", @@ -43485,7 +43449,6 @@ "unifiedDocViewer.sourceViewer.errorMessageTitle": "Une erreur s'est produite.", "unifiedDocViewer.sourceViewer.refresh": "Actualiser", "utils.filename.pathWarning": "Le chemin est peut-être incorrectement formé ; vérifiez la valeur", - "utils.filename.wildcardWarning": "l'utilisation de caractères génériques dans les chemins de fichier peut affecter les performances du point de terminaison", "visTypeGauge.advancedSettings.visualization.legacyGaugeChartsLibrary.description": "Active la bibliothèque de graphiques héritée pour les graphiques de jauge dans Visualize.", "visTypeGauge.advancedSettings.visualization.legacyGaugeChartsLibrary.name": "Bibliothèque de graphiques héritée pour les jauges", "visTypeGauge.controls.gaugeOptions.alignmentLabel": "Alignement", @@ -43638,7 +43601,6 @@ "xpack.cloudDataMigration.upgrade.text": "Effectuer la mise à niveau vers les versions plus récentes beaucoup plus facilement", "xpack.cloudLinks.deploymentLinkLabel": "Gérer ce déploiement", "xpack.cloudLinks.helpMenuLinks.documentation": "Documentation", - "xpack.cloudLinks.helpMenuLinks.endpoints": "Points de terminaison", "xpack.cloudLinks.helpMenuLinks.giveFeedback": "Donner un retour", "xpack.cloudLinks.helpMenuLinks.support": "Support technique", "xpack.cloudLinks.setupGuide": "Guides de configuration", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 157391ad9a6ff..872e4dc2233e3 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5323,7 +5323,6 @@ "savedSearch.kibana_context.savedSearchId.help": "クエリとフィルターに使用する保存検索ID を指定します。", "savedSearch.kibana_context.timeRange.help": "Kibana 時間範囲フィルターを指定します", "searchApiPanels.welcomeBanner.header.greeting.customTitle": "{name}様", - "searchApiPanels.welcomeBanner.ingestData.clientDocLink": "{languageName}APIリファレンス", "searchApiPanels.welcomeBanner.installClient.clientDocLink": "{languageName}クライアントドキュメント", "searchApiPanels.welcomeBanner.selectClient.description": "Elasticは複数の一般的な言語でクライアントを構築および保守します。Elasticのコミュニティはさらに多くを提供しています。お気に入りの言語クライアントを選択するか、{console}を起動して開始します。", "searchApiPanels.welcomeBanner.codeBox.copyButtonLabel": "コピー", @@ -5331,22 +5330,7 @@ "searchApiPanels.welcomeBanner.header.description": "プログラミング言語のクライアントを設定し、データを取り込めば、数分で検索を開始できます。", "searchApiPanels.welcomeBanner.header.greeting.defaultTitle": "こんにちは。", "searchApiPanels.welcomeBanner.header.title": "Elasticsearchをはじめよう", - "searchApiPanels.welcomeBanner.ingestData.beatsDescription": "Elasticsearch向けの軽量の、専用データ転送機能。Beatsを使用して、サーバーから運用データを送信します。", - "searchApiPanels.welcomeBanner.ingestData.beatsLink": "ビート", - "searchApiPanels.welcomeBanner.ingestData.beatsTitle": "ビート", - "searchApiPanels.welcomeBanner.ingestData.connectorsDescription": "サードパーティのソースからElasticsearchにデータを同期するための特別な統合。Elasticコネクターを使って、さまざまなデータベースやオブジェクトストアからコンテンツを同期できます。", - "searchApiPanels.welcomeBanner.ingestData.connectorsPythonLink": "connectors-python", - "searchApiPanels.welcomeBanner.ingestData.connectorsTitle": "コネクタークライアント", "searchApiPanels.welcomeBanner.ingestData.description": "データストリームやインデックスにデータを追加して、データを検索可能にします。アプリケーションとワークフローに合ったインジェスト方法を選択します。", - "searchApiPanels.welcomeBanner.ingestData.ingestApiDescription": "データをインデックス化する最も柔軟な方法で、カスタマイズや最適化オプションを完全に制御できます。", - "searchApiPanels.welcomeBanner.ingestData.ingestApiLabel": "API経由でインジェスト", - "searchApiPanels.welcomeBanner.ingestData.ingestIntegrationDescription": "データを変換してElasticsearchに送信するために最適化された専用のインジェストツール。", - "searchApiPanels.welcomeBanner.ingestData.ingestIntegrationLabel": "統合経由でインジェスト", - "searchApiPanels.welcomeBanner.ingestData.ingestLegendLabel": "インジェスチョン方法を選択", - "searchApiPanels.welcomeBanner.ingestData.integrationsLink": "統合について", - "searchApiPanels.welcomeBanner.ingestData.logstashDescription": "データストリームやインデックスにデータを追加して、データを検索可能にします。アプリケーションとワークフローに合ったインジェスト方法を選択します。", - "searchApiPanels.welcomeBanner.ingestData.logstashLink": "Logstash", - "searchApiPanels.welcomeBanner.ingestData.logstashTitle": "Logstash", "searchApiPanels.welcomeBanner.ingestData.title": "データをインジェスト", "searchApiPanels.welcomeBanner.installClient.description": "Elasticは複数の一般的な言語でクライアントを構築および保守します。Elasticのコミュニティはさらに多くを提供しています。開始するには、お気に入りの言語クライアントをインストールします。", "searchApiPanels.welcomeBanner.installClient.title": "クライアントをインスト-ル", @@ -8699,7 +8683,6 @@ "xpack.apm.dashboard.addDashboard.useContextFilterLabel.tooltip": "このオプションを有効にすると、選択したサービスと環境に基づいてダッシュボードにフィルターが適用されます。", "xpack.apm.data_view.creation_failed": "データビューの作成中にエラーが発生しました", "xpack.apm.dataView.alreadyExistsInActiveSpace": "アクティブなスペースにはすでにデータビューが存在します", - "xpack.apm.dataView.alreadyExistsInAnotherSpace": "データビューはすでに別のスペースに存在しますが、このスペースでは使用できません", "xpack.apm.dataView.autoCreateDisabled": "データビューの自動作成は、「autoCreateApmDataView」構成オプションによって無効化されています", "xpack.apm.dataView.noApmData": "APMデータがありません", "xpack.apm.dependecyOperationDetailView.header.backLinkLabel": "すべての演算", @@ -17114,7 +17097,6 @@ "xpack.fleet.agentActivityFlyout.inProgressTitle": "進行中", "xpack.fleet.agentActivityFlyout.noActivityDescription": "エージェントが再割り当て、アップグレード、または登録解除されたときに、アクティビティフィードがここに表示されます。", "xpack.fleet.agentActivityFlyout.noActivityText": "表示するアクティビティがありません", - "xpack.fleet.agentActivityFlyout.reviewErrorLogs": "エラーログを確認", "xpack.fleet.agentActivityFlyout.scheduledDescription": "スケジュール済み ", "xpack.fleet.agentActivityFlyout.title": "エージェントアクティビティ", "xpack.fleet.agentActivityFlyout.todayTitle": "今日", @@ -17923,7 +17905,6 @@ "xpack.fleet.initializationErrorMessageTitle": "Fleet を初期化できません", "xpack.fleet.integrations.customInputsLink": "カスタム入力", "xpack.fleet.integrations.discussForumLink": "フォーラム", - "xpack.fleet.integrations.endpointsButton": "エンドポイント", "xpack.fleet.integrations.installPackage.uploadedTooltip": "この統合はアップロードによってインストールされたため、自動的に再インストールできません。再インストールするには、もう一度アップロードしてください。", "xpack.fleet.integrations.integrationSaved": "統合設定が保存されました", "xpack.fleet.integrations.integrationSavedError": "統合設定の保存エラー", @@ -18652,9 +18633,7 @@ "xpack.grokDebugger.unknownErrorTitle": "問題が発生しました", "xpack.idxMgmt.badgeAriaLabel": "{label}。選択すると、これをフィルタリングします。", "xpack.idxMgmt.clearCacheIndicesAction.indexCacheClearedMessage": "インデックス{indexNames}のキャッシュがクリアされました。", - "xpack.idxMgmt.clearCacheIndicesAction.successMessage": "キャッシュが削除されました:[{indexNames}]", "xpack.idxMgmt.closeIndicesAction.indexClosedMessage": "インデックス{indexNames}は閉じられました。", - "xpack.idxMgmt.closeIndicesAction.successfullyClosedIndicesMessage": "[{indexNames}] がクローズされました", "xpack.idxMgmt.componentTemplateDetails.summaryTab.notInUseDescription": "インデックステンプレートを{createLink}するか、既存のテンプレートを{editLink}してください。", "xpack.idxMgmt.componentTemplateForm.stepLogistics.metaDescription": "クラスター状態に格納された、テンプレートに関する任意の情報。{learnMoreLink}", "xpack.idxMgmt.componentTemplateForm.stepLogistics.metaHelpText": "JSONフォーマットを使用:{code}", @@ -18673,7 +18652,6 @@ "xpack.idxMgmt.deleteDataStreamsConfirmationModal.multipleErrorsNotificationMessageText": "{count}データストリームの削除エラー", "xpack.idxMgmt.deleteDataStreamsConfirmationModal.successDeleteMultipleNotificationMessageText": "{numSuccesses, plural, other {#個のデータストリーム}}が削除されました", "xpack.idxMgmt.deleteIndicesAction.indexDeletedMessage": "インデックス{indexNames}が削除されました。", - "xpack.idxMgmt.deleteIndicesAction.successfullyDeletedIndicesMessage": "[{indexNames}] が削除されました", "xpack.idxMgmt.deleteTemplatesModal.confirmButtonLabel": "{numTemplatesToDelete, plural, other {テンプレート}}削除", "xpack.idxMgmt.deleteTemplatesModal.deleteDescription": "{numTemplatesToDelete, plural, other {これらのテンプレート}}を削除しようとしています:", "xpack.idxMgmt.deleteTemplatesModal.modalTitleText": "{numTemplatesToDelete, plural, other {#個のテンプレート}}削除", @@ -18691,9 +18669,7 @@ "xpack.idxMgmt.enrichPolicyCreate.configurationStep.queryHelpText": "デフォルトは{code}クエリです。", "xpack.idxMgmt.enrichPolicyCreate.configurationStep.rangeTypePopOver": "{type}は、番号、日付、またはIPアドレスの範囲と一致します。", "xpack.idxMgmt.flushIndicesAction.indexFlushedMessage": "インデックス{indexNames}がフラッシュされました。", - "xpack.idxMgmt.flushIndicesAction.successfullyFlushedIndicesMessage": "[{indexNames}]がフラッシュされました", "xpack.idxMgmt.forceMergeIndicesAction.indexForcemergedMessage": "インデックス{indexNames}は強制的にマージされました。", - "xpack.idxMgmt.forceMergeIndicesAction.successfullyForceMergedIndicesMessage": "[{indexNames}]が強制結合されました", "xpack.idxMgmt.formWizard.stepAliases.aliasesEditorHelpText": "JSONフォーマットを使用:{code}", "xpack.idxMgmt.formWizard.stepSettings.settingsEditorHelpText": "JSONフォーマットを使用:{code}", "xpack.idxMgmt.goToDiscover.showIndexToolTip": "Discoverで{indexName}を表示", @@ -18790,9 +18766,7 @@ "xpack.idxMgmt.mappingsEditor.sourceFieldDescription": "_source フィールドには、インデックスの時点で指定された元の JSON ドキュメント本文が含まれています。_sourceフィールドに含めるか除外するフィールドを定義することで、_sourceフィールドから個別のフィールドを削除することができます。{docsLink}", "xpack.idxMgmt.mappingsEditor.typeField.documentationLinkLabel": "{typeName} ドキュメント", "xpack.idxMgmt.openIndicesAction.indexOpenedMessage": "インデックス{indexNames}は開かれました。", - "xpack.idxMgmt.openIndicesAction.successfullyOpenedIndicesMessage": "[{indexNames}] が開かれました", "xpack.idxMgmt.refreshIndicesAction.indexRefreshedMessage": "インデックス{indexNames}は更新されました。", - "xpack.idxMgmt.refreshIndicesAction.successfullyRefreshedIndicesMessage": "[{indexNames}] が更新されました", "xpack.idxMgmt.templateDetails.summaryTab.indexPatternsDescriptionListTitle": "インデックス{numIndexPatterns, plural, other {パターン}}", "xpack.idxMgmt.templateForm.stepLogistics.dataStreamDescription": "テンプレートは、インデックスではなく、データストリームを作成します。{docsLink}", "xpack.idxMgmt.templateForm.stepLogistics.fieldIndexPatternsHelpText": "スペースと{invalidCharactersList}文字は使用できません。", @@ -22365,7 +22339,6 @@ "xpack.lens.config.configFlyoutCallout": "現在、ES|QLでは、構成オプションは限られています。", "xpack.lens.config.editLabel": "構成の編集", "xpack.lens.config.editLinkLabel": "Lensで編集", - "xpack.lens.config.editVisualizationLabel": "ビジュアライゼーションを編集", "xpack.lens.config.experimentalLabel": "テクニカルプレビュー", "xpack.lens.configPanel.addLayerButton": "レイヤーを追加", "xpack.lens.configPanel.experimentalLabel": "テクニカルプレビュー", @@ -25347,7 +25320,7 @@ "xpack.ml.dataFrame.analytics.create.searchSelection.CcsErrorCallOutTitle": "クラスター横断検索を使用するデータビューはサポートされていません。", "xpack.ml.dataFrame.analytics.create.searchSelection.errorGettingDataViewTitle": "保存された検索で使用されているデータビューの読み込みエラー", "xpack.ml.dataFrame.analytics.create.searchSelection.notFoundLabel": "一致インデックスまたは保存した検索が見つかりません。", - "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.indexPattern": "データビュー", + "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.dataView": "データビュー", "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.search": "保存検索", "xpack.ml.dataframe.analytics.create.shouldCreateDataViewMessage": "デスティネーションインデックスのデータビューが作成されていない場合は、ジョブ結果を表示できないことがあります。", "xpack.ml.dataframe.analytics.create.softTreeDepthLimitInputAriaLabel": "この深さを超える決定木は、損失計算でペナルティがあります。", @@ -29236,7 +29209,6 @@ "xpack.observability.customThreshold.rule.alertFlyout.customEquationTooltip": "これは基本的な数学ロジック(A + B / C)とブールロジック(A < B ?A :B)をサポートします。", "xpack.observability.customThreshold.rule.alertFlyout.dataViewError.noTimestamp": "選択したデータビューにタイムスタンプフィールドがありません。他のデータビューを選択してください。", "xpack.observability.customThreshold.rule.alertFlyout.defineTextQueryPrompt": "クエリフィルターを定義(任意)", - "xpack.observability.customThreshold.rule.alertFlyout.error.aggregationRequired": "集約が必要です。", "xpack.observability.customThreshold.rule.alertFlyout.error.equation.invalidCharacters": "等式フィールドでは次の文字のみを使用できます:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=", "xpack.observability.customThreshold.rule.alertFlyout.error.invalidFilterQuery": "フィルタークエリは無効です。", "xpack.observability.customThreshold.rule.alertFlyout.error.invalidSearchConfiguration": "データビューが必要です。", @@ -32359,12 +32331,7 @@ "xpack.securitySolution.responseActionsList.list.recordRange": "{total} {recordsLabel}件中{range}を表示中", "xpack.securitySolution.responseActionsList.list.recordRangeLabel": "{records, plural, other {対応アクション}}", "xpack.securitySolution.riskInformation.howCalculatedText": "エンティティリスクエンジンは、過去30日間の\"オープン\"および\"確認済み\"アラートを集約し、ホストまたはユーザーにリスクスコアを割り当てるために1時間ごとに実行されます。次に、個々のリスクスコアを集約し、{riemannZetaLink}を使用して0~100の範囲に正規化します。", - "xpack.securitySolution.riskInformation.learnMore": "{riskEntity}リスクの詳細", "xpack.securitySolution.riskInformation.riskHeader": "{riskEntity}リスクスコア範囲", - "xpack.securitySolution.riskInformation.riskScoreFieldLabel": "{riskEntity}リスクスコア", - "xpack.securitySolution.riskInformation.riskScoreFieldText": "{riskScoreField}フィールドは{riskEntity}の正規化されたリスクを1つの数値として表します。この値は、トリアージとレスポンスのプレイブックでリスクの相対的な指標として使用できます。", - "xpack.securitySolution.riskInformation.riskScoreLevelLabel": "{riskEntity}リスクレベル", - "xpack.securitySolution.riskInformation.riskScoreLevelText": "{riskLevelField}フィールドは、定義済みのリスクメトリックに基づく{riskEntity}の6つのリスクレベルのうちの1つを表します。", "xpack.securitySolution.riskScore.api.ingestPipeline.delete.errorMessageTitle": "インジェスト{totalCount, plural, =1 {パイプライン} other {パイプライン}}を削除できませんでした", "xpack.securitySolution.riskScore.api.transforms.delete.errorMessageTitle": "{totalCount, plural, =1 {変換} other {変換}}の削除に失敗しました", "xpack.securitySolution.riskScore.api.transforms.start.errorMessageTitle": "{totalCount, plural, =1 {変換} other {変換}}の開始に失敗しました", @@ -36766,7 +36733,6 @@ "xpack.securitySolution.timeline.userDetails.firstSeenLabel": "初回の認識", "xpack.securitySolution.timeline.userDetails.fullNameLabel": "フルネーム", "xpack.securitySolution.timeline.userDetails.hideManagedDataButton": "Azure ADデータを非表示", - "xpack.securitySolution.timeline.userDetails.hideObservedDataButton": "観測されたデータを非表示", "xpack.securitySolution.timeline.userDetails.hostOsNameLabel": "オペレーティングシステム", "xpack.securitySolution.timeline.userDetails.ipAddressesLabel": "IP アドレス", "xpack.securitySolution.timeline.userDetails.lastNameLabel": "姓", @@ -36785,7 +36751,6 @@ "xpack.securitySolution.timeline.userDetails.phoneLabel": "電話", "xpack.securitySolution.timeline.userDetails.riskScoreLabel": "リスクスコア", "xpack.securitySolution.timeline.userDetails.showManagedDataButton": "Azure ADデータを表示", - "xpack.securitySolution.timeline.userDetails.showObservedDataButton": "観測されたデータを表示", "xpack.securitySolution.timeline.userDetails.userIdLabel": "ユーザーID", "xpack.securitySolution.timeline.userDetails.userLabel": "ユーザー", "xpack.securitySolution.timeline.userDetails.valuesColumnTitle": "値", @@ -43037,7 +43002,6 @@ "cloud.deploymentDetails.cloudIDLabel": "クラウドID", "cloud.deploymentDetails.createManageApiKeysButtonLabel": "APIキーの作成と管理", "cloud.deploymentDetails.elasticEndpointLabel": "Elastic Endpoint", - "cloud.deploymentDetails.helpMenuLinks.endpoints": "エンドポイント", "cloud.deploymentDetails.learnMoreButtonLabel": "詳細", "cloud.deploymentDetails.modal.closeButtonLabel": "閉じる", "cloud.deploymentDetails.modal.learnMoreButtonLabel": "詳細", @@ -43475,7 +43439,6 @@ "unifiedDocViewer.sourceViewer.errorMessageTitle": "エラーが発生しました", "unifiedDocViewer.sourceViewer.refresh": "更新", "utils.filename.pathWarning": "パスの形式が正しくない可能性があります。値を検証してください", - "utils.filename.wildcardWarning": "ファイルパスでワイルドカードを使用すると、エンドポイントのパフォーマンスに影響する可能性があります", "visTypeGauge.advancedSettings.visualization.legacyGaugeChartsLibrary.description": "Visualizeでゲージグラフのレガシーグラフライブラリを有効にします。", "visTypeGauge.advancedSettings.visualization.legacyGaugeChartsLibrary.name": "ゲージグラフのレガシーグラフライブラリ", "visTypeGauge.controls.gaugeOptions.alignmentLabel": "アラインメント", @@ -43628,7 +43591,6 @@ "xpack.cloudDataMigration.upgrade.text": "新しいバージョンへのアップグレードがより簡単に", "xpack.cloudLinks.deploymentLinkLabel": "このデプロイの管理", "xpack.cloudLinks.helpMenuLinks.documentation": "ドキュメント", - "xpack.cloudLinks.helpMenuLinks.endpoints": "エンドポイント", "xpack.cloudLinks.helpMenuLinks.giveFeedback": "フィードバックを作成する", "xpack.cloudLinks.helpMenuLinks.support": "サポート", "xpack.cloudLinks.setupGuide": "セットアップガイド", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 192297f53e6ec..35c9f135b9e8f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5322,7 +5322,6 @@ "savedSearch.kibana_context.savedSearchId.help": "指定要用于查询和筛选的已保存搜索 ID", "savedSearch.kibana_context.timeRange.help": "指定 Kibana 时间范围筛选", "searchApiPanels.welcomeBanner.header.greeting.customTitle": "{name}您好!", - "searchApiPanels.welcomeBanner.ingestData.clientDocLink": "{languageName} API 参考", "searchApiPanels.welcomeBanner.installClient.clientDocLink": "{languageName} 客户端文档", "searchApiPanels.welcomeBanner.selectClient.description": "Elastic 以几种流行语言构建和维护客户端,我们的社区也做出了许多贡献。选择您常用的语言客户端或深入分析 {console} 以开始使用。", "searchApiPanels.welcomeBanner.codeBox.copyButtonLabel": "复制", @@ -5330,22 +5329,7 @@ "searchApiPanels.welcomeBanner.header.description": "设置您的编程语言客户端,采集一些数据,如此即可在数分钟内开始搜索。", "searchApiPanels.welcomeBanner.header.greeting.defaultTitle": "您好!", "searchApiPanels.welcomeBanner.header.title": "Elasticsearch 入门", - "searchApiPanels.welcomeBanner.ingestData.beatsDescription": "用于 Elasticsearch 的轻量级、单一用途数据采集器。使用 Beats 从您的服务器发送运营数据。", - "searchApiPanels.welcomeBanner.ingestData.beatsLink": "Beats", - "searchApiPanels.welcomeBanner.ingestData.beatsTitle": "Beats", - "searchApiPanels.welcomeBanner.ingestData.connectorsDescription": "用于将数据从第三方源同步到 Elasticsearch 的专用集成。使用 Elastic 连接器同步来自一系列数据库和对象存储的内容。", - "searchApiPanels.welcomeBanner.ingestData.connectorsPythonLink": "connectors-python", - "searchApiPanels.welcomeBanner.ingestData.connectorsTitle": "连接器客户端", "searchApiPanels.welcomeBanner.ingestData.description": "将数据添加到数据流或索引,使其可进行搜索。选择适合您的应用程序和工作流的集成方法。", - "searchApiPanels.welcomeBanner.ingestData.ingestApiDescription": "最灵活的数据索引方法,允许您全面控制定制和优化选项。", - "searchApiPanels.welcomeBanner.ingestData.ingestApiLabel": "通过 API 采集", - "searchApiPanels.welcomeBanner.ingestData.ingestIntegrationDescription": "针对转换数据并将其传输到 Elasticsearch 而优化的专用采集工具。", - "searchApiPanels.welcomeBanner.ingestData.ingestIntegrationLabel": "通过集成采集", - "searchApiPanels.welcomeBanner.ingestData.ingestLegendLabel": "选择采集方法", - "searchApiPanels.welcomeBanner.ingestData.integrationsLink": "关于集成", - "searchApiPanels.welcomeBanner.ingestData.logstashDescription": "将数据添加到数据流或索引,使其可进行搜索。选择适合您的应用程序和工作流的集成方法。", - "searchApiPanels.welcomeBanner.ingestData.logstashLink": "Logstash", - "searchApiPanels.welcomeBanner.ingestData.logstashTitle": "Logstash", "searchApiPanels.welcomeBanner.ingestData.title": "采集数据", "searchApiPanels.welcomeBanner.installClient.description": "Elastic 以几种流行语言构建和维护客户端,我们的社区也做出了许多贡献。安装您常用的语言客户端以开始使用。", "searchApiPanels.welcomeBanner.installClient.title": "安装客户端", @@ -8698,7 +8682,6 @@ "xpack.apm.dashboard.addDashboard.useContextFilterLabel.tooltip": "启用此选项会根据您选择的服务和环境,将筛选应用于仪表板。", "xpack.apm.data_view.creation_failed": "创建数据视图时出错", "xpack.apm.dataView.alreadyExistsInActiveSpace": "活动工作区中已存在数据视图", - "xpack.apm.dataView.alreadyExistsInAnotherSpace": "数据视图已在另一工作区中存在,但在此工作区中不可用", "xpack.apm.dataView.autoCreateDisabled": "已通过“autoCreateApmDataView”配置选项禁止自动创建数据视图", "xpack.apm.dataView.noApmData": "无 APM 数据", "xpack.apm.dependecyOperationDetailView.header.backLinkLabel": "所有操作", @@ -14462,18 +14445,18 @@ "xpack.enterpriseSearch.content.index.pipelines.settings.reduceWhitespaceLabel": "减少空白", "xpack.enterpriseSearch.content.index.pipelines.settings.runMlInferenceDescrition": "使用兼容的已训练 ML 模型增强您的数据", "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployedBody": "您可以在单线程配置中启动模型以用于测试,或调整性能以用于生产环境。", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployedTitle": "您的 ELSER v2 模型已部署,但尚未启动。", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployedTitle": "您的 ELSER 模型已部署,但尚未启动。", "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployingBody": "同时,您可以继续使用其他上传的模型来创建管道。", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployingTitle": "您的 ELSER v2 模型正在部署。", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployingTitle": "您的 ELSER 模型正在部署。", "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.dismissButton": "关闭 ELSER 对外调用", "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.learnMoreLink": "了解详情", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedBody": "在您的定制推理管道中体验 ELSER v2 的强大功能。", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedBody": "在您的定制推理管道中体验 ELSER 的强大功能。", "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedSingleThreadedBody": "此单线程配置非常适合测试您的定制推理管道,但应微调性能以用于生产。", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedSingleThreadedTitle": "您的 ELSER v2 模型已通过单线程方式启动。", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedSingleThreadedTitleCompact": "您的 ELSER v2 模型正通过单线程方式运行。", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedTitle": "您的 ELSER v2 模型已启动。", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedTitleCompact": "您的 ELSER v2 模型正在运行。", - "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.title": "通过 ELSER v2 改进您的结果", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedSingleThreadedTitle": "您的 ELSER 模型已通过单线程方式启动。", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedSingleThreadedTitleCompact": "您的 ELSER 模型正通过单线程方式运行。", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedTitle": "您的 ELSER 模型已启动。", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedTitleCompact": "您的 ELSER 模型正在运行。", + "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.title": "通过 ELSER 改进您的结果", "xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.titleBadge": "新建", "xpack.enterpriseSearch.content.index.searchApplication.createSearchApplication": "创建搜索应用程序", "xpack.enterpriseSearch.content.index.searchEngines.createEngineDisabledTooltip": "无法从隐藏索引创建搜索应用程序。", @@ -14743,9 +14726,9 @@ "xpack.enterpriseSearch.content.indices.pipelines.textExpansionCallOut.startModelButton.label": "以单线程方式启动", "xpack.enterpriseSearch.content.indices.pipelines.textExpansionCallOut.viewModelsButton": "查看详情", "xpack.enterpriseSearch.content.indices.pipelines.textExpansionCreateError.mlNotificationsLink": "Machine Learning 通知", - "xpack.enterpriseSearch.content.indices.pipelines.textExpansionCreateError.title": "ELSER v2 部署出错", - "xpack.enterpriseSearch.content.indices.pipelines.textExpansionFetchError.title": "提取 ELSER v2 模型时出错", - "xpack.enterpriseSearch.content.indices.pipelines.textExpansionStartError.title": "启动 ELSER v2 部署时出错", + "xpack.enterpriseSearch.content.indices.pipelines.textExpansionCreateError.title": "ELSER 部署出错", + "xpack.enterpriseSearch.content.indices.pipelines.textExpansionFetchError.title": "提取 ELSER 模型时出错", + "xpack.enterpriseSearch.content.indices.pipelines.textExpansionStartError.title": "启动 ELSER 部署时出错", "xpack.enterpriseSearch.content.indices.searchIndex.convertConnector.buttonLabel": "转换连接器", "xpack.enterpriseSearch.content.indices.selectConnector.allConnectorsLabel": "所有连接器", "xpack.enterpriseSearch.content.indices.selectConnector.callout.description.connectorsClient": "连接器客户端", @@ -17114,7 +17097,6 @@ "xpack.fleet.agentActivityFlyout.inProgressTitle": "进行中", "xpack.fleet.agentActivityFlyout.noActivityDescription": "重新分配、升级或取消注册代理时,活动源将在此处显示。", "xpack.fleet.agentActivityFlyout.noActivityText": "没有可显示的活动", - "xpack.fleet.agentActivityFlyout.reviewErrorLogs": "查看错误日志", "xpack.fleet.agentActivityFlyout.scheduledDescription": "计划进行 ", "xpack.fleet.agentActivityFlyout.title": "代理活动", "xpack.fleet.agentActivityFlyout.todayTitle": "今日", @@ -17923,7 +17905,6 @@ "xpack.fleet.initializationErrorMessageTitle": "无法初始化 Fleet", "xpack.fleet.integrations.customInputsLink": "定制输入", "xpack.fleet.integrations.discussForumLink": "论坛", - "xpack.fleet.integrations.endpointsButton": "终端", "xpack.fleet.integrations.installPackage.uploadedTooltip": "此集成通过上传进行安装,因此无法自动重新安装。请再次将其上传,以便重新安装。", "xpack.fleet.integrations.integrationSaved": "已保存集成设置", "xpack.fleet.integrations.integrationSavedError": "保存集成设置时出错", @@ -18652,9 +18633,7 @@ "xpack.grokDebugger.unknownErrorTitle": "出问题了", "xpack.idxMgmt.badgeAriaLabel": "{label}。选择以基于其进行筛选。", "xpack.idxMgmt.clearCacheIndicesAction.indexCacheClearedMessage": "已清除索引 {indexNames} 的缓存。", - "xpack.idxMgmt.clearCacheIndicesAction.successMessage": "已成功清除缓存:[{indexNames}]", "xpack.idxMgmt.closeIndicesAction.indexClosedMessage": "索引 {indexNames} 已关闭。", - "xpack.idxMgmt.closeIndicesAction.successfullyClosedIndicesMessage": "已成功关闭:[{indexNames}]", "xpack.idxMgmt.componentTemplateDetails.summaryTab.notInUseDescription": "{createLink}索引模板或{editLink}现有索引模板。", "xpack.idxMgmt.componentTemplateForm.stepLogistics.metaDescription": "有关模板的任意信息,以集群状态存储。{learnMoreLink}", "xpack.idxMgmt.componentTemplateForm.stepLogistics.metaHelpText": "使用 JSON 格式:{code}", @@ -18673,7 +18652,6 @@ "xpack.idxMgmt.deleteDataStreamsConfirmationModal.multipleErrorsNotificationMessageText": "删除 {count} 个数据流时出错", "xpack.idxMgmt.deleteDataStreamsConfirmationModal.successDeleteMultipleNotificationMessageText": "已删除 {numSuccesses, plural, other {# 个数据流}}", "xpack.idxMgmt.deleteIndicesAction.indexDeletedMessage": "索引 {indexNames} 已删除。", - "xpack.idxMgmt.deleteIndicesAction.successfullyDeletedIndicesMessage": "已成功删除:[{indexNames}]", "xpack.idxMgmt.deleteTemplatesModal.confirmButtonLabel": "删除 {numTemplatesToDelete, plural, other {模板}}", "xpack.idxMgmt.deleteTemplatesModal.deleteDescription": "您即将删除{numTemplatesToDelete, plural, other {以下模板}}:", "xpack.idxMgmt.deleteTemplatesModal.modalTitleText": "删除 {numTemplatesToDelete, plural, other {# 个模板}}", @@ -18691,9 +18669,7 @@ "xpack.idxMgmt.enrichPolicyCreate.configurationStep.queryHelpText": "默认为:{code} 查询。", "xpack.idxMgmt.enrichPolicyCreate.configurationStep.rangeTypePopOver": "{type} 匹配一个数字、日期或 IP 地址范围。", "xpack.idxMgmt.flushIndicesAction.indexFlushedMessage": "索引 {indexNames} 已清空。", - "xpack.idxMgmt.flushIndicesAction.successfullyFlushedIndicesMessage": "已成功清空:[{indexNames}]", "xpack.idxMgmt.forceMergeIndicesAction.indexForcemergedMessage": "已强制合并索引 {indexNames}。", - "xpack.idxMgmt.forceMergeIndicesAction.successfullyForceMergedIndicesMessage": "已成功强制合并:[{indexNames}]", "xpack.idxMgmt.formWizard.stepAliases.aliasesEditorHelpText": "使用 JSON 格式:{code}", "xpack.idxMgmt.formWizard.stepSettings.settingsEditorHelpText": "使用 JSON 格式:{code}", "xpack.idxMgmt.goToDiscover.showIndexToolTip": "在 Discover 中显示 {indexName}", @@ -18790,9 +18766,7 @@ "xpack.idxMgmt.mappingsEditor.sourceFieldDescription": "_source 字段包含在索引时提供的原始 JSON 文档正文。单个字段可通过定义哪些字段可以在 _source 字段中包括或排除来进行修剪。{docsLink}", "xpack.idxMgmt.mappingsEditor.typeField.documentationLinkLabel": "{typeName} 文档", "xpack.idxMgmt.openIndicesAction.indexOpenedMessage": "索引 {indexNames} 已打开。", - "xpack.idxMgmt.openIndicesAction.successfullyOpenedIndicesMessage": "已成功打开:[{indexNames}]", "xpack.idxMgmt.refreshIndicesAction.indexRefreshedMessage": "索引 {indexNames} 已刷新。", - "xpack.idxMgmt.refreshIndicesAction.successfullyRefreshedIndicesMessage": "已成功刷新:[{indexNames}]", "xpack.idxMgmt.templateDetails.summaryTab.indexPatternsDescriptionListTitle": "索引{numIndexPatterns, plural, other {模式}}", "xpack.idxMgmt.templateForm.stepLogistics.dataStreamDescription": "该模板创建数据流,而非索引。{docsLink}", "xpack.idxMgmt.templateForm.stepLogistics.fieldIndexPatternsHelpText": "不允许使用空格和字符 {invalidCharactersList}。", @@ -22365,7 +22339,6 @@ "xpack.lens.config.configFlyoutCallout": "ES|QL 当前提供的配置选项数量有限", "xpack.lens.config.editLabel": "编辑配置", "xpack.lens.config.editLinkLabel": "在 Lens 中编辑", - "xpack.lens.config.editVisualizationLabel": "编辑可视化", "xpack.lens.config.experimentalLabel": "技术预览", "xpack.lens.configPanel.addLayerButton": "添加图层", "xpack.lens.configPanel.experimentalLabel": "技术预览", @@ -25346,7 +25319,7 @@ "xpack.ml.dataFrame.analytics.create.searchSelection.CcsErrorCallOutTitle": "不支持使用跨集群搜索的数据视图。", "xpack.ml.dataFrame.analytics.create.searchSelection.errorGettingDataViewTitle": "加载已保存搜索所使用的数据视图时出错", "xpack.ml.dataFrame.analytics.create.searchSelection.notFoundLabel": "未找到匹配的索引或已保存搜索。", - "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.indexPattern": "数据视图", + "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.dataView": "数据视图", "xpack.ml.dataFrame.analytics.create.searchSelection.savedObjectType.search": "已保存搜索", "xpack.ml.dataframe.analytics.create.shouldCreateDataViewMessage": "如果没有为目标索引创建数据视图,则可能无法查看作业结果。", "xpack.ml.dataframe.analytics.create.softTreeDepthLimitInputAriaLabel": "超过此深度的决策树将在损失计算中被罚分。", @@ -29234,7 +29207,6 @@ "xpack.observability.customThreshold.rule.alertFlyout.customEquationTooltip": "这支持基本数学 (A + B / C) 和布尔逻辑 (A < B ?A :B)。", "xpack.observability.customThreshold.rule.alertFlyout.dataViewError.noTimestamp": "选定数据视图没有时间戳字段,请选择其他数据视图。", "xpack.observability.customThreshold.rule.alertFlyout.defineTextQueryPrompt": "定义查询筛选(可选)", - "xpack.observability.customThreshold.rule.alertFlyout.error.aggregationRequired": "“聚合”必填。", "xpack.observability.customThreshold.rule.alertFlyout.error.equation.invalidCharacters": "方程字段仅支持以下字符:A-Z、+、-、/、*、(、)、?、!、&、:、|、>、<、=", "xpack.observability.customThreshold.rule.alertFlyout.error.invalidFilterQuery": "筛选查询无效。", "xpack.observability.customThreshold.rule.alertFlyout.error.invalidSearchConfiguration": "需要数据视图。", @@ -32355,12 +32327,7 @@ "xpack.securitySolution.responseActionsList.list.recordRange": "正在显示第 {range} 个(共 {total} 个){recordsLabel}", "xpack.securitySolution.responseActionsList.list.recordRangeLabel": "{records, plural, other {响应操作}}", "xpack.securitySolution.riskInformation.howCalculatedText": "实体风险引擎每小时运行一次,以聚合过去 30 天出现的“未结”和“已确认”告警,并为主机或用户分配风险分数。然后,它会聚合各个风险分数并使用 {riemannZetaLink} 将其标准化为 0-100 范围。", - "xpack.securitySolution.riskInformation.learnMore": "详细了解 {riskEntity} 风险", "xpack.securitySolution.riskInformation.riskHeader": "{riskEntity} 风险分数范围", - "xpack.securitySolution.riskInformation.riskScoreFieldLabel": "{riskEntity} 风险分数", - "xpack.securitySolution.riskInformation.riskScoreFieldText": "{riskScoreField} 字段以单个数字值表示 {riskEntity} 的标准化风险。您可以在分类和响应 playbook 中将此值用作相对风险指标。", - "xpack.securitySolution.riskInformation.riskScoreLevelLabel": "{riskEntity} 风险级别", - "xpack.securitySolution.riskInformation.riskScoreLevelText": "{riskLevelField} 字段根据预定义的风险指标表示 {riskEntity} 的六个风险级别之一。", "xpack.securitySolution.riskScore.api.ingestPipeline.delete.errorMessageTitle": "无法删除采集{totalCount, plural, =1 {管道} other {管道}}", "xpack.securitySolution.riskScore.api.transforms.delete.errorMessageTitle": "无法删除{totalCount, plural, =1 {转换} other {转换}}", "xpack.securitySolution.riskScore.api.transforms.start.errorMessageTitle": "无法启动{totalCount, plural, =1 {转换} other {转换}}", @@ -36762,7 +36729,6 @@ "xpack.securitySolution.timeline.userDetails.firstSeenLabel": "首次看到时间", "xpack.securitySolution.timeline.userDetails.fullNameLabel": "全名", "xpack.securitySolution.timeline.userDetails.hideManagedDataButton": "隐藏 Azure AD 数据", - "xpack.securitySolution.timeline.userDetails.hideObservedDataButton": "隐藏观察数据", "xpack.securitySolution.timeline.userDetails.hostOsNameLabel": "操作系统", "xpack.securitySolution.timeline.userDetails.ipAddressesLabel": "IP 地址", "xpack.securitySolution.timeline.userDetails.lastNameLabel": "姓氏", @@ -36781,7 +36747,6 @@ "xpack.securitySolution.timeline.userDetails.phoneLabel": "电话", "xpack.securitySolution.timeline.userDetails.riskScoreLabel": "风险分数", "xpack.securitySolution.timeline.userDetails.showManagedDataButton": "显示 Azure AD 数据", - "xpack.securitySolution.timeline.userDetails.showObservedDataButton": "显示观察数据", "xpack.securitySolution.timeline.userDetails.userIdLabel": "用户 ID", "xpack.securitySolution.timeline.userDetails.userLabel": "用户", "xpack.securitySolution.timeline.userDetails.valuesColumnTitle": "值", @@ -43031,7 +42996,6 @@ "cloud.deploymentDetails.cloudIDLabel": "云 ID", "cloud.deploymentDetails.createManageApiKeysButtonLabel": "创建和管理 API 密钥", "cloud.deploymentDetails.elasticEndpointLabel": "Elastic 终端", - "cloud.deploymentDetails.helpMenuLinks.endpoints": "终端", "cloud.deploymentDetails.learnMoreButtonLabel": "了解详情", "cloud.deploymentDetails.modal.closeButtonLabel": "关闭", "cloud.deploymentDetails.modal.learnMoreButtonLabel": "了解详情", @@ -43469,7 +43433,6 @@ "unifiedDocViewer.sourceViewer.errorMessageTitle": "发生错误", "unifiedDocViewer.sourceViewer.refresh": "刷新", "utils.filename.pathWarning": "路径的格式可能不正确;请验证值", - "utils.filename.wildcardWarning": "在文件路径中使用通配符可能会影响终端性能", "visTypeGauge.advancedSettings.visualization.legacyGaugeChartsLibrary.description": "在 Visualize 中启用仪表盘图表的旧版图表库。", "visTypeGauge.advancedSettings.visualization.legacyGaugeChartsLibrary.name": "仪表盘旧版图表库", "visTypeGauge.controls.gaugeOptions.alignmentLabel": "对齐方式", @@ -43622,7 +43585,6 @@ "xpack.cloudDataMigration.upgrade.text": "更轻松地升级到较新版本", "xpack.cloudLinks.deploymentLinkLabel": "管理此部署", "xpack.cloudLinks.helpMenuLinks.documentation": "文档", - "xpack.cloudLinks.helpMenuLinks.endpoints": "终端", "xpack.cloudLinks.helpMenuLinks.giveFeedback": "反馈", "xpack.cloudLinks.helpMenuLinks.support": "支持", "xpack.cloudLinks.setupGuide": "设置指南", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.ts deleted file mode 100644 index ef1bdee1d5490..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.ts +++ /dev/null @@ -1,111 +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 { AlertConsumers } from '@kbn/rule-data-utils'; -import { createStartServicesMock } from '../../common/lib/kibana/kibana_react.mock'; -import type { ValidFeatureId } from '@kbn/rule-data-utils'; -import { act, renderHook } from '@testing-library/react-hooks'; -import { useAlertDataView, UserAlertDataView } from './use_alert_data_view'; - -const mockUseKibanaReturnValue = createStartServicesMock(); - -jest.mock('@kbn/kibana-react-plugin/public', () => ({ - __esModule: true, - useKibana: jest.fn(() => ({ - services: mockUseKibanaReturnValue, - })), -})); - -describe('useAlertDataView', () => { - const observabilityAlertFeatureIds: ValidFeatureId[] = [ - AlertConsumers.APM, - AlertConsumers.INFRASTRUCTURE, - AlertConsumers.LOGS, - AlertConsumers.UPTIME, - ]; - - beforeEach(() => { - mockUseKibanaReturnValue.http.get = jest.fn().mockReturnValue({ - index_name: [ - '.alerts-observability.uptime.alerts-*', - '.alerts-observability.metrics.alerts-*', - '.alerts-observability.logs.alerts-*', - '.alerts-observability.apm.alerts-*', - ], - }); - }); - - afterEach(() => { - jest.clearAllMocks(); - }); - - it('initially is loading and does not have data', async () => { - await act(async () => { - const mockedAsyncDataView = { - loading: true, - error: undefined, - }; - - const { result, waitForNextUpdate } = renderHook(() => - useAlertDataView(observabilityAlertFeatureIds) - ); - - await waitForNextUpdate(); - - expect(result.current).toEqual(mockedAsyncDataView); - }); - }); - - it('returns dataView for the provided featureIds', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useAlertDataView(observabilityAlertFeatureIds) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toMatchInlineSnapshot(` - Object { - "error": undefined, - "loading": false, - "value": Array [ - Object { - "fieldFormatMap": Object {}, - "fields": Array [], - "title": ".alerts-observability.uptime.alerts-*,.alerts-observability.metrics.alerts-*,.alerts-observability.logs.alerts-*,.alerts-observability.apm.alerts-*", - }, - ], - } - `); - }); - }); - - it('returns error with no data when error happens', async () => { - const error = new Error('http error'); - mockUseKibanaReturnValue.http.get = jest.fn().mockImplementation(async () => { - throw error; - }); - - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useAlertDataView(observabilityAlertFeatureIds) - ); - - await waitForNextUpdate(); - await waitForNextUpdate(); - - expect(result.current).toMatchInlineSnapshot(` - Object { - "error": [Error: http error], - "loading": false, - "value": undefined, - } - `); - }); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.tsx new file mode 100644 index 0000000000000..e37808a05d9b2 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.test.tsx @@ -0,0 +1,162 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { AlertConsumers } from '@kbn/rule-data-utils'; +import { createStartServicesMock } from '../../common/lib/kibana/kibana_react.mock'; +import type { ValidFeatureId } from '@kbn/rule-data-utils'; +import { act, renderHook } from '@testing-library/react-hooks'; +import { useAlertDataView } from './use_alert_data_view'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import React from 'react'; + +const mockUseKibanaReturnValue = createStartServicesMock(); + +jest.mock('@kbn/kibana-react-plugin/public', () => ({ + __esModule: true, + useKibana: jest.fn(() => ({ + services: mockUseKibanaReturnValue, + })), +})); + +jest.mock('../lib/rule_api/alert_index', () => ({ + fetchAlertIndexNames: jest.fn(), +})); + +const { fetchAlertIndexNames } = jest.requireMock('../lib/rule_api/alert_index'); + +jest.mock('../lib/rule_api/alert_fields', () => ({ + fetchAlertFields: jest.fn(), +})); +const { fetchAlertFields } = jest.requireMock('../lib/rule_api/alert_fields'); + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + cacheTime: 0, + }, + }, +}); +const wrapper = ({ children }: { children: Node }) => ( + {children} +); + +describe('useAlertDataView', () => { + const observabilityAlertFeatureIds: ValidFeatureId[] = [ + AlertConsumers.APM, + AlertConsumers.INFRASTRUCTURE, + AlertConsumers.LOGS, + AlertConsumers.UPTIME, + ]; + + beforeEach(() => { + fetchAlertIndexNames.mockResolvedValue([ + '.alerts-observability.uptime.alerts-*', + '.alerts-observability.metrics.alerts-*', + '.alerts-observability.logs.alerts-*', + '.alerts-observability.apm.alerts-*', + ]); + fetchAlertFields.mockResolvedValue([{ data: ' fields' }]); + }); + + afterEach(() => { + queryClient.clear(); + jest.clearAllMocks(); + }); + + it('initially is loading and does not have data', async () => { + await act(async () => { + const mockedAsyncDataView = { + loading: true, + dataview: undefined, + }; + + const { result, waitForNextUpdate } = renderHook( + () => useAlertDataView(observabilityAlertFeatureIds), + { + wrapper, + } + ); + + await waitForNextUpdate(); + + expect(result.current).toEqual(mockedAsyncDataView); + }); + }); + + it('fetch index names + fields for the provided o11y featureIds', async () => { + await act(async () => { + const { waitForNextUpdate } = renderHook( + () => useAlertDataView(observabilityAlertFeatureIds), + { + wrapper, + } + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(fetchAlertIndexNames).toHaveBeenCalledTimes(1); + expect(fetchAlertFields).toHaveBeenCalledTimes(1); + }); + }); + + it('only fetch index names for security featureId', async () => { + await act(async () => { + const { waitForNextUpdate } = renderHook(() => useAlertDataView([AlertConsumers.SIEM]), { + wrapper, + }); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(fetchAlertIndexNames).toHaveBeenCalledTimes(1); + expect(fetchAlertFields).toHaveBeenCalledTimes(0); + }); + }); + + it('Do not fetch anything if security and o11y featureIds are mix together', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook( + () => useAlertDataView([AlertConsumers.SIEM, AlertConsumers.LOGS]), + { + wrapper, + } + ); + + await waitForNextUpdate(); + + expect(fetchAlertIndexNames).toHaveBeenCalledTimes(0); + expect(fetchAlertFields).toHaveBeenCalledTimes(0); + expect(result.current).toEqual({ + loading: false, + dataview: undefined, + }); + }); + }); + + it('if fetch throw error return no data', async () => { + fetchAlertIndexNames.mockRejectedValue('error'); + + await act(async () => { + const { result, waitForNextUpdate } = renderHook( + () => useAlertDataView(observabilityAlertFeatureIds), + { + wrapper, + } + ); + + await waitForNextUpdate(); + await waitForNextUpdate(); + + expect(result.current).toEqual({ + loading: false, + dataview: undefined, + }); + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.ts b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.ts index 15608192e7ddc..7b72e5898d56d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_alert_data_view.ts @@ -5,72 +5,158 @@ * 2.0. */ -import { DataView, FieldSpec } from '@kbn/data-views-plugin/common'; +import { i18n } from '@kbn/i18n'; +import { DataView } from '@kbn/data-views-plugin/common'; import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common'; -import type { ValidFeatureId } from '@kbn/rule-data-utils'; -import useAsync from 'react-use/lib/useAsync'; -import { useMemo } from 'react'; +import { AlertConsumers, ValidFeatureId } from '@kbn/rule-data-utils'; +import { useEffect, useMemo, useState } from 'react'; +import { useQuery } from '@tanstack/react-query'; import { TriggersAndActionsUiServices } from '../..'; +import { fetchAlertIndexNames } from '../lib/rule_api/alert_index'; +import { fetchAlertFields } from '../lib/rule_api/alert_fields'; export interface UserAlertDataView { - value?: DataView[]; + dataviews?: DataView[]; loading: boolean; - error?: Error; } export function useAlertDataView(featureIds: ValidFeatureId[]): UserAlertDataView { - const { http } = useKibana().services; + const { + http, + data: dataService, + notifications: { toasts }, + } = useKibana().services; + const [dataviews, setDataviews] = useState(undefined); const features = featureIds.sort().join(','); + const isOnlySecurity = featureIds.length === 1 && featureIds.includes(AlertConsumers.SIEM); - const indexNames = useAsync(async () => { - const { index_name: indexNamesStr } = await http.get<{ index_name: string[] }>( - `${BASE_RAC_ALERTS_API_PATH}/index`, - { - query: { features }, - } - ); + const hasSecurityAndO11yFeatureIds = + featureIds.length > 1 && featureIds.includes(AlertConsumers.SIEM); - return indexNamesStr; - }, [features]); + const hasNoSecuritySolution = + featureIds.length > 0 && !isOnlySecurity && !hasSecurityAndO11yFeatureIds; - const fields = useAsync(async () => { - const { fields: alertFields } = await http.get<{ fields: FieldSpec[] }>( - `${BASE_RAC_ALERTS_API_PATH}/browser_fields`, - { - query: { featureIds }, - } - ); - return alertFields; - }, [features]); + const queryIndexNameFn = () => { + return fetchAlertIndexNames({ http, features }); + }; - const dataview = useMemo( - () => - !fields.loading && - !indexNames.loading && - fields.error === undefined && - indexNames.error === undefined - ? ([ - { - title: (indexNames.value ?? []).join(','), - fieldFormatMap: {}, - fields: (fields.value ?? [])?.map((field) => { - return { - ...field, - ...(field.esTypes && field.esTypes.includes('flattened') - ? { type: 'string' } - : {}), - }; - }), - }, - ] as unknown as DataView[]) - : undefined, - [fields, indexNames] - ); + const queryAlertFieldsFn = () => { + return fetchAlertFields({ http, featureIds }); + }; - return { - value: dataview, - loading: fields.loading || indexNames.loading, - error: fields.error ? fields.error : indexNames.error, + const onErrorFn = () => { + toasts.addDanger( + i18n.translate('xpack.triggersActionsUI.useAlertDataView.useAlertDataMessage', { + defaultMessage: 'Unable to load alert data view', + }) + ); }; + + const { + data: indexNames, + isSuccess: isIndexNameSuccess, + isInitialLoading: isIndexNameInitialLoading, + isLoading: isIndexNameLoading, + } = useQuery({ + queryKey: ['loadAlertIndexNames', features], + queryFn: queryIndexNameFn, + onError: onErrorFn, + refetchOnWindowFocus: false, + enabled: featureIds.length > 0 && !hasSecurityAndO11yFeatureIds, + }); + + const { + data: alertFields, + isSuccess: isAlertFieldsSuccess, + isInitialLoading: isAlertFieldsInitialLoading, + isLoading: isAlertFieldsLoading, + } = useQuery({ + queryKey: ['loadAlertFields', features], + queryFn: queryAlertFieldsFn, + onError: onErrorFn, + refetchOnWindowFocus: false, + enabled: hasNoSecuritySolution, + }); + + useEffect(() => { + return () => { + dataviews?.map((dv) => { + dataService.dataViews.clearInstanceCache(dv.id); + }); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [dataviews]); + + // FUTURE ENGINEER this useEffect is for security solution user since + // we are using the user privilege to access the security alert index + useEffect(() => { + async function createDataView() { + const localDataview = await dataService.dataViews.create({ + title: (indexNames ?? []).join(','), + allowNoIndex: true, + }); + setDataviews([localDataview]); + } + + if (isOnlySecurity && isIndexNameSuccess) { + createDataView(); + } + }, [dataService.dataViews, indexNames, isIndexNameSuccess, isOnlySecurity]); + + // FUTURE ENGINEER this useEffect is for o11y and stack solution user since + // we are using the kibana user privilege to access the alert index + useEffect(() => { + if ( + indexNames && + alertFields && + !isOnlySecurity && + isAlertFieldsSuccess && + isIndexNameSuccess + ) { + setDataviews([ + { + title: (indexNames ?? []).join(','), + fieldFormatMap: {}, + fields: (alertFields ?? [])?.map((field) => { + return { + ...field, + ...(field.esTypes && field.esTypes.includes('flattened') ? { type: 'string' } : {}), + }; + }), + }, + ] as unknown as DataView[]); + } + }, [ + alertFields, + dataService.dataViews, + indexNames, + isIndexNameSuccess, + isOnlySecurity, + isAlertFieldsSuccess, + ]); + + return useMemo( + () => ({ + dataviews, + loading: + featureIds.length === 0 || hasSecurityAndO11yFeatureIds + ? false + : isOnlySecurity + ? isIndexNameInitialLoading || isIndexNameLoading + : isIndexNameInitialLoading || + isIndexNameLoading || + isAlertFieldsInitialLoading || + isAlertFieldsLoading, + }), + [ + dataviews, + featureIds.length, + hasSecurityAndO11yFeatureIds, + isOnlySecurity, + isIndexNameInitialLoading, + isIndexNameLoading, + isAlertFieldsInitialLoading, + isAlertFieldsLoading, + ] + ); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_types_query.ts b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_types_query.ts index 4892341e57385..ab11bb4f18452 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_types_query.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_load_rule_types_query.ts @@ -13,6 +13,7 @@ import { RuleType, RuleTypeIndex } from '../../types'; interface UseLoadRuleTypesQueryProps { filteredRuleTypes: string[]; + enabled?: boolean; } const getFilteredIndex = (data: Array>, filteredRuleTypes: string[]) => { @@ -32,7 +33,7 @@ const getFilteredIndex = (data: Array>, filteredRuleTyp }; export const useLoadRuleTypesQuery = (props: UseLoadRuleTypesQueryProps) => { - const { filteredRuleTypes } = props; + const { filteredRuleTypes, enabled = true } = props; const { http, notifications: { toasts }, @@ -55,6 +56,7 @@ export const useLoadRuleTypesQuery = (props: UseLoadRuleTypesQueryProps) => { queryFn, onError: onErrorFn, refetchOnWindowFocus: false, + enabled, }); const filteredIndex = data ? getFilteredIndex(data, filteredRuleTypes) : new Map(); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_rule_aad_fields.ts b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_rule_aad_fields.ts index 7fa2e3f0dfd04..1ad7106910113 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_rule_aad_fields.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/hooks/use_rule_aad_fields.ts @@ -8,21 +8,67 @@ import { DataViewField } from '@kbn/data-views-plugin/common'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common'; -import useAsync from 'react-use/lib/useAsync'; -import type { AsyncState } from 'react-use/lib/useAsync'; +import { HttpSetup } from '@kbn/core/public'; +import { useQuery } from '@tanstack/react-query'; +import { i18n } from '@kbn/i18n'; +import { useMemo } from 'react'; import { TriggersAndActionsUiServices } from '../..'; -export function useRuleAADFields(ruleTypeId?: string): AsyncState { - const { http } = useKibana().services; +const EMPTY_AAD_FIELDS: DataViewField[] = []; - const aadFields = useAsync(async () => { - if (!ruleTypeId) return []; - const fields = await http.get(`${BASE_RAC_ALERTS_API_PATH}/aad_fields`, { - query: { ruleTypeId }, - }); +async function fetchAadFields({ + http, + ruleTypeId, +}: { + http: HttpSetup; + ruleTypeId?: string; +}): Promise { + if (!ruleTypeId) return EMPTY_AAD_FIELDS; + const fields = await http.get(`${BASE_RAC_ALERTS_API_PATH}/aad_fields`, { + query: { ruleTypeId }, + }); + + return fields; +} + +export function useRuleAADFields(ruleTypeId?: string): { + aadFields: DataViewField[]; + loading: boolean; +} { + const { + http, + notifications: { toasts }, + } = useKibana().services; + + const queryAadFieldsFn = () => { + return fetchAadFields({ http, ruleTypeId }); + }; + + const onErrorFn = () => { + toasts.addDanger( + i18n.translate('xpack.triggersActionsUI.useRuleAADFields.errorMessage', { + defaultMessage: 'Unable to load alert fields per rule type', + }) + ); + }; - return fields; + const { + data: aadFields = EMPTY_AAD_FIELDS, + isInitialLoading, + isLoading, + } = useQuery({ + queryKey: ['loadAlertAadFieldsPerRuleType', ruleTypeId], + queryFn: queryAadFieldsFn, + onError: onErrorFn, + refetchOnWindowFocus: false, + enabled: ruleTypeId !== undefined, }); - return aadFields; + return useMemo( + () => ({ + aadFields, + loading: ruleTypeId === undefined ? false : isInitialLoading || isLoading, + }), + [aadFields, isInitialLoading, isLoading, ruleTypeId] + ); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/alert_fields.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/alert_fields.ts new file mode 100644 index 0000000000000..7be5b3eec0e69 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/alert_fields.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ValidFeatureId } from '@kbn/rule-data-utils'; +import { HttpSetup } from '@kbn/core/public'; +import { FieldSpec } from '@kbn/data-views-plugin/common'; +import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common'; + +export async function fetchAlertFields({ + http, + featureIds, +}: { + http: HttpSetup; + featureIds: ValidFeatureId[]; +}): Promise { + const { fields: alertFields = [] } = await http.get<{ fields: FieldSpec[] }>( + `${BASE_RAC_ALERTS_API_PATH}/browser_fields`, + { + query: { featureIds }, + } + ); + return alertFields; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/alert_index.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/alert_index.ts new file mode 100644 index 0000000000000..8ac678664168b --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/alert_index.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common'; +import { HttpSetup } from '@kbn/core/public'; + +export async function fetchAlertIndexNames({ + http, + features, +}: { + http: HttpSetup; + features: string; +}): Promise { + const { index_name: indexNamesStr = [] } = await http.get<{ index_name: string[] }>( + `${BASE_RAC_ALERTS_API_PATH}/index`, + { + query: { features }, + } + ); + return indexNamesStr; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx index 83ad089c8e691..a9f49f609e13d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_type_form.tsx @@ -8,7 +8,7 @@ import React, { Suspense, useEffect, useState, useCallback, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ValidFeatureId, AlertConsumers } from '@kbn/rule-data-utils'; +import { ValidFeatureId } from '@kbn/rule-data-utils'; import { EuiFlexGroup, EuiFlexItem, @@ -428,8 +428,7 @@ export const ActionTypeForm = ({ setActionGroupIdByIndex && !actionItem.frequency?.summary; - const showActionAlertsFilter = - hasFieldsForAAD || producerId === AlertConsumers.SIEM || hasAlertsMappings; + const showActionAlertsFilter = hasFieldsForAAD; const accordionContent = checkEnabledResult.isEnabled ? ( <> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx index 077be38b5616a..10e2a8493d711 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_search_bar/alerts_search_bar.tsx @@ -9,12 +9,14 @@ import React, { useCallback, useState } from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { Query, TimeRange } from '@kbn/es-query'; import { SuggestionsAbstraction } from '@kbn/unified-search-plugin/public/typeahead/suggestions_component'; +import { AlertConsumers } from '@kbn/rule-data-utils'; import { NO_INDEX_PATTERNS } from './constants'; import { SEARCH_BAR_PLACEHOLDER } from './translations'; import { AlertsSearchBarProps, QueryLanguageType } from './types'; import { useAlertDataView } from '../../hooks/use_alert_data_view'; import { TriggersAndActionsUiServices } from '../../..'; import { useRuleAADFields } from '../../hooks/use_rule_aad_fields'; +import { useLoadRuleTypesQuery } from '../../hooks/use_load_rule_types_query'; const SA_ALERTS = { type: 'alerts', fields: {} } as SuggestionsAbstraction; @@ -44,15 +46,22 @@ export function AlertsSearchBar({ } = useKibana().services; const [queryLanguage, setQueryLanguage] = useState('kuery'); - const { value: dataView, loading, error } = useAlertDataView(featureIds); - const { - value: aadFields, - loading: fieldsLoading, - error: fieldsError, - } = useRuleAADFields(ruleTypeId); + const { dataviews, loading } = useAlertDataView(featureIds ?? []); + const { aadFields, loading: fieldsLoading } = useRuleAADFields(ruleTypeId); const indexPatterns = - ruleTypeId && aadFields?.length ? [{ title: ruleTypeId, fields: aadFields }] : dataView; + ruleTypeId && aadFields?.length ? [{ title: ruleTypeId, fields: aadFields }] : dataviews; + + const ruleType = useLoadRuleTypesQuery({ + filteredRuleTypes: ruleTypeId !== undefined ? [ruleTypeId] : [], + enabled: ruleTypeId !== undefined, + }); + + const isSecurity = + (featureIds && featureIds.length === 1 && featureIds.includes(AlertConsumers.SIEM)) || + (ruleType && + ruleTypeId && + ruleType.ruleTypesState.data.get(ruleTypeId)?.producer === AlertConsumers.SIEM); const onSearchQuerySubmit = useCallback( ({ dateRange, query: nextQuery }: { dateRange: TimeRange; query?: Query }) => { @@ -86,9 +95,7 @@ export function AlertsSearchBar({ appName={appName} disableQueryLanguageSwitcher={disableQueryLanguageSwitcher} // @ts-expect-error - DataView fields prop and SearchBar indexPatterns props are overly broad - indexPatterns={ - loading || error || fieldsLoading || fieldsError ? NO_INDEX_PATTERNS : indexPatterns - } + indexPatterns={loading || fieldsLoading ? NO_INDEX_PATTERNS : indexPatterns} placeholder={placeholder} query={{ query: query ?? '', language: queryLanguage }} filters={filters} @@ -105,7 +112,7 @@ export function AlertsSearchBar({ showSubmitButton={showSubmitButton} submitOnBlur={submitOnBlur} onQueryChange={onSearchQueryChange} - suggestionsAbstraction={SA_ALERTS} + suggestionsAbstraction={isSecurity ? undefined : SA_ALERTS} /> ); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx index de2eb91b74c84..aab0b5891fc77 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_add.tsx @@ -305,6 +305,7 @@ const RuleAdd = ({ hideGrouping={hideGrouping} hideInterval={hideInterval} onChangeMetaData={onChangeMetaData} + selectedConsumer={selectedConsumer} setConsumer={setSelectedConsumer} useRuleProducer={useRuleProducer} /> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx index 59d3c4f1f8c3b..f528ce4b45aa7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.test.tsx @@ -262,6 +262,7 @@ describe('rule_form', () => { ruleTypesOverwrite?: RuleType[]; ruleTypeModelOverwrite?: RuleTypeModel; useRuleProducer?: boolean; + selectedConsumer?: RuleCreationValidConsumer | null; }) { const { showRulesList = false, @@ -273,6 +274,7 @@ describe('rule_form', () => { ruleTypesOverwrite, ruleTypeModelOverwrite, useRuleProducer = false, + selectedConsumer, } = options || {}; const mocks = coreMock.createSetup(); @@ -325,7 +327,11 @@ describe('rule_form', () => { enabledInLicense: false, }, ]; - useLoadRuleTypes.mockReturnValue({ ruleTypes }); + const ruleTypeIndex = ruleTypes.reduce((acc, item) => { + acc.set(item.id, item); + return acc; + }, new Map()); + useLoadRuleTypes.mockReturnValue({ ruleTypes, ruleTypeIndex }); const [ { application: { capabilities }, @@ -377,7 +383,7 @@ describe('rule_form', () => { minimumScheduleInterval: { value: '1m', enforce: enforceMinimum }, }} dispatch={() => {}} - errors={{ name: [], 'schedule.interval': [], ruleTypeId: [] }} + errors={{ name: [], 'schedule.interval': [], ruleTypeId: [], actionConnectors: [] }} operation="create" actionTypeRegistry={actionTypeRegistry} ruleTypeRegistry={ruleTypeRegistry} @@ -386,6 +392,7 @@ describe('rule_form', () => { validConsumers={validConsumers} setConsumer={mockSetConsumer} useRuleProducer={useRuleProducer} + selectedConsumer={selectedConsumer} /> ); @@ -666,6 +673,361 @@ describe('rule_form', () => { expect(wrapper.find('[data-test-subj="ruleFormConsumerSelect"]').exists()).toBeFalsy(); }); + + it('Do not show alert query in action when multi consumer rule type does not have a consumer selected', async () => { + await setup({ + initialRuleOverwrite: { + name: 'Simple rule', + consumer: 'alerts', + ruleTypeId: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + schedule: { + interval: '1h', + }, + }, + ruleTypesOverwrite: [ + { + id: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + name: 'Threshold Rule', + actionGroups: [ + { + id: 'testActionGroup', + name: 'Test Action Group', + }, + ], + enabledInLicense: true, + defaultActionGroupId: 'threshold.fired', + minimumLicenseRequired: 'basic', + recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, + producer: ALERTS_FEATURE_ID, + authorizedConsumers: { + infrastructure: { read: true, all: true }, + logs: { read: true, all: true }, + }, + actionVariables: { + context: [], + state: [], + params: [], + }, + hasFieldsForAAD: true, + hasAlertsMappings: true, + }, + ], + ruleTypeModelOverwrite: { + id: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + iconClass: 'test', + description: 'test', + documentationUrl: null, + validate: (): ValidationResult => { + return { errors: {} }; + }, + ruleParamsExpression: TestExpression, + requiresAppContext: false, + }, + }); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find(ActionForm).props().hasFieldsForAAD).toEqual(false); + }); + + it('Do not show alert query in action when we do not have hasFieldsForAAD or hasAlertsMappings or belong to security', async () => { + await setup({ + initialRuleOverwrite: { + name: 'Simple rule', + consumer: 'alerts', + ruleTypeId: 'my-rule-type', + schedule: { + interval: '1h', + }, + }, + ruleTypesOverwrite: [ + { + id: 'my-rule-type', + name: 'Threshold Rule', + actionGroups: [ + { + id: 'testActionGroup', + name: 'Test Action Group', + }, + ], + enabledInLicense: true, + defaultActionGroupId: 'threshold.fired', + minimumLicenseRequired: 'basic', + recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, + producer: ALERTS_FEATURE_ID, + authorizedConsumers: { + infrastructure: { read: true, all: true }, + logs: { read: true, all: true }, + }, + actionVariables: { + context: [], + state: [], + params: [], + }, + hasFieldsForAAD: false, + hasAlertsMappings: false, + }, + ], + ruleTypeModelOverwrite: { + id: 'my-rule-type', + iconClass: 'test', + description: 'test', + documentationUrl: null, + validate: (): ValidationResult => { + return { errors: {} }; + }, + ruleParamsExpression: TestExpression, + requiresAppContext: false, + }, + }); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find(ActionForm).props().hasFieldsForAAD).toEqual(false); + }); + + it('Show alert query in action when rule type hasFieldsForAAD', async () => { + await setup({ + initialRuleOverwrite: { + name: 'Simple rule', + consumer: 'alerts', + ruleTypeId: 'my-rule-type', + schedule: { + interval: '1h', + }, + }, + ruleTypesOverwrite: [ + { + id: 'my-rule-type', + name: 'Threshold Rule', + actionGroups: [ + { + id: 'testActionGroup', + name: 'Test Action Group', + }, + ], + enabledInLicense: true, + defaultActionGroupId: 'threshold.fired', + minimumLicenseRequired: 'basic', + recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, + producer: ALERTS_FEATURE_ID, + authorizedConsumers: { + infrastructure: { read: true, all: true }, + logs: { read: true, all: true }, + }, + actionVariables: { + context: [], + state: [], + params: [], + }, + hasFieldsForAAD: true, + hasAlertsMappings: false, + }, + ], + ruleTypeModelOverwrite: { + id: 'my-rule-type', + iconClass: 'test', + description: 'test', + documentationUrl: null, + validate: (): ValidationResult => { + return { errors: {} }; + }, + ruleParamsExpression: TestExpression, + requiresAppContext: false, + }, + }); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find(ActionForm).props().hasFieldsForAAD).toEqual(true); + }); + + it('Show alert query in action when rule type hasAlertsMappings', async () => { + await setup({ + initialRuleOverwrite: { + name: 'Simple rule', + consumer: 'alerts', + ruleTypeId: 'my-rule-type', + schedule: { + interval: '1h', + }, + }, + ruleTypesOverwrite: [ + { + id: 'my-rule-type', + name: 'Threshold Rule', + actionGroups: [ + { + id: 'testActionGroup', + name: 'Test Action Group', + }, + ], + enabledInLicense: true, + defaultActionGroupId: 'threshold.fired', + minimumLicenseRequired: 'basic', + recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, + producer: ALERTS_FEATURE_ID, + authorizedConsumers: { + infrastructure: { read: true, all: true }, + logs: { read: true, all: true }, + }, + actionVariables: { + context: [], + state: [], + params: [], + }, + hasFieldsForAAD: false, + hasAlertsMappings: true, + }, + ], + ruleTypeModelOverwrite: { + id: 'my-rule-type', + iconClass: 'test', + description: 'test', + documentationUrl: null, + validate: (): ValidationResult => { + return { errors: {} }; + }, + ruleParamsExpression: TestExpression, + requiresAppContext: false, + }, + }); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find(ActionForm).props().hasFieldsForAAD).toEqual(true); + }); + + it('Show alert query in action when rule type is from security solution', async () => { + await setup({ + initialRuleOverwrite: { + name: 'Simple rule', + consumer: 'siem', + ruleTypeId: 'my-rule-type', + schedule: { + interval: '1h', + }, + }, + ruleTypesOverwrite: [ + { + id: 'my-rule-type', + name: 'Threshold Rule', + actionGroups: [ + { + id: 'testActionGroup', + name: 'Test Action Group', + }, + ], + enabledInLicense: true, + defaultActionGroupId: 'threshold.fired', + minimumLicenseRequired: 'basic', + recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, + producer: 'siem', + authorizedConsumers: { + infrastructure: { read: true, all: true }, + logs: { read: true, all: true }, + }, + actionVariables: { + context: [], + state: [], + params: [], + }, + hasFieldsForAAD: false, + hasAlertsMappings: false, + }, + ], + ruleTypeModelOverwrite: { + id: 'my-rule-type', + iconClass: 'test', + description: 'test', + documentationUrl: null, + validate: (): ValidationResult => { + return { errors: {} }; + }, + ruleParamsExpression: TestExpression, + requiresAppContext: false, + }, + }); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find(ActionForm).props().hasFieldsForAAD).toEqual(true); + }); + + it('show alert query in action when multi consumer rule type does not have a consumer selected', async () => { + await setup({ + initialRuleOverwrite: { + name: 'Simple rule', + consumer: 'alerts', + ruleTypeId: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + schedule: { + interval: '1h', + }, + }, + ruleTypesOverwrite: [ + { + id: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + name: 'Threshold Rule', + actionGroups: [ + { + id: 'testActionGroup', + name: 'Test Action Group', + }, + ], + enabledInLicense: true, + defaultActionGroupId: 'threshold.fired', + minimumLicenseRequired: 'basic', + recoveryActionGroup: { id: 'recovered', name: 'Recovered' }, + producer: ALERTS_FEATURE_ID, + authorizedConsumers: { + infrastructure: { read: true, all: true }, + logs: { read: true, all: true }, + }, + actionVariables: { + context: [], + state: [], + params: [], + }, + hasFieldsForAAD: true, + hasAlertsMappings: true, + }, + ], + ruleTypeModelOverwrite: { + id: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, + iconClass: 'test', + description: 'test', + documentationUrl: null, + validate: (): ValidationResult => { + return { errors: {} }; + }, + ruleParamsExpression: TestExpression, + requiresAppContext: false, + }, + selectedConsumer: 'logs', + }); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find(ActionForm).props().hasFieldsForAAD).toEqual(true); + }); }); describe('rule_form create rule non ruleing consumer and producer', () => { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx index c321ba5a01d7a..eef420d9e6a1d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_form/rule_form.tsx @@ -153,6 +153,7 @@ interface RuleFormProps> { hideGrouping?: boolean; hideInterval?: boolean; connectorFeatureId?: string; + selectedConsumer?: RuleCreationValidConsumer | null; validConsumers?: RuleCreationValidConsumer[]; onChangeMetaData: (metadata: MetaData) => void; useRuleProducer?: boolean; @@ -176,6 +177,7 @@ export const RuleForm = ({ hideGrouping = false, hideInterval, connectorFeatureId = AlertingConnectorFeatureId, + selectedConsumer, validConsumers, onChangeMetaData, useRuleProducer, @@ -643,6 +645,23 @@ export const RuleForm = ({ } }; + const hasFieldsForAAD = useMemo(() => { + const hasAlertHasData = selectedRuleType + ? selectedRuleType.hasFieldsForAAD || + selectedRuleType.producer === AlertConsumers.SIEM || + selectedRuleType.hasAlertsMappings + : false; + + if (MULTI_CONSUMER_RULE_TYPE_IDS.includes(rule?.ruleTypeId ?? '')) { + return ( + (validConsumers || VALID_CONSUMERS).includes( + selectedConsumer as RuleCreationValidConsumer + ) && hasAlertHasData + ); + } + return hasAlertHasData; + }, [rule?.ruleTypeId, selectedConsumer, selectedRuleType, validConsumers]); + const ruleTypeDetails = ( <> @@ -820,8 +839,12 @@ export const RuleForm = ({ defaultActionGroupId={defaultActionGroupId} hasAlertsMappings={selectedRuleType.hasAlertsMappings} featureId={connectorFeatureId} - producerId={selectedRuleType.producer} - hasFieldsForAAD={selectedRuleType.hasFieldsForAAD} + producerId={ + MULTI_CONSUMER_RULE_TYPE_IDS.includes(rule.ruleTypeId) + ? selectedConsumer ?? rule.consumer + : selectedRuleType.producer + } + hasFieldsForAAD={hasFieldsForAAD} ruleTypeId={rule.ruleTypeId} isActionGroupDisabledForActionType={(actionGroupId: string, actionTypeId: string) => isActionGroupDisabledForActionType(selectedRuleType, actionGroupId, actionTypeId) diff --git a/x-pack/plugins/triggers_actions_ui/public/common/get_alerts_search_bar.tsx b/x-pack/plugins/triggers_actions_ui/public/common/get_alerts_search_bar.tsx index ddeb5e5c4c067..9bbd999aa6a52 100644 --- a/x-pack/plugins/triggers_actions_ui/public/common/get_alerts_search_bar.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/common/get_alerts_search_bar.tsx @@ -6,6 +6,7 @@ */ import { EuiLoadingSpinner } from '@elastic/eui'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import React, { lazy, Suspense } from 'react'; import type { AlertsSearchBarProps } from '../application/sections/alerts_search_bar'; @@ -13,8 +14,12 @@ const AlertsSearchBarLazy: React.FC = lazy( () => import('../application/sections/alerts_search_bar/alerts_search_bar') ); +const queryClient = new QueryClient(); + export const getAlertsSearchBarLazy = (props: AlertsSearchBarProps) => ( }> - + + + ); diff --git a/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts b/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts index 4df3c8c1e8470..46ab3ddff2529 100644 --- a/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts +++ b/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts @@ -39,7 +39,7 @@ async function getCoreWebVitalsResponse({ dataStartPlugin, }: WithDataPlugin) { const dataViewResponse = await callApmApi( - 'GET /internal/apm/data_view/title', + 'GET /internal/apm/data_view/index_pattern', { signal: null, } @@ -47,7 +47,7 @@ async function getCoreWebVitalsResponse({ return await esQuery>(dataStartPlugin, { params: { - index: dataViewResponse.apmDataViewTitle, + index: dataViewResponse.apmDataViewIndexPattern, ...coreWebVitalsQuery(absoluteTime.start, absoluteTime.end, undefined, { serviceName: serviceName ? [serviceName] : undefined, }), @@ -83,7 +83,7 @@ export async function hasRumData( params: WithDataPlugin ): Promise { const dataViewResponse = await callApmApi( - 'GET /internal/apm/data_view/title', + 'GET /internal/apm/data_view/index_pattern', { signal: null, } @@ -93,7 +93,7 @@ export async function hasRumData( params.dataStartPlugin, { params: { - index: dataViewResponse.apmDataViewTitle, + index: dataViewResponse.apmDataViewIndexPattern, ...hasRumDataQuery({ start: params?.absoluteTime?.start, end: params?.absoluteTime?.end, @@ -102,7 +102,10 @@ export async function hasRumData( } ); - return formatHasRumResult(esQueryResponse, dataViewResponse.apmDataViewTitle); + return formatHasRumResult( + esQueryResponse, + dataViewResponse.apmDataViewIndexPattern + ); } async function esQuery( diff --git a/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts b/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts index 81fb2f966966b..d051e07d0057d 100644 --- a/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts +++ b/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts @@ -9,13 +9,13 @@ import { useFetcher } from './use_fetcher'; export function useDynamicDataViewTitle() { const { data, status } = useFetcher((callApmApi) => { - return callApmApi('GET /internal/apm/data_view/title', { + return callApmApi('GET /internal/apm/data_view/index_pattern', { isCachable: true, }); }, []); return { - dataViewTitle: data?.apmDataViewTitle, + dataViewTitle: data?.apmDataViewIndexPattern, status, }; } diff --git a/x-pack/test/accessibility/apps/ml.ts b/x-pack/test/accessibility/apps/ml.ts index dd2fad6de05de..2a6021b7be78e 100644 --- a/x-pack/test/accessibility/apps/ml.ts +++ b/x-pack/test/accessibility/apps/ml.ts @@ -50,10 +50,10 @@ export default function ({ getService }: FtrProviderContext) { describe('with data loaded', function () { const dfaOutlierResultsJobId = 'iph_outlier_a11y'; - const ecIndexPattern = 'ft_module_sample_ecommerce'; - const ihpIndexPattern = 'ft_ihp_outlier'; - const egsIndexPattern = 'ft_egs_regression'; - const bmIndexPattern = 'ft_bank_marketing'; + const ecIndexName = 'ft_module_sample_ecommerce'; + const ihpIndexName = 'ft_ihp_outlier'; + const egsIndexName = 'ft_egs_regression'; + const bmIndexName = 'ft_bank_marketing'; const ecExpectedTotalCount = '287'; const dfaOutlierJobType = 'outlier_detection'; @@ -78,10 +78,10 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.loadIfNeeded( 'x-pack/test/functional/es_archives/ml/module_sample_ecommerce' ); - await ml.testResources.createIndexPatternIfNeeded(ihpIndexPattern); - await ml.testResources.createIndexPatternIfNeeded(egsIndexPattern); - await ml.testResources.createIndexPatternIfNeeded(bmIndexPattern); - await ml.testResources.createIndexPatternIfNeeded(ecIndexPattern, 'order_date'); + await ml.testResources.createDataViewIfNeeded(ihpIndexName); + await ml.testResources.createDataViewIfNeeded(egsIndexName); + await ml.testResources.createDataViewIfNeeded(bmIndexName); + await ml.testResources.createDataViewIfNeeded(ecIndexName, 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createAndRunDFAJob( @@ -93,10 +93,10 @@ export default function ({ getService }: FtrProviderContext) { await ml.api.cleanMlIndices(); await ml.api.deleteIndices(`user-${dfaOutlierResultsJobId}`); - await ml.testResources.deleteIndexPatternByTitle(ihpIndexPattern); - await ml.testResources.deleteIndexPatternByTitle(egsIndexPattern); - await ml.testResources.deleteIndexPatternByTitle(bmIndexPattern); - await ml.testResources.deleteIndexPatternByTitle(ecIndexPattern); + await ml.testResources.deleteDataViewByTitle(ihpIndexName); + await ml.testResources.deleteDataViewByTitle(egsIndexName); + await ml.testResources.deleteDataViewByTitle(bmIndexName); + await ml.testResources.deleteDataViewByTitle(ecIndexName); await esArchiver.unload('x-pack/test/functional/es_archives/ml/ihp_outlier'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/egs_regression'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/bm_classification'); @@ -134,7 +134,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.testExecution.logTestStep( 'job creation selects the source data and loads the DFA job wizard page' ); - await ml.jobSourceSelection.selectSourceForAnalyticsJob(ihpIndexPattern); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(ihpIndexName); await ml.dataFrameAnalyticsCreation.assertConfigurationStepActive(); await a11y.testAppSnapshot(); }); @@ -180,7 +180,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToMl(); await ml.navigation.navigateToDataFrameAnalytics(); await ml.dataFrameAnalytics.startAnalyticsCreation(); - await ml.jobSourceSelection.selectSourceForAnalyticsJob(egsIndexPattern); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(egsIndexName); await ml.dataFrameAnalyticsCreation.assertConfigurationStepActive(); await ml.testExecution.logTestStep('selects the regression job type'); await ml.dataFrameAnalyticsCreation.assertJobTypeSelectExists(); @@ -227,7 +227,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToMl(); await ml.navigation.navigateToDataFrameAnalytics(); await ml.dataFrameAnalytics.startAnalyticsCreation(); - await ml.jobSourceSelection.selectSourceForAnalyticsJob(bmIndexPattern); + await ml.jobSourceSelection.selectSourceForAnalyticsJob(bmIndexName); await ml.dataFrameAnalyticsCreation.assertConfigurationStepActive(); await ml.testExecution.logTestStep('selects the classification job type'); await ml.dataFrameAnalyticsCreation.assertJobTypeSelectExists(); @@ -275,12 +275,12 @@ export default function ({ getService }: FtrProviderContext) { }); it('index data visualizer select index pattern page', async () => { - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await a11y.testAppSnapshot(); }); it('index data visualizer page for selected index', async () => { - await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(ecIndexPattern); + await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(ecIndexName); await ml.testExecution.logTestStep('should display the time range step'); await ml.dataVisualizerIndexBased.assertTimeRangeSelectorSectionExists(); diff --git a/x-pack/test/accessibility/apps/ml_anomaly_detection.ts b/x-pack/test/accessibility/apps/ml_anomaly_detection.ts index c8cff8616f23c..39860093871e5 100644 --- a/x-pack/test/accessibility/apps/ml_anomaly_detection.ts +++ b/x-pack/test/accessibility/apps/ml_anomaly_detection.ts @@ -65,10 +65,10 @@ export default function ({ getService }: FtrProviderContext) { const eventDescription = 'calendar_event_a11y'; const filterId = 'filter_a11y'; const filterItems = ['filter_item_a11y']; - const fqIndexPattern = 'ft_farequote'; - const ecIndexPattern = 'ft_module_sample_ecommerce'; + const fqIndexName = 'ft_farequote'; + const ecIndexName = 'ft_module_sample_ecommerce'; - const categorizationIndexPattern = 'ft_categorization_small'; + const categorizationIndexName = 'ft_categorization_small'; const adJobAggAndFieldIdentifier = 'Mean(responsetime)'; const adJobBucketSpan = '30m'; @@ -87,12 +87,12 @@ export default function ({ getService }: FtrProviderContext) { const advancedJobTestData = { suiteTitle: 'with multiple metric detectors and custom datafeed settings', - jobSource: ecIndexPattern, + jobSource: ecIndexName, jobId: `ec_advanced_1_${Date.now()}`, get jobIdClone(): string { return `${this.jobId}_clone`; }, - jobDescription: `Create advanced job from ${ecIndexPattern} dataset with multiple metric detectors and custom datafeed settings`, + jobDescription: `Create advanced job from ${ecIndexName} dataset with multiple metric detectors and custom datafeed settings`, jobGroups: ['automated', 'ecommerce', 'advanced'], get jobGroupsClone(): string[] { return [...this.jobGroups, 'clone']; @@ -149,7 +149,7 @@ export default function ({ getService }: FtrProviderContext) { }; const populationJobTestData = { suiteTitle: 'population job', - jobSource: ecIndexPattern, + jobSource: ecIndexName, jobId: `ec_population_1_${Date.now()}`, get jobIdClone(): string { return `${this.jobId}_clone`; @@ -201,12 +201,9 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.loadIfNeeded( 'x-pack/test/functional/es_archives/ml/categorization_small' ); - await ml.testResources.createIndexPatternIfNeeded(fqIndexPattern, '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded(ecIndexPattern, 'order_date'); - await ml.testResources.createIndexPatternIfNeeded( - 'ft_categorization_small', - '@timestamp' - ); + await ml.testResources.createDataViewIfNeeded(fqIndexName, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(ecIndexName, 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_categorization_small', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createAndRunAnomalyDetectionLookbackJob( @@ -238,9 +235,9 @@ export default function ({ getService }: FtrProviderContext) { await ml.api.deleteCalendar(calendarId); await ml.api.deleteFilter(filterId); - await ml.testResources.deleteIndexPatternByTitle(fqIndexPattern); - await ml.testResources.deleteIndexPatternByTitle(ecIndexPattern); - await ml.testResources.deleteIndexPatternByTitle(categorizationIndexPattern); + await ml.testResources.deleteDataViewByTitle(fqIndexName); + await ml.testResources.deleteDataViewByTitle(ecIndexName); + await ml.testResources.deleteDataViewByTitle(categorizationIndexName); await esArchiver.unload('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_sample_ecommerce'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/categorization_small'); @@ -259,7 +256,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('anomaly detection create job select type page', async () => { - await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(fqIndexPattern); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(fqIndexName); await a11y.testAppSnapshot(); }); @@ -308,7 +305,7 @@ export default function ({ getService }: FtrProviderContext) { // as the other steps have already been tested for the single metric job await ml.navigation.navigateToAnomalyDetection(); await ml.jobManagement.navigateToNewJobSourceSelection(); - await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(fqIndexPattern); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(fqIndexName); await ml.jobTypeSelection.selectMultiMetricJob(); await ml.testExecution.logTestStep('job creation set the time range'); await ml.jobWizardCommon.clickUseFullDataButton( @@ -442,7 +439,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToJobManagement(); await ml.jobManagement.navigateToNewJobSourceSelection(); - await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(ecIndexPattern); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(ecIndexName); await ml.testExecution.logTestStep('job creation loads the population job wizard page'); await ml.jobTypeSelection.selectPopulationJob(); @@ -509,9 +506,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToJobManagement(); await ml.jobManagement.navigateToNewJobSourceSelection(); - await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob( - categorizationIndexPattern - ); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(categorizationIndexName); await ml.testExecution.logTestStep( 'job creation loads the categorization job wizard page' @@ -566,7 +561,7 @@ export default function ({ getService }: FtrProviderContext) { it('anomaly detection create job from data recognizer module open wizard', async () => { await ml.navigation.navigateToJobManagement(); await ml.jobManagement.navigateToNewJobSourceSelection(); - await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(ecIndexPattern); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(ecIndexName); await ml.testExecution.logTestStep( `job creation loads the data recognizer job wizard page for the ${adRecognizerJobModuleId} module` ); diff --git a/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts b/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts index 8f8bc67304c0d..71933514de001 100644 --- a/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts +++ b/x-pack/test/accessibility/apps/ml_embeddables_in_dashboard.ts @@ -66,7 +66,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await ml.securityCommon.createMlUsers(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); }); diff --git a/x-pack/test/accessibility/apps/transform.ts b/x-pack/test/accessibility/apps/transform.ts index 9d52571956816..b1228b6c7155a 100644 --- a/x-pack/test/accessibility/apps/transform.ts +++ b/x-pack/test/accessibility/apps/transform.ts @@ -42,7 +42,7 @@ export default function ({ getService }: FtrProviderContext) { }); describe('with data loaded', function () { - const ecIndexPattern = 'ft_ecommerce'; + const ecIndexName = 'ft_ecommerce'; const pivotGroupByEntries = [ { @@ -85,7 +85,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded(ecIndexPattern, 'order_date'); + await transform.testResources.createDataViewIfNeeded(ecIndexName, 'order_date'); await transform.testResources.setKibanaTimeZoneToUTC(); }); @@ -93,9 +93,9 @@ export default function ({ getService }: FtrProviderContext) { await transform.api.cleanTransformIndices(); await transform.api.deleteIndices(pivotTransformDestinationIndex); await transform.api.deleteIndices(latestTransformDestinationIndex); - await transform.testResources.deleteIndexPatternByTitle(pivotTransformDestinationIndex); - await transform.testResources.deleteIndexPatternByTitle(latestTransformDestinationIndex); - await transform.testResources.deleteIndexPatternByTitle(ecIndexPattern); + await transform.testResources.deleteDataViewByTitle(pivotTransformDestinationIndex); + await transform.testResources.deleteDataViewByTitle(latestTransformDestinationIndex); + await transform.testResources.deleteDataViewByTitle(ecIndexName); await esArchiver.unload('x-pack/test/functional/es_archives/ml/ecommerce'); await transform.testResources.resetKibanaTimeZone(); }); @@ -110,7 +110,7 @@ export default function ({ getService }: FtrProviderContext) { await transform.testExecution.logTestStep( 'transform creation selects the source data and loads the Transform wizard page' ); - await transform.sourceSelection.selectSource(ecIndexPattern); + await transform.sourceSelection.selectSource(ecIndexName); await transform.testExecution.logTestStep( `sets the date picker to the default '15 minutes ago'` @@ -201,7 +201,7 @@ export default function ({ getService }: FtrProviderContext) { await transform.testExecution.logTestStep( 'selects the source data and loads the Transform wizard page' ); - await transform.sourceSelection.selectSource(ecIndexPattern); + await transform.sourceSelection.selectSource(ecIndexName); await transform.testExecution.logTestStep( `sets the date picker to the default '15 minutes ago'` diff --git a/x-pack/test/accessibility/config.ts b/x-pack/test/accessibility/config.ts index ece39104293a7..1475b3aeff8af 100644 --- a/x-pack/test/accessibility/config.ts +++ b/x-pack/test/accessibility/config.ts @@ -48,8 +48,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { // CCR tests stay in that order. Their execution fails if rearranged. require.resolve('./apps/remote_clusters'), require.resolve('./apps/snapshot_and_restore'), - // https://github.com/elastic/kibana/issues/153599 - // require.resolve('./apps/cross_cluster_replication'), + require.resolve('./apps/cross_cluster_replication'), require.resolve('./apps/reporting'), require.resolve('./apps/enterprise_search'), // require.resolve('./apps/license_management'), diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts index b38b4b0ee672c..02983a8607c54 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_fired.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import moment from 'moment'; import { cleanup, generate } from '@kbn/infra-forge'; import { @@ -16,7 +15,6 @@ import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/cus import expect from '@kbn/expect'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { createIndexConnector, createRule } from '../helpers/alerting_api_helper'; -import { createDataView, deleteDataView } from '../helpers/data_view'; import { waitForAlertInIndex, waitForDocumentInIndex, @@ -38,8 +36,19 @@ export default function ({ getService }: FtrProviderContext) { // DATE_VIEW should match the index template: // x-pack/packages/kbn-infra-forge/src/data_sources/composable/template.json const DATE_VIEW = 'kbn-data-forge-fake_hosts'; - const DATE_VIEW_NAME = 'data-view-name'; + const DATE_VIEW_NAME = 'ad-hoc-data-view-name'; const DATA_VIEW_ID = 'data-view-id'; + const MOCKED_AD_HOC_DATA_VIEW = { + id: DATA_VIEW_ID, + title: DATE_VIEW, + timeFieldName: '@timestamp', + sourceFilters: [], + fieldFormats: {}, + runtimeFieldMap: {}, + allowNoIndex: false, + name: DATE_VIEW_NAME, + allowHidden: false, + }; let infraDataIndex: string; let actionId: string; let ruleId: string; @@ -48,12 +57,6 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { infraDataIndex = await generate({ esClient, lookback: 'now-15m', logger }); - await createDataView({ - supertest, - name: DATE_VIEW_NAME, - id: DATA_VIEW_ID, - title: DATE_VIEW, - }); }); after(async () => { @@ -67,10 +70,6 @@ export default function ({ getService }: FtrProviderContext) { index: '.kibana-event-log-*', query: { term: { 'kibana.alert.rule.consumer': 'logs' } }, }); - await deleteDataView({ - supertest, - id: DATA_VIEW_ID, - }); await esDeleteAllIndices([ALERT_ACTION_INDEX, infraDataIndex]); await cleanup({ esClient, logger }); }); @@ -92,7 +91,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.5], timeSize: 5, @@ -109,7 +107,7 @@ export default function ({ getService }: FtrProviderContext) { query: '', language: 'kuery', }, - index: DATA_VIEW_ID, + index: MOCKED_AD_HOC_DATA_VIEW, }, }, actions: [ @@ -189,7 +187,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>', threshold: [0.5], timeSize: 5, @@ -199,7 +196,10 @@ export default function ({ getService }: FtrProviderContext) { ], alertOnNoData: true, alertOnGroupDisappear: true, - searchConfiguration: { index: 'data-view-id', query: { query: '', language: 'kuery' } }, + searchConfiguration: { + index: MOCKED_AD_HOC_DATA_VIEW, + query: { query: '', language: 'kuery' }, + }, }); }); diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts index f02eb9568f68b..20320dc99daee 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_pct_no_data.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import moment from 'moment'; import { Aggregators, @@ -85,7 +84,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.5], timeSize: 5, @@ -181,7 +179,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>', threshold: [0.5], timeSize: 5, diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_us_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_us_fired.ts index 9929491ea4e0e..3312c9e600809 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_us_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/avg_us_fired.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import moment from 'moment'; import { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { format } from 'url'; @@ -98,7 +97,7 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, + aggType: 'custom', comparator: Comparator.GT, threshold: [7500000], timeSize: 5, diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts index 71f0a1bed860b..e2b0e84a5cb08 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts @@ -11,7 +11,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import moment from 'moment'; import { cleanup, generate } from '@kbn/infra-forge'; import { @@ -97,7 +96,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.9], timeSize: 1, @@ -195,7 +193,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.9], timeSize: 1, diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts index c2ca213bae98a..a602dc9012850 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/documents_count_fired.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import moment from 'moment'; import { cleanup, generate } from '@kbn/infra-forge'; import { @@ -92,7 +91,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [2], timeSize: 1, @@ -188,7 +186,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>', threshold: [2], timeSize: 1, diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/group_by_fired.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/group_by_fired.ts index 74144e8e7c721..c92971eda4058 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/group_by_fired.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule/group_by_fired.ts @@ -7,7 +7,6 @@ import moment from 'moment'; import { cleanup, generate } from '@kbn/infra-forge'; -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -91,7 +90,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT_OR_EQ, threshold: [0.2], timeSize: 1, @@ -214,7 +212,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>=', threshold: [0.2], timeSize: 1, diff --git a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule_data_view.ts b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule_data_view.ts index 0cbb1044f887e..6071a67023433 100644 --- a/x-pack/test/alerting_api_integration/observability/custom_threshold_rule_data_view.ts +++ b/x-pack/test/alerting_api_integration/observability/custom_threshold_rule_data_view.ts @@ -6,7 +6,6 @@ */ import expect from '@kbn/expect'; -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -74,7 +73,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [7500000], timeSize: 5, diff --git a/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts b/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts index d56b91dda5515..57b5721701a40 100644 --- a/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts +++ b/x-pack/test/alerting_api_integration/observability/helpers/alerting_api_helper.ts @@ -5,8 +5,9 @@ * 2.0. */ -import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; import type { SuperTest, Test } from 'supertest'; +import expect from '@kbn/expect'; +import { ThresholdParams } from '@kbn/observability-plugin/common/custom_threshold_rule/types'; export async function createIndexConnector({ supertest, @@ -64,5 +65,8 @@ export async function createRule({ rule_type_id: ruleTypeId, actions, }); + if (body.statusCode) { + expect(body.statusCode).eql(200, body.message); + } return body; } diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts index 70cdc0f96dfdd..60eb8b6634a35 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts @@ -13,6 +13,8 @@ import { } from '@kbn/actions-simulators-plugin/server/bedrock_simulation'; import { DEFAULT_TOKEN_LIMIT } from '@kbn/stack-connectors-plugin/common/bedrock/constants'; import { PassThrough } from 'stream'; +import { EventStreamCodec } from '@smithy/eventstream-codec'; +import { fromUtf8, toUtf8 } from '@smithy/util-utf8'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { getUrlPrefix, ObjectRemover } from '../../../../../common/lib'; @@ -411,8 +413,6 @@ export default function bedrockTest({ getService }: FtrProviderContext) { it('should invoke stream with assistant AI body argument formatted to bedrock expectations', async () => { await new Promise((resolve, reject) => { - let responseBody: string = ''; - const passThrough = new PassThrough(); supertest @@ -434,13 +434,14 @@ export default function bedrockTest({ getService }: FtrProviderContext) { assistantLangChain: false, }) .pipe(passThrough); - + const responseBuffer: Uint8Array[] = []; passThrough.on('data', (chunk) => { - responseBody += chunk.toString(); + responseBuffer.push(chunk); }); passThrough.on('end', () => { - expect(responseBody).to.eql('Hello world, what a unique string!'); + const parsed = parseBedrockBuffer(responseBuffer); + expect(parsed).to.eql('Hello world, what a unique string!'); resolve(); }); }); @@ -517,3 +518,46 @@ export default function bedrockTest({ getService }: FtrProviderContext) { }); }); } + +const parseBedrockBuffer = (chunks: Uint8Array[]): string => { + let bedrockBuffer: Uint8Array = new Uint8Array(0); + + return chunks + .map((chunk) => { + bedrockBuffer = concatChunks(bedrockBuffer, chunk); + let messageLength = getMessageLength(bedrockBuffer); + const buildChunks = []; + while (bedrockBuffer.byteLength > 0 && bedrockBuffer.byteLength >= messageLength) { + const extractedChunk = bedrockBuffer.slice(0, messageLength); + buildChunks.push(extractedChunk); + bedrockBuffer = bedrockBuffer.slice(messageLength); + messageLength = getMessageLength(bedrockBuffer); + } + + const awsDecoder = new EventStreamCodec(toUtf8, fromUtf8); + + return buildChunks + .map((bChunk) => { + const event = awsDecoder.decode(bChunk); + const body = JSON.parse( + Buffer.from(JSON.parse(new TextDecoder().decode(event.body)).bytes, 'base64').toString() + ); + return body.completion; + }) + .join(''); + }) + .join(''); +}; + +function concatChunks(a: Uint8Array, b: Uint8Array): Uint8Array { + const newBuffer = new Uint8Array(a.length + b.length); + newBuffer.set(a); + newBuffer.set(b, a.length); + return newBuffer; +} + +function getMessageLength(buffer: Uint8Array): number { + if (buffer.byteLength === 0) return 0; + const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength); + return view.getUint32(0, false); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/index.ts index 1a2a69cd95d69..245425e0bbfea 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/index.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/index.ts @@ -38,16 +38,6 @@ export default function alertingTests({ loadTestFile, getService }: FtrProviderC loadTestFile(require.resolve('./unmute_instance')); loadTestFile(require.resolve('./update')); loadTestFile(require.resolve('./update_api_key')); - loadTestFile(require.resolve('./alerts')); - loadTestFile(require.resolve('./event_log')); - loadTestFile(require.resolve('./mustache_templates')); - loadTestFile(require.resolve('./health')); - loadTestFile(require.resolve('./excluded')); - loadTestFile(require.resolve('./snooze')); - loadTestFile(require.resolve('./unsnooze')); - loadTestFile(require.resolve('./global_execution_log')); - loadTestFile(require.resolve('./get_global_execution_kpi')); - loadTestFile(require.resolve('./get_action_error_log')); }); }); } diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts index cf0e2a3dcf6a7..05a16cf992848 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/create_maintenance_window.ts @@ -25,6 +25,32 @@ export default function createMaintenanceWindowTests({ getService }: FtrProvider tzid: 'UTC', freq: 2, // weekly }, + scoped_query: { + kql: "_id: '1234'", + filters: [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'kibana.alert.action_group', + field: 'kibana.alert.action_group', + params: { + query: 'test', + }, + type: 'phrase', + }, + $state: { + store: 'appState', + }, + query: { + match_phrase: { + 'kibana.alert.action_group': 'test', + }, + }, + }, + ], + }, }; afterEach(() => objectRemover.removeAll()); @@ -69,6 +95,7 @@ export default function createMaintenanceWindowTests({ getService }: FtrProvider expect(response.body.r_rule.dtstart).to.eql(createParams.r_rule.dtstart); expect(response.body.events.length).to.be.greaterThan(0); expect(response.body.status).to.eql('running'); + expect(response.body.scoped_query.kql).to.eql("_id: '1234'"); break; default: throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); @@ -102,5 +129,19 @@ export default function createMaintenanceWindowTests({ getService }: FtrProvider }) .expect(400); }); + + it('should throw if creating maintenance window with invalid scoped query', async () => { + await supertest + .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) + .set('kbn-xsrf', 'foo') + .send({ + ...createParams, + scoped_query: { + kql: 'invalid_kql:', + filters: [], + }, + }) + .expect(400); + }); }); } diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts index c5d38a1c2a056..8d26f316cb840 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/maintenance_window/update_maintenance_window.ts @@ -16,6 +16,33 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider const supertest = getService('supertest'); const supertestWithoutAuth = getService('supertestWithoutAuth'); + const scopedQuery = { + kql: "_id: '1234'", + filters: [ + { + meta: { + disabled: false, + negate: false, + alias: null, + key: 'kibana.alert.action_group', + field: 'kibana.alert.action_group', + params: { + query: 'test', + }, + type: 'phrase', + }, + $state: { + store: 'appState', + }, + query: { + match_phrase: { + 'kibana.alert.action_group': 'test', + }, + }, + }, + ], + }; + describe('updateMaintenanceWindow', () => { const objectRemover = new ObjectRemover(supertest); const createParams = { @@ -26,6 +53,7 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider tzid: 'UTC', freq: 2, // weekly }, + scoped_query: scopedQuery, }; afterEach(() => objectRemover.removeAll()); @@ -82,6 +110,7 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider expect(response.body.r_rule.dtstart).to.eql(createParams.r_rule.dtstart); expect(response.body.events.length).to.be.greaterThan(0); expect(response.body.status).to.eql('running'); + expect(response.body.scoped_query.kql).to.eql("_id: '1234'"); break; default: throw new Error(`Scenario untested: ${JSON.stringify(scenario)}`); @@ -156,6 +185,7 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider until: moment.utc().add(1, 'week').toISOString(), }, category_ids: ['management'], + scoped_query: scopedQuery, }) .expect(200); @@ -183,6 +213,7 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider ...createParams, r_rule: updatedRRule, category_ids: null, + scoped_query: null, }) .expect(200); @@ -194,6 +225,7 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider expect(response.body.data[0].id).to.eql(createdMaintenanceWindow.id); expect(response.body.data[0].r_rule).to.eql(updatedRRule); expect(response.body.data[0].category_ids).to.eql(null); + expect(response.body.data[0].scoped_query).to.eql(null); }); it('should throw if updating maintenance window with invalid category ids', async () => { @@ -230,5 +262,46 @@ export default function updateMaintenanceWindowTests({ getService }: FtrProvider .send({ category_ids: ['something-else'] }) .expect(400); }); + + it('should throw if updating maintenance window with invalid scoped query', async () => { + const { body: createdMaintenanceWindow } = await supertest + .post(`${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window`) + .set('kbn-xsrf', 'foo') + .send({ + title: 'test-maintenance-window', + duration: 60 * 60 * 1000, // 1 hr + r_rule: { + dtstart: new Date().toISOString(), + tzid: 'UTC', + freq: 2, // weekly + count: 1, + }, + scoped_query: scopedQuery, + }) + .expect(200); + + objectRemover.add( + 'space1', + createdMaintenanceWindow.id, + 'rules/maintenance_window', + 'alerting', + true + ); + + await supertest + .post( + `${getUrlPrefix('space1')}/internal/alerting/rules/maintenance_window/${ + createdMaintenanceWindow.id + }` + ) + .set('kbn-xsrf', 'foo') + .send({ + scoped_query: { + kql: 'invalid_kql:', + filters: [], + }, + }) + .expect(400); + }); }); } diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group4/config.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/config.ts new file mode 100644 index 0000000000000..f999da061b90b --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group4/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 { createTestConfig } from '../../common/config'; + +// eslint-disable-next-line import/no-default-export +export default createTestConfig('security_and_spaces', { + disabledPlugins: [], + license: 'trial', + ssl: true, + enableActionsProxy: true, + publicBaseUrl: true, + testFiles: [require.resolve('./tests')], + useDedicatedTaskRunner: true, +}); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group4/config_non_dedicated_task_runner.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/config_non_dedicated_task_runner.ts new file mode 100644 index 0000000000000..7aed7501bc012 --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group4/config_non_dedicated_task_runner.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 { createTestConfig } from '../../common/config'; + +// eslint-disable-next-line import/no-default-export +export default createTestConfig('security_and_spaces', { + disabledPlugins: [], + license: 'trial', + ssl: true, + enableActionsProxy: true, + publicBaseUrl: true, + testFiles: [require.resolve('./tests')], + useDedicatedTaskRunner: false, +}); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/alerts.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/alerts.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/event_log.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/event_log.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/event_log.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/event_log.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/excluded.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/excluded.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/excluded.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/excluded.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/get_action_error_log.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/get_action_error_log.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/get_action_error_log.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/get_action_error_log.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/get_global_execution_kpi.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/get_global_execution_kpi.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/get_global_execution_kpi.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/get_global_execution_kpi.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/get_rule_execution_kpi.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/get_rule_execution_kpi.ts similarity index 97% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/get_rule_execution_kpi.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/get_rule_execution_kpi.ts index 2303fc616d8dc..3eb6a8c61d00a 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/get_rule_execution_kpi.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/get_rule_execution_kpi.ts @@ -17,7 +17,8 @@ export default function getRuleExecutionKpiTests({ getService }: FtrProviderCont const retry = getService('retry'); - describe('getRuleExecutionKpi', () => { + // failing on CI, this file wasn't loaded in any config + describe.skip('getRuleExecutionKpi', () => { const objectRemover = new ObjectRemover(supertest); after(() => objectRemover.removeAll()); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/global_execution_log.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/global_execution_log.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/global_execution_log.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/global_execution_log.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/health.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/health.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/health.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/health.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/index.ts new file mode 100644 index 0000000000000..8eb5a0c2006be --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/index.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; +import { setupSpacesAndUsers, tearDown } from '../../../setup'; + +// eslint-disable-next-line import/no-default-export +export default function alertingTests({ loadTestFile, getService }: FtrProviderContext) { + describe('Alerts', () => { + describe('alerts', () => { + before(async () => { + await setupSpacesAndUsers(getService); + }); + + after(async () => { + await tearDown(getService); + }); + + loadTestFile(require.resolve('./alerts')); + loadTestFile(require.resolve('./event_log')); + loadTestFile(require.resolve('./mustache_templates')); + loadTestFile(require.resolve('./health')); + loadTestFile(require.resolve('./excluded')); + loadTestFile(require.resolve('./snooze')); + loadTestFile(require.resolve('./unsnooze')); + loadTestFile(require.resolve('./global_execution_log')); + loadTestFile(require.resolve('./get_global_execution_kpi')); + loadTestFile(require.resolve('./get_action_error_log')); + loadTestFile(require.resolve('./get_rule_execution_kpi')); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/mustache_templates.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/mustache_templates.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/mustache_templates.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/mustache_templates.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/snooze.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/snooze.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/snooze.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/snooze.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/unsnooze.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/unsnooze.ts similarity index 100% rename from x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/alerting/unsnooze.ts rename to x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/unsnooze.ts diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/index.ts new file mode 100644 index 0000000000000..3fa3bbd08789a --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function alertingApiIntegrationTests({ loadTestFile }: FtrProviderContext) { + describe('alerting api integration security and spaces enabled - Group 4', function () { + loadTestFile(require.resolve('./alerting')); + }); +} diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/index.ts b/x-pack/test/api_integration/apis/asset_manager/tests/index.ts index e2ea53990b216..12274a3fc6ab0 100644 --- a/x-pack/test/api_integration/apis/asset_manager/tests/index.ts +++ b/x-pack/test/api_integration/apis/asset_manager/tests/index.ts @@ -12,6 +12,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./containers')); loadTestFile(require.resolve('./hosts')); loadTestFile(require.resolve('./services')); + loadTestFile(require.resolve('./pods')); loadTestFile(require.resolve('./sample_assets')); }); } diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/pods.ts b/x-pack/test/api_integration/apis/asset_manager/tests/pods.ts new file mode 100644 index 0000000000000..eb88049b6511f --- /dev/null +++ b/x-pack/test/api_integration/apis/asset_manager/tests/pods.ts @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { timerange, infra } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; +import { Asset } from '@kbn/assetManager-plugin/common/types_api'; +import * as routePaths from '@kbn/assetManager-plugin/common/constants_routes'; +import { FtrProviderContext } from '../types'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const synthtrace = getService('infraSynthtraceEsClient'); + + describe(`GET ${routePaths.GET_PODS}`, () => { + const from = new Date(Date.now() - 1000 * 60 * 2).toISOString(); + const to = new Date().toISOString(); + + beforeEach(async () => { + await synthtrace.clean(); + }); + + it('should return pod assets', async () => { + await synthtrace.index(generatePodsData({ from, to, count: 5 })); + + const response = await supertest + .get(routePaths.GET_PODS) + .query({ + from, + to, + }) + .expect(200); + + expect(response.body).to.have.property('pods'); + expect(response.body.pods.length).to.equal(5); + }); + + it('should return a specific pod asset by EAN', async () => { + await synthtrace.index(generatePodsData({ from, to, count: 5 })); + const testEan = 'pod:pod-uid-1'; + + const response = await supertest + .get(routePaths.GET_PODS) + .query({ + from, + to, + stringFilters: JSON.stringify({ ean: testEan }), + }) + .expect(200); + + expect(response.body).to.have.property('pods'); + expect(response.body.pods.length).to.equal(1); + expect(response.body.pods[0]['asset.ean']).to.equal(testEan); + }); + + it('should return a filtered list of pods assets by ID wildcard pattern', async () => { + await synthtrace.index(generatePodsData({ from, to, count: 15 })); + const testIdPattern = '*id-1*'; + + const response = await supertest + .get(routePaths.GET_PODS) + .query({ + from, + to, + stringFilters: JSON.stringify({ id: testIdPattern }), + }) + .expect(200); + + expect(response.body).to.have.property('pods'); + expect(response.body.pods.length).to.equal(6); + + const ids = response.body.pods.map((result: Asset) => result['asset.id'][0]); + + expect(ids).to.eql([ + 'pod-uid-1', + 'pod-uid-10', + 'pod-uid-11', + 'pod-uid-12', + 'pod-uid-13', + 'pod-uid-14', + ]); + }); + }); +} + +function generatePodsData({ from, to, count = 1 }: { from: string; to: string; count: number }) { + const range = timerange(from, to); + + const pods = Array(count) + .fill(0) + .map((_, idx) => infra.pod(`pod-uid-${idx}`, `node-name-${idx}`)); + + return range + .interval('1m') + .rate(1) + .generator((timestamp) => pods.map((pod) => pod.metrics().timestamp(timestamp))); +} diff --git a/x-pack/test/api_integration/apis/cloud_security_posture/mock_data.ts b/x-pack/test/api_integration/apis/cloud_security_posture/mock_data.ts index 4ebfacb4d10c9..b4daf5172b164 100644 --- a/x-pack/test/api_integration/apis/cloud_security_posture/mock_data.ts +++ b/x-pack/test/api_integration/apis/cloud_security_posture/mock_data.ts @@ -24,6 +24,10 @@ export const findingsMockData = [ type: 'process', }, cluster_id: 'Upper case cluster id', + event: { + ingested: '2023-08-19T18:20:41Z', + created: '2023-08-19T18:17:15.609124281Z', + }, }, { resource: { id: chance.guid(), name: `Pod`, sub_type: 'Upper case sub type' }, @@ -40,6 +44,10 @@ export const findingsMockData = [ type: 'process', }, cluster_id: 'Another Upper case cluster id', + event: { + ingested: '2023-08-19T18:20:41Z', + created: '2023-08-19T18:17:15.609124281Z', + }, }, ]; diff --git a/x-pack/test/api_integration/apis/cloud_security_posture/status/status_unprivileged.ts b/x-pack/test/api_integration/apis/cloud_security_posture/status/status_unprivileged.ts index 6a3f8fbbfeda5..06f80adf46034 100644 --- a/x-pack/test/api_integration/apis/cloud_security_posture/status/status_unprivileged.ts +++ b/x-pack/test/api_integration/apis/cloud_security_posture/status/status_unprivileged.ts @@ -247,8 +247,8 @@ export default function (providerContext: FtrProviderContext) { `expected unprivileged but got ${res.cspm.status} instead` ); expect(res.vuln_mgmt.status).to.eql( - 'not-installed', - `expected not-installed but got ${res.vuln_mgmt.status} instead` + 'unprivileged', + `expected unprivileged but got ${res.vuln_mgmt.status} instead` ); assertIndexStatus(res.indicesDetails, LATEST_FINDINGS_INDEX_DEFAULT_NS, 'unprivileged'); diff --git a/x-pack/test/api_integration/apis/management/index_management/indices.helpers.js b/x-pack/test/api_integration/apis/management/index_management/indices.helpers.js deleted file mode 100644 index 368272858ea2c..0000000000000 --- a/x-pack/test/api_integration/apis/management/index_management/indices.helpers.js +++ /dev/null @@ -1,53 +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 { API_BASE_PATH } from './constants'; - -export const registerHelpers = ({ supertest }) => { - const executeActionOnIndices = (index, urlParam, args) => { - const indices = Array.isArray(index) ? index : [index]; - - return supertest - .post(`${API_BASE_PATH}/indices/${urlParam}`) - .set('kbn-xsrf', 'xxx') - .send({ indices, ...args }); - }; - - const closeIndex = (index) => executeActionOnIndices(index, 'close'); - - const openIndex = (index) => executeActionOnIndices(index, 'open'); - - const deleteIndex = (index) => executeActionOnIndices(index, 'delete'); - - const flushIndex = (index) => executeActionOnIndices(index, 'flush'); - - const refreshIndex = (index) => executeActionOnIndices(index, 'refresh'); - - const forceMerge = (index, args) => executeActionOnIndices(index, 'forcemerge', args); - - const unfreeze = (index) => executeActionOnIndices(index, 'unfreeze'); - - const clearCache = (index) => executeActionOnIndices(index, 'clear_cache'); - - const list = () => supertest.get(`${API_BASE_PATH}/indices`); - - const reload = (indexNames) => - supertest.post(`${API_BASE_PATH}/indices/reload`).set('kbn-xsrf', 'xxx').send({ indexNames }); - - return { - closeIndex, - openIndex, - deleteIndex, - flushIndex, - refreshIndex, - forceMerge, - unfreeze, - list, - reload, - clearCache, - }; -}; diff --git a/x-pack/test/api_integration/apis/management/index_management/indices.js b/x-pack/test/api_integration/apis/management/index_management/indices.ts similarity index 75% rename from x-pack/test/api_integration/apis/management/index_management/indices.js rename to x-pack/test/api_integration/apis/management/index_management/indices.ts index 8d012f7a02d41..aa2ff5966c4df 100644 --- a/x-pack/test/api_integration/apis/management/index_management/indices.js +++ b/x-pack/test/api_integration/apis/management/index_management/indices.ts @@ -7,19 +7,13 @@ import expect from '@kbn/expect'; -import { initElasticsearchHelpers } from './lib'; -import { registerHelpers } from './indices.helpers'; import { sortedExpectedIndexKeys } from './constants'; +import { indicesApi } from './lib/indices.api'; +import { indicesHelpers } from './lib/indices.helpers'; +import { FtrProviderContext } from '../../../ftr_provider_context'; -export default function ({ getService }) { - const supertest = getService('supertest'); - - const { - createIndex, - catIndex, - indexStats, - cleanUp: cleanUpEsResources, - } = initElasticsearchHelpers(getService); +export default function ({ getService }: FtrProviderContext) { + const { createIndex, deleteAllIndices, catIndex, indexStats } = indicesHelpers(getService); const { closeIndex, @@ -32,10 +26,10 @@ export default function ({ getService }) { list, reload, clearCache, - } = registerHelpers({ supertest }); + } = indicesApi(getService); describe('indices', () => { - after(() => Promise.all([cleanUpEsResources()])); + after(async () => await deleteAllIndices()); describe('clear cache', () => { it('should clear the cache on a single index', async () => { @@ -45,9 +39,6 @@ export default function ({ getService }) { }); describe('close', function () { - // The Cloud backend disallows users from closing indices. - this.tags(['skipCloud']); - it('should close an index', async () => { const index = await createIndex(); @@ -68,10 +59,6 @@ export default function ({ getService }) { }); describe('open', function () { - // The Cloud backend disallows users from closing indices, so there's no point testing - // the open behavior. - this.tags(['skipCloud']); - it('should open an index', async () => { const index = await createIndex(); @@ -98,12 +85,12 @@ export default function ({ getService }) { const index = await createIndex(); const { body: indices1 } = await catIndex(undefined, 'i'); - expect(indices1.map((index) => index.i)).to.contain(index); + expect(indices1.map((indexItem) => indexItem.i)).to.contain(index); - await deleteIndex([index]).expect(200); + await deleteIndex(index).expect(200); const { body: indices2 } = await catIndex(undefined, 'i'); - expect(indices2.map((index) => index.i)).not.to.contain(index); + expect(indices2.map((indexItem) => indexItem.i)).not.to.contain(index); }); it('should require index or indices to be provided', async () => { @@ -119,6 +106,7 @@ export default function ({ getService }) { const { body: { indices: indices1 }, } = await indexStats(index, 'flush'); + // @ts-ignore expect(indices1[index].total.flush.total).to.be(0); await flushIndex(index).expect(200); @@ -126,6 +114,7 @@ export default function ({ getService }) { const { body: { indices: indices2 }, } = await indexStats(index, 'flush'); + // @ts-ignore expect(indices2[index].total.flush.total).to.be(1); }); }); @@ -137,6 +126,7 @@ export default function ({ getService }) { const { body: { indices: indices1 }, } = await indexStats(index, 'refresh'); + // @ts-ignore const previousRefreshes = indices1[index].total.refresh.total; await refreshIndex(index).expect(200); @@ -144,6 +134,7 @@ export default function ({ getService }) { const { body: { indices: indices2 }, } = await indexStats(index, 'refresh'); + // @ts-ignore expect(indices2[index].total.refresh.total).to.be(previousRefreshes + 1); }); }); @@ -175,8 +166,6 @@ export default function ({ getService }) { }); describe('list', function () { - this.tags(['skipCloud']); - it('should list all the indices with the expected properties and data enrichers', async function () { // Create an index that we can assert against await createIndex('test_index'); @@ -185,7 +174,7 @@ export default function ({ getService }) { const { body: indices } = await list().expect(200); // Find the "test_index" created to verify expected keys - const indexCreated = indices.find((index) => index.name === 'test_index'); + const indexCreated = indices.find((index: { name: string }) => index.name === 'test_index'); const sortedReceivedKeys = Object.keys(indexCreated).sort(); @@ -194,19 +183,17 @@ export default function ({ getService }) { }); describe('reload', function () { - describe('(not on Cloud)', function () { - this.tags(['skipCloud']); - - it('should list all the indices with the expected properties and data enrichers', async function () { - // create an index to assert against, otherwise the test is flaky - await createIndex('reload-test-index'); - const { body } = await reload().expect(200); - - const indexCreated = body.find((index) => index.name === 'reload-test-index'); - const sortedReceivedKeys = Object.keys(indexCreated).sort(); - expect(sortedReceivedKeys).to.eql(sortedExpectedIndexKeys); - expect(body.length > 1).to.be(true); // to contrast it with the next test - }); + it('should list all the indices with the expected properties and data enrichers', async function () { + // create an index to assert against, otherwise the test is flaky + await createIndex('reload-test-index'); + const { body } = await reload().expect(200); + + const indexCreated = body.find( + (index: { name: string }) => index.name === 'reload-test-index' + ); + const sortedReceivedKeys = Object.keys(indexCreated).sort(); + expect(sortedReceivedKeys).to.eql(sortedExpectedIndexKeys); + expect(body.length > 1).to.be(true); // to contrast it with the next test }); it('should allow reloading only certain indices', async () => { diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js index d71085439e868..606fe5a3d8b89 100644 --- a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js +++ b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js @@ -5,8 +5,6 @@ * 2.0. */ -import { getRandomString } from './random'; - /** * Helpers to create and delete indices on the Elasticsearch instance * during our tests. @@ -14,9 +12,7 @@ import { getRandomString } from './random'; */ export const initElasticsearchHelpers = (getService) => { const es = getService('es'); - const esDeleteAllIndices = getService('esDeleteAllIndices'); - let indicesCreated = []; let datastreamCreated = []; let indexTemplatesCreated = []; let componentTemplatesCreated = []; @@ -40,22 +36,6 @@ export const initElasticsearchHelpers = (getService) => { console.log(`[Cleanup error] Error deleting ES resources: ${err.message}`); }); - const createIndex = (index = getRandomString(), body) => { - indicesCreated.push(index); - return es.indices.create({ index, body }).then(() => index); - }; - - const deleteAllIndices = async () => { - await esDeleteAllIndices(indicesCreated); - indicesCreated = []; - }; - - const catIndex = (index, h) => es.cat.indices({ index, format: 'json', h }, { meta: true }); - - const indexStats = (index, metric) => es.indices.stats({ index, metric }, { meta: true }); - - const cleanUp = () => deleteAllIndices(); - const catTemplate = (name) => es.cat.templates({ name, format: 'json' }, { meta: true }); const createIndexTemplate = (indexTemplate, shouldCacheTemplate) => { @@ -103,14 +83,9 @@ export const initElasticsearchHelpers = (getService) => { }); return { - createIndex, - deleteAllIndices, - catIndex, - indexStats, createDatastream, deleteDatastream, cleanupDatastreams, - cleanUp, catTemplate, createIndexTemplate, deleteIndexTemplate, diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/indices.api.ts b/x-pack/test/api_integration/apis/management/index_management/lib/indices.api.ts new file mode 100644 index 0000000000000..d75d3ec0527b6 --- /dev/null +++ b/x-pack/test/api_integration/apis/management/index_management/lib/indices.api.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { API_BASE_PATH } from '../constants'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export function indicesApi(getService: FtrProviderContext['getService']) { + const supertest = getService('supertest'); + const executeActionOnIndices = ({ + index, + urlParam, + args, + }: { + index?: string | string[]; + urlParam: string; + args?: any; + }) => { + const indices = Array.isArray(index) ? index : [index]; + + return supertest + .post(`${API_BASE_PATH}/indices/${urlParam}`) + .set('kbn-xsrf', 'xxx') + .send({ indices, ...args }); + }; + + const closeIndex = (index: string) => executeActionOnIndices({ index, urlParam: 'close' }); + + const openIndex = (index: string) => executeActionOnIndices({ index, urlParam: 'open' }); + + const deleteIndex = (index?: string) => executeActionOnIndices({ index, urlParam: 'delete' }); + + const flushIndex = (index: string) => executeActionOnIndices({ index, urlParam: 'flush' }); + + const refreshIndex = (index: string) => executeActionOnIndices({ index, urlParam: 'refresh' }); + + const forceMerge = (index: string, args?: { maxNumSegments: number }) => + executeActionOnIndices({ index, urlParam: 'forcemerge', args }); + + const unfreeze = (index: string) => executeActionOnIndices({ index, urlParam: 'unfreeze' }); + + const clearCache = (index: string) => executeActionOnIndices({ index, urlParam: 'clear_cache' }); + + const list = () => supertest.get(`${API_BASE_PATH}/indices`); + + const reload = (indexNames?: string[]) => + supertest.post(`${API_BASE_PATH}/indices/reload`).set('kbn-xsrf', 'xxx').send({ indexNames }); + + return { + closeIndex, + openIndex, + deleteIndex, + flushIndex, + refreshIndex, + forceMerge, + unfreeze, + list, + reload, + clearCache, + }; +} diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/indices.helpers.ts b/x-pack/test/api_integration/apis/management/index_management/lib/indices.helpers.ts new file mode 100644 index 0000000000000..139e813d84ffe --- /dev/null +++ b/x-pack/test/api_integration/apis/management/index_management/lib/indices.helpers.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getRandomString } from './random'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export function indicesHelpers(getService: FtrProviderContext['getService']) { + const es = getService('es'); + const esDeleteAllIndices = getService('esDeleteAllIndices'); + + let indicesCreated: string[] = []; + + const createIndex = async (index: string = getRandomString(), mappings?: any) => { + indicesCreated.push(index); + await es.indices.create({ index, mappings }); + return index; + }; + + const deleteAllIndices = async () => { + await esDeleteAllIndices(indicesCreated); + indicesCreated = []; + }; + + const catIndex = (index?: string, h?: any) => + es.cat.indices({ index, format: 'json', h }, { meta: true }); + + const indexStats = (index: string, metric: string) => + es.indices.stats({ index, metric }, { meta: true }); + + return { createIndex, deleteAllIndices, catIndex, indexStats }; +} diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/mappings.api.ts b/x-pack/test/api_integration/apis/management/index_management/lib/mappings.api.ts new file mode 100644 index 0000000000000..f032f2893e318 --- /dev/null +++ b/x-pack/test/api_integration/apis/management/index_management/lib/mappings.api.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 { API_BASE_PATH } from '../constants'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export function mappingsApi(getService: FtrProviderContext['getService']) { + const supertest = getService('supertest'); + + const getMapping = (index: string) => + supertest + .get(`${API_BASE_PATH}/mapping/${index}`) + .set('kbn-xsrf', 'xxx') + .set('x-elastic-internal-origin', 'xxx'); + + return { + getMapping, + }; +} diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/random.js b/x-pack/test/api_integration/apis/management/index_management/lib/random.ts similarity index 100% rename from x-pack/test/api_integration/apis/management/index_management/lib/random.js rename to x-pack/test/api_integration/apis/management/index_management/lib/random.ts diff --git a/x-pack/test/api_integration/apis/management/index_management/mapping.js b/x-pack/test/api_integration/apis/management/index_management/mapping.js deleted file mode 100644 index c18bc4c163526..0000000000000 --- a/x-pack/test/api_integration/apis/management/index_management/mapping.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import expect from '@kbn/expect'; - -import { initElasticsearchHelpers } from './lib'; -import { registerHelpers } from './mapping.helpers'; - -export default function ({ getService }) { - const supertest = getService('supertest'); - - const { createIndex, cleanUp: cleanUpEsResources } = initElasticsearchHelpers(getService); - - const { getIndexMapping } = registerHelpers({ supertest }); - - describe('mapping', () => { - after(() => Promise.all([cleanUpEsResources()])); - - it('should fetch the index mapping', async () => { - const mappings = { - properties: { - total: { type: 'long' }, - tag: { type: 'keyword' }, - createdAt: { type: 'date' }, - }, - }; - const index = await createIndex(undefined, { mappings }); - - const { body } = await getIndexMapping(index).expect(200); - - expect(body.mappings).to.eql(mappings); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/management/index_management/mapping.ts b/x-pack/test/api_integration/apis/management/index_management/mapping.ts new file mode 100644 index 0000000000000..5e3ebea13adc6 --- /dev/null +++ b/x-pack/test/api_integration/apis/management/index_management/mapping.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { mappingsApi } from './lib/mappings.api'; +import { indicesHelpers } from './lib/indices.helpers'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const log = getService('log'); + + const { getMapping } = mappingsApi(getService); + const { createIndex, deleteAllIndices } = indicesHelpers(getService); + + describe('mappings', () => { + let indexName: string; + + const mappings = { + properties: { + total: { type: 'long' }, + tag: { type: 'keyword' }, + createdAt: { type: 'date' }, + }, + }; + + after(async () => await deleteAllIndices()); + + before(async () => { + log.debug('Creating index'); + try { + indexName = await createIndex(undefined, mappings); + } catch (err) { + log.debug('[Setup error] Error creating index'); + throw err; + } + }); + + after(async () => { + try { + await deleteAllIndices(); + } catch (err) { + log.debug('[Cleanup error] Error deleting index'); + throw err; + } + }); + + it('should get the index mappings', async () => { + const { body } = await getMapping(indexName).expect(200); + + expect(body.mappings).to.eql(mappings); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/management/index_management/settings.js b/x-pack/test/api_integration/apis/management/index_management/settings.js index 44ee80aaec7a2..fbffc203cff58 100644 --- a/x-pack/test/api_integration/apis/management/index_management/settings.js +++ b/x-pack/test/api_integration/apis/management/index_management/settings.js @@ -7,18 +7,18 @@ import expect from '@kbn/expect'; -import { initElasticsearchHelpers } from './lib'; +import { indicesHelpers } from './lib/indices.helpers'; import { registerHelpers } from './settings.helpers'; export default function ({ getService }) { const supertest = getService('supertest'); - const { createIndex, cleanUp: cleanUpEsResources } = initElasticsearchHelpers(getService); + const { createIndex, deleteAllIndices } = indicesHelpers(getService); const { getIndexSettings, updateIndexSettings } = registerHelpers({ supertest }); describe('settings', () => { - after(() => Promise.all([cleanUpEsResources()])); + after(async () => await deleteAllIndices()); it('should fetch an index settings', async () => { const index = await createIndex(); diff --git a/x-pack/test/api_integration/apis/management/index_management/stats.js b/x-pack/test/api_integration/apis/management/index_management/stats.js index c673f10461715..782b32a787323 100644 --- a/x-pack/test/api_integration/apis/management/index_management/stats.js +++ b/x-pack/test/api_integration/apis/management/index_management/stats.js @@ -7,18 +7,18 @@ import expect from '@kbn/expect'; -import { initElasticsearchHelpers } from './lib'; +import { indicesHelpers } from './lib/indices.helpers'; import { registerHelpers } from './stats.helpers'; export default function ({ getService }) { const supertest = getService('supertest'); - const { createIndex, cleanUp: cleanUpEsResources } = initElasticsearchHelpers(getService); + const { createIndex, deleteAllIndices } = indicesHelpers(getService); const { getIndexStats } = registerHelpers({ supertest }); describe('stats', () => { - after(() => Promise.all([cleanUpEsResources()])); + after(async () => await deleteAllIndices()); it('should fetch the index stats', async () => { const index = await createIndex(); diff --git a/x-pack/test/api_integration/apis/management/index_management/templates.js b/x-pack/test/api_integration/apis/management/index_management/templates.js index bb4007852b037..4882ecccf6346 100644 --- a/x-pack/test/api_integration/apis/management/index_management/templates.js +++ b/x-pack/test/api_integration/apis/management/index_management/templates.js @@ -13,7 +13,7 @@ import { registerHelpers } from './templates.helpers'; export default function ({ getService }) { const supertest = getService('supertest'); - const { cleanUp: cleanUpEsResources, catTemplate } = initElasticsearchHelpers(getService); + const { catTemplate } = initElasticsearchHelpers(getService); const { getAllTemplates, @@ -27,7 +27,7 @@ export default function ({ getService }) { // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/170980 describe.skip('index templates', () => { - after(() => Promise.all([cleanUpEsResources(), cleanUpTemplates()])); + after(async () => await cleanUpTemplates()); describe('get all', () => { const indexTemplate = getTemplatePayload(`template-${getRandomString()}`, [ diff --git a/x-pack/test/api_integration/apis/maps/migrations.js b/x-pack/test/api_integration/apis/maps/migrations.js index 1295dac5bbb49..30301a80577b3 100644 --- a/x-pack/test/api_integration/apis/maps/migrations.js +++ b/x-pack/test/api_integration/apis/maps/migrations.js @@ -75,7 +75,7 @@ export default function ({ getService }) { try { panels = JSON.parse(resp.body.attributes.panelsJSON); } catch (error) { - throw 'Unable to parse panelsJSON from dashboard saved object'; + throw new Error('Unable to parse panelsJSON from dashboard saved object'); } expect(panels.length).to.be(1); expect(panels[0].type).to.be('map'); diff --git a/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts b/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts index f0e69eddb9811..f7e3d16666342 100644 --- a/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts +++ b/x-pack/test/api_integration/apis/ml/data_frame_analytics/delete.ts @@ -42,8 +42,8 @@ export default ({ getService }: FtrProviderContext) => { const testJobConfigs: Array> = [ 'Test delete job only', 'Test delete job and target index', - 'Test delete job and index pattern', - 'Test delete job, target index, and index pattern', + 'Test delete job and data view', + 'Test delete job, target index, and data view', ].map((description, idx) => { const analyticsId = `${jobId}_${idx + 1}`; return { @@ -148,71 +148,71 @@ export default ({ getService }: FtrProviderContext) => { expect(body.analyticsJobDeleted.success).to.eql(true); expect(body.destIndexDeleted.success).to.eql(true); - expect(body.destIndexPatternDeleted.success).to.eql(false); + expect(body.destDataViewDeleted.success).to.eql(false); await ml.api.waitForDataFrameAnalyticsJobNotToExist(analyticsId); await ml.api.assertIndicesNotToExist(destinationIndex); }); }); - describe('with deleteDestIndexPattern setting', function () { + describe('with deleteDestDataView setting', function () { const analyticsId = `${jobId}_3`; const destinationIndex = generateDestinationIndex(analyticsId); before(async () => { - // Mimic real job by creating index pattern after job is created - await ml.testResources.createIndexPatternIfNeeded(destinationIndex); + // Mimic real job by creating data view after job is created + await ml.testResources.createDataViewIfNeeded(destinationIndex); }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle(destinationIndex); + await ml.testResources.deleteDataViewByTitle(destinationIndex); }); - it('should delete job and index pattern by id', async () => { + it('should delete job and data view by id', async () => { const { body, status } = await supertest .delete(`/internal/ml/data_frame/analytics/${analyticsId}`) - .query({ deleteDestIndexPattern: true }) + .query({ deleteDestDataView: true }) .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) .set(getCommonRequestHeader('1')); ml.api.assertResponseStatusCode(200, status, body); expect(body.analyticsJobDeleted.success).to.eql(true); expect(body.destIndexDeleted.success).to.eql(false); - expect(body.destIndexPatternDeleted.success).to.eql(true); + expect(body.destDataViewDeleted.success).to.eql(true); await ml.api.waitForDataFrameAnalyticsJobNotToExist(analyticsId); - await ml.testResources.assertIndexPatternNotExist(destinationIndex); + await ml.testResources.assertDataViewNotExist(destinationIndex); }); }); - describe('with deleteDestIndex & deleteDestIndexPattern setting', function () { + describe('with deleteDestIndex & deleteDestDataView setting', function () { const analyticsId = `${jobId}_4`; const destinationIndex = generateDestinationIndex(analyticsId); before(async () => { - // Mimic real job by creating target index & index pattern after DFA job is created + // Mimic real job by creating target index & data view after DFA job is created await ml.api.createIndex(destinationIndex); await ml.api.assertIndicesExist(destinationIndex); - await ml.testResources.createIndexPatternIfNeeded(destinationIndex); + await ml.testResources.createDataViewIfNeeded(destinationIndex); }); after(async () => { await ml.api.deleteIndices(destinationIndex); - await ml.testResources.deleteIndexPatternByTitle(destinationIndex); + await ml.testResources.deleteDataViewByTitle(destinationIndex); }); - it('should delete job, target index, and index pattern by id', async () => { + it('should delete job, target index, and data view by id', async () => { const { body, status } = await supertest .delete(`/internal/ml/data_frame/analytics/${analyticsId}`) - .query({ deleteDestIndex: true, deleteDestIndexPattern: true }) + .query({ deleteDestIndex: true, deleteDestDataView: true }) .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) .set(getCommonRequestHeader('1')); ml.api.assertResponseStatusCode(200, status, body); expect(body.analyticsJobDeleted.success).to.eql(true); expect(body.destIndexDeleted.success).to.eql(true); - expect(body.destIndexPatternDeleted.success).to.eql(true); + expect(body.destDataViewDeleted.success).to.eql(true); await ml.api.waitForDataFrameAnalyticsJobNotToExist(analyticsId); await ml.api.assertIndicesNotToExist(destinationIndex); - await ml.testResources.assertIndexPatternNotExist(destinationIndex); + await ml.testResources.assertDataViewNotExist(destinationIndex); }); }); }); diff --git a/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts b/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts index 4f759a1c5a932..eff763fbcfcdd 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts @@ -46,12 +46,12 @@ export default ({ getService }: FtrProviderContext) => { describe('close_jobs', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); beforeEach(async () => { diff --git a/x-pack/test/api_integration/apis/ml/jobs/jobs_exist.ts b/x-pack/test/api_integration/apis/ml/jobs/jobs_exist.ts index f45f7052b65c6..610d5be812785 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/jobs_exist.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/jobs_exist.ts @@ -83,13 +83,13 @@ export default ({ getService }: FtrProviderContext) => { describe('jobs_exist', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); }); after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('sets up jobs', async () => { diff --git a/x-pack/test/api_integration/apis/ml/jobs/reset.ts b/x-pack/test/api_integration/apis/ml/jobs/reset.ts index 0b69097a907e9..2e193816efb90 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/reset.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/reset.ts @@ -55,12 +55,12 @@ export default ({ getService }: FtrProviderContext) => { describe('reset_jobs', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); beforeEach(async () => { diff --git a/x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts b/x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts index 0f59baa11d137..22176a6e5c7f0 100644 --- a/x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts +++ b/x-pack/test/api_integration/apis/ml/modules/jobs_exist.ts @@ -39,12 +39,12 @@ export default ({ getService }: FtrProviderContext) => { await ml.testResources.setKibanaTimeZoneToUTC(); await esArchiver.loadIfNeeded(sourceDataArchive); // create data view in default space - await ml.testResources.createIndexPatternIfNeeded( + await ml.testResources.createDataViewIfNeeded( moduleInfo.dataView.name, moduleInfo.dataView.timeField ); // create data view in idSpace1 - await ml.testResources.createIndexPatternIfNeeded( + await ml.testResources.createDataViewIfNeeded( moduleInfo.dataView.name, moduleInfo.dataView.timeField, idSpace1 @@ -57,8 +57,8 @@ export default ({ getService }: FtrProviderContext) => { after(async () => { // delete all data views in all spaces - await ml.testResources.deleteIndexPatternByTitle(moduleInfo.dataView.name); - await ml.testResources.deleteIndexPatternByTitle(moduleInfo.dataView.name, idSpace1); + await ml.testResources.deleteDataViewByTitle(moduleInfo.dataView.name); + await ml.testResources.deleteDataViewByTitle(moduleInfo.dataView.name, idSpace1); }); it('should find jobs installed by module without prefix', async () => { diff --git a/x-pack/test/api_integration/apis/ml/modules/setup_module.ts b/x-pack/test/api_integration/apis/ml/modules/setup_module.ts index 1eb327c897b08..27d6d048e3f84 100644 --- a/x-pack/test/api_integration/apis/ml/modules/setup_module.ts +++ b/x-pack/test/api_integration/apis/ml/modules/setup_module.ts @@ -710,7 +710,7 @@ export default ({ getService }: FtrProviderContext) => { describe('sets up module data', function () { before(async () => { await esArchiver.loadIfNeeded(testData.sourceDataArchive); - await ml.testResources.createIndexPatternIfNeeded( + await ml.testResources.createDataViewIfNeeded( testData.indexPattern.name, testData.indexPattern.timeField ); @@ -730,7 +730,7 @@ export default ({ getService }: FtrProviderContext) => { await ml.api.deleteAnomalyDetectionJobES(job.jobId); } await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle(testData.indexPattern.name); + await ml.testResources.deleteDataViewByTitle(testData.indexPattern.name); }); it(testData.testTitleSuffix, async () => { @@ -864,7 +864,7 @@ export default ({ getService }: FtrProviderContext) => { await esArchiver.loadIfNeeded(testData.sourceDataArchive!); } if (testData.hasOwnProperty('indexPattern')) { - await ml.testResources.createIndexPatternIfNeeded( + await ml.testResources.createDataViewIfNeeded( testData.indexPattern!.name as string, testData.indexPattern!.timeField as string ); @@ -874,7 +874,7 @@ export default ({ getService }: FtrProviderContext) => { after(async () => { await ml.api.cleanMlIndices(); if (testData.hasOwnProperty('indexPattern')) { - await ml.testResources.deleteIndexPatternByTitle(testData.indexPattern!.name); + await ml.testResources.deleteDataViewByTitle(testData.indexPattern!.name); } }); diff --git a/x-pack/test/api_integration/apis/ml/results/get_categorizer_stats.ts b/x-pack/test/api_integration/apis/ml/results/get_categorizer_stats.ts index 9c0add9e6be9c..87154beb07efe 100644 --- a/x-pack/test/api_integration/apis/ml/results/get_categorizer_stats.ts +++ b/x-pack/test/api_integration/apis/ml/results/get_categorizer_stats.ts @@ -60,7 +60,7 @@ export default ({ getService }: FtrProviderContext) => { }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_logs'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_logs'); await ml.api.cleanMlIndices(); }); diff --git a/x-pack/test/api_integration/apis/ml/results/get_stopped_partitions.ts b/x-pack/test/api_integration/apis/ml/results/get_stopped_partitions.ts index d722141282328..3dc4686102c3d 100644 --- a/x-pack/test/api_integration/apis/ml/results/get_stopped_partitions.ts +++ b/x-pack/test/api_integration/apis/ml/results/get_stopped_partitions.ts @@ -96,7 +96,7 @@ export default ({ getService }: FtrProviderContext) => { }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_logs'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_logs'); await ml.api.cleanMlIndices(); }); diff --git a/x-pack/test/api_integration/apis/transform/delete_transforms.ts b/x-pack/test/api_integration/apis/transform/delete_transforms.ts index faf18e5d610e3..a064fd28b214b 100644 --- a/x-pack/test/api_integration/apis/transform/delete_transforms.ts +++ b/x-pack/test/api_integration/apis/transform/delete_transforms.ts @@ -232,12 +232,12 @@ export default ({ getService }: FtrProviderContext) => { before(async () => { await createTransform(transformId); await transform.api.createIndices(destinationIndex); - await transform.testResources.createIndexPatternIfNeeded(destinationIndex); + await transform.testResources.createDataViewIfNeeded(destinationIndex); }); after(async () => { await transform.api.deleteIndices(destinationIndex); - await transform.testResources.deleteIndexPatternByTitle(destinationIndex); + await transform.testResources.deleteDataViewByTitle(destinationIndex); }); it('should delete transform and destination index pattern', async () => { @@ -261,7 +261,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body[transformId].destDataViewDeleted.success).to.eql(true); await transform.api.waitForTransformNotToExist(transformId); await transform.api.waitForIndicesToExist(destinationIndex); - await transform.testResources.assertIndexPatternNotExist(destinationIndex); + await transform.testResources.assertDataViewNotExist(destinationIndex); }); }); @@ -272,12 +272,12 @@ export default ({ getService }: FtrProviderContext) => { before(async () => { await createTransform(transformId); await transform.api.createIndices(destinationIndex); - await transform.testResources.createIndexPatternIfNeeded(destinationIndex); + await transform.testResources.createDataViewIfNeeded(destinationIndex); }); after(async () => { await transform.api.deleteIndices(destinationIndex); - await transform.testResources.deleteIndexPatternByTitle(destinationIndex); + await transform.testResources.deleteDataViewByTitle(destinationIndex); }); it('should delete transform, destination index, & destination index pattern', async () => { @@ -301,7 +301,7 @@ export default ({ getService }: FtrProviderContext) => { expect(body[transformId].destDataViewDeleted.success).to.eql(true); await transform.api.waitForTransformNotToExist(transformId); await transform.api.waitForIndicesNotToExist(destinationIndex); - await transform.testResources.assertIndexPatternNotExist(destinationIndex); + await transform.testResources.assertDataViewNotExist(destinationIndex); }); }); }); diff --git a/x-pack/test/api_integration/apis/transform/transforms_create.ts b/x-pack/test/api_integration/apis/transform/transforms_create.ts index 84617f6990e3e..a41a7f3c57093 100644 --- a/x-pack/test/api_integration/apis/transform/transforms_create.ts +++ b/x-pack/test/api_integration/apis/transform/transforms_create.ts @@ -84,7 +84,7 @@ export default ({ getService }: FtrProviderContext) => { }, ]); - await transform.testResources.deleteIndexPatternByTitle(destinationIndex); + await transform.testResources.deleteDataViewByTitle(destinationIndex); }); it('should create a transform with data view and time field', async () => { @@ -118,7 +118,7 @@ export default ({ getService }: FtrProviderContext) => { }, ]); - await transform.testResources.deleteIndexPatternByTitle(destinationIndex); + await transform.testResources.deleteDataViewByTitle(destinationIndex); }); it('should not allow pivot and latest configs in same transform', async () => { diff --git a/x-pack/test/api_integration/apis/watcher/watcher.ts b/x-pack/test/api_integration/apis/watcher/watcher.ts index 734b6c8c6212d..a5d26c98dfe73 100644 --- a/x-pack/test/api_integration/apis/watcher/watcher.ts +++ b/x-pack/test/api_integration/apis/watcher/watcher.ts @@ -17,7 +17,7 @@ export default function ({ getService }: FtrProviderContext) { describe('watcher', () => { before(async () => { try { - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); } catch (error) { log.debug('[Setup error] Error creating index pattern'); throw error; @@ -26,7 +26,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { try { - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); } catch (error) { log.debug('[Cleanup error] Error deleting index pattern'); throw error; diff --git a/x-pack/test/api_integration/services/index.ts b/x-pack/test/api_integration/services/index.ts index 6ef3e393a86e6..1f8d4576d908d 100644 --- a/x-pack/test/api_integration/services/index.ts +++ b/x-pack/test/api_integration/services/index.ts @@ -21,6 +21,7 @@ import { MachineLearningProvider } from './ml'; import { IngestManagerProvider } from '../../common/services/ingest_manager'; import { TransformProvider } from './transform'; import { IngestPipelinesProvider } from './ingest_pipelines'; +import { IndexManagementProvider } from './index_management'; export const services = { ...commonServices, @@ -37,4 +38,5 @@ export const services = { ingestManager: IngestManagerProvider, transform: TransformProvider, ingestPipelines: IngestPipelinesProvider, + indexManagement: IndexManagementProvider, }; diff --git a/x-pack/test/api_integration/services/index_management.ts b/x-pack/test/api_integration/services/index_management.ts new file mode 100644 index 0000000000000..44d33752e4147 --- /dev/null +++ b/x-pack/test/api_integration/services/index_management.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 { FtrProviderContext } from '../ftr_provider_context'; +import { indicesApi } from '../apis/management/index_management/lib/indices.api'; +import { mappingsApi } from '../apis/management/index_management/lib/mappings.api'; +import { indicesHelpers } from '../apis/management/index_management/lib/indices.helpers'; + +export function IndexManagementProvider({ getService }: FtrProviderContext) { + return { + indices: { + api: indicesApi(getService), + helpers: indicesHelpers(getService), + }, + mappings: { + api: mappingsApi(getService), + }, + }; +} diff --git a/x-pack/test/apm_api_integration/common/apm_api_supertest.ts b/x-pack/test/apm_api_integration/common/apm_api_supertest.ts index ac16abff4098b..4fe7ae4a62e71 100644 --- a/x-pack/test/apm_api_integration/common/apm_api_supertest.ts +++ b/x-pack/test/apm_api_integration/common/apm_api_supertest.ts @@ -20,6 +20,7 @@ export function createApmApiClient(st: supertest.SuperTest) { options: { type?: 'form-data'; endpoint: TEndpoint; + spaceId?: string; } & APIClientRequestParamsOf & { params?: { query?: { _inspect?: boolean } } } ): Promise> => { const { endpoint, type } = options; @@ -27,7 +28,8 @@ export function createApmApiClient(st: supertest.SuperTest) { const params = 'params' in options ? (options.params as Record) : {}; const { method, pathname, version } = formatRequest(endpoint, params.path); - const url = format({ pathname, query: params?.query }); + const pathnameWithSpaceId = options.spaceId ? `/s/${options.spaceId}${pathname}` : pathname; + const url = format({ pathname: pathnameWithSpaceId, query: params?.query }); const headers: Record = { 'kbn-xsrf': 'foo', diff --git a/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts b/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts index a49e698c86c65..dcc8fc76044cf 100644 --- a/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts +++ b/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts @@ -8,7 +8,7 @@ import { apm, timerange } from '@kbn/apm-synthtrace-client'; import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace'; import expect from '@kbn/expect'; -import { APM_STATIC_DATA_VIEW_ID } from '@kbn/apm-plugin/common/data_view_constants'; +import { getDataViewId } from '@kbn/apm-plugin/common/data_view_constants'; import { DataView } from '@kbn/data-views-plugin/common'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import request from 'superagent'; @@ -20,28 +20,33 @@ export default function ApiTest({ getService }: FtrProviderContext) { const apmApiClient = getService('apmApiClient'); const supertest = getService('supertest'); const synthtrace = getService('synthtraceEsClient'); + const logger = getService('log'); const dataViewPattern = 'traces-apm*,apm-*,logs-apm*,apm-*,metrics-apm*,apm-*'; - function createDataViewWithWriteUser() { + function createDataViewWithWriteUser({ spaceId }: { spaceId: string }) { return apmApiClient.writeUser({ endpoint: 'POST /internal/apm/data_view/static', + spaceId, }); } - function createDataViewWithReadUser() { - return apmApiClient.readUser({ endpoint: 'POST /internal/apm/data_view/static' }); + function createDataViewWithReadUser({ spaceId }: { spaceId: string }) { + return apmApiClient.readUser({ + endpoint: 'POST /internal/apm/data_view/static', + spaceId, + }); } - function deleteDataView() { + function deleteDataView(spaceId: string) { return supertest - .delete(`/api/saved_objects/index-pattern/${APM_STATIC_DATA_VIEW_ID}?force=true`) + .delete(`/s/${spaceId}/api/saved_objects/index-pattern/${getDataViewId(spaceId)}?force=true`) .set('kbn-xsrf', 'foo'); } - function getDataView({ space }: { space: string }) { - const spacePrefix = space !== 'default' ? `/s/${space}` : ''; + function getDataView({ spaceId }: { spaceId: string }) { + const spacePrefix = spaceId !== 'default' ? `/s/${spaceId}` : ''; return supertest.get( - `${spacePrefix}/api/saved_objects/index-pattern/${APM_STATIC_DATA_VIEW_ID}` + `${spacePrefix}/api/saved_objects/index-pattern/${getDataViewId(spaceId)}` ); } @@ -56,7 +61,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { registry.when('no mappings exist', { config: 'basic', archives: [] }, () => { let response: SupertestReturnType<'POST /internal/apm/data_view/static'>; before(async () => { - response = await createDataViewWithWriteUser(); + response = await createDataViewWithWriteUser({ spaceId: 'default' }); }); it('does not create data view', async () => { @@ -68,10 +73,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('cannot fetch data view', async () => { - const res = await getDataView({ space: 'default' }); + const res = await getDataView({ spaceId: 'default' }); expect(res.status).to.be(404); expect(res.body.message).to.eql( - 'Saved object [index-pattern/apm_static_index_pattern_id] not found' + 'Saved object [index-pattern/apm_static_data_view_id_default] not found' ); }); }); @@ -86,14 +91,18 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); afterEach(async () => { - await deleteDataView(); + try { + await Promise.all([deleteDataView('default'), deleteDataView('foo')]); + } catch (e) { + logger.error(`Could not delete data views ${e.message}`); + } }); describe('when creating data view with write user', () => { let response: SupertestReturnType<'POST /internal/apm/data_view/static'>; before(async () => { - response = await createDataViewWithWriteUser(); + response = await createDataViewWithWriteUser({ spaceId: 'default' }); }); it('successfully creates the apm data view', async () => { @@ -102,7 +111,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { // @ts-expect-error const dataView = response.body.dataView as DataView; - expect(dataView.id).to.be('apm_static_index_pattern_id'); + expect(dataView.id).to.be('apm_static_data_view_id_default'); expect(dataView.name).to.be('APM'); expect(dataView.title).to.be('traces-apm*,apm-*,logs-apm*,apm-*,metrics-apm*,apm-*'); }); @@ -112,8 +121,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { let dataViewResponse: request.Response; before(async () => { - await createDataViewWithWriteUser(); - dataViewResponse = await getDataView({ space: 'default' }); + await createDataViewWithWriteUser({ spaceId: 'default' }); + dataViewResponse = await getDataView({ spaceId: 'default' }); }); it('return 200', () => { @@ -121,7 +130,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('has correct id', () => { - expect(dataViewResponse.body.id).to.be('apm_static_index_pattern_id'); + expect(dataViewResponse.body.id).to.be('apm_static_data_view_id_default'); }); it('has correct title', () => { @@ -170,7 +179,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('when creating data view via read user', () => { it('throws an error', async () => { try { - await createDataViewWithReadUser(); + await createDataViewWithReadUser({ spaceId: 'default' }); } catch (e) { const err = e as ApmApiError; const responseBody = err.res.body; @@ -184,30 +193,44 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('when creating data view twice', () => { it('returns 200 response with reason, if data view already exists', async () => { - await createDataViewWithWriteUser(); - const res = await createDataViewWithWriteUser(); + await createDataViewWithWriteUser({ spaceId: 'default' }); + const res = await createDataViewWithWriteUser({ spaceId: 'default' }); expect(res.status).to.be(200); expect(res.body).to.eql({ created: false, - reason: 'Dataview already exists in the active space', + reason: 'Dataview already exists in the active space and does not need to be updated', }); }); }); describe('when creating data view in "default" space', async () => { - it('can be retrieved from the "default space"', async () => { - await createDataViewWithWriteUser(); - const res = await getDataView({ space: 'default' }); - expect(res.body.id).to.eql('apm_static_index_pattern_id'); - expect(res.body.namespaces).to.eql(['*', 'default']); + it('can be retrieved from the "default" space', async () => { + await createDataViewWithWriteUser({ spaceId: 'default' }); + const res = await getDataView({ spaceId: 'default' }); + expect(res.body.id).to.eql('apm_static_data_view_id_default'); + expect(res.body.namespaces).to.eql(['default']); }); + it('cannot be retrieved from the "foo" space', async () => { + await createDataViewWithWriteUser({ spaceId: 'default' }); + const res = await getDataView({ spaceId: 'foo' }); + expect(res.body.statusCode).to.be(404); + }); + }); + + describe('when creating data view in "foo" space', async () => { it('can be retrieved from the "foo" space', async () => { - await createDataViewWithWriteUser(); - const res = await getDataView({ space: 'foo' }); - expect(res.body.id).to.eql('apm_static_index_pattern_id'); - expect(res.body.namespaces).to.eql(['*', 'default']); + await createDataViewWithWriteUser({ spaceId: 'foo' }); + const res = await getDataView({ spaceId: 'foo' }); + expect(res.body.id).to.eql('apm_static_data_view_id_foo'); + expect(res.body.namespaces).to.eql(['foo']); + }); + + it('cannot be retrieved from the "default" space', async () => { + await createDataViewWithWriteUser({ spaceId: 'foo' }); + const res = await getDataView({ spaceId: 'default' }); + expect(res.body.statusCode).to.be(404); }); }); }); diff --git a/x-pack/test/apm_api_integration/tests/services/get_service_node_metadata.spec.ts b/x-pack/test/apm_api_integration/tests/services/get_service_node_metadata.spec.ts index c07d6dc6c0f5e..b37d68fe936af 100644 --- a/x-pack/test/apm_api_integration/tests/services/get_service_node_metadata.spec.ts +++ b/x-pack/test/apm_api_integration/tests/services/get_service_node_metadata.spec.ts @@ -7,6 +7,8 @@ import expect from '@kbn/expect'; import { apm, timerange } from '@kbn/apm-synthtrace-client'; +import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; +import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; import { FtrProviderContext } from '../../common/ftr_provider_context'; export default function ApiTest({ getService }: FtrProviderContext) { @@ -29,6 +31,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { end: new Date(end).toISOString(), kuery: '', environment: 'production', + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.OneMinute, }, }, }); diff --git a/x-pack/test/cloud_security_posture_functional/mocks/vulnerabilities_latest_mock.ts b/x-pack/test/cloud_security_posture_functional/mocks/vulnerabilities_latest_mock.ts index 813c72743e7fc..f0ffd4aebb388 100644 --- a/x-pack/test/cloud_security_posture_functional/mocks/vulnerabilities_latest_mock.ts +++ b/x-pack/test/cloud_security_posture_functional/mocks/vulnerabilities_latest_mock.ts @@ -83,7 +83,7 @@ export const vulnerabilitiesLatestMock = [ id: '704479110758', }, }, - '@timestamp': '2023-06-29T02:08:44.993Z', + '@timestamp': (Date.now() - 249200000).toString(), cloudbeat: { commit_sha: '4d990caa0c9c1594441da6bf24a685599aeb2bd5', commit_time: '2023-05-15T14:48:10Z', @@ -189,7 +189,7 @@ export const vulnerabilitiesLatestMock = [ id: '704479110758', }, }, - '@timestamp': '2023-06-29T02:08:16.535Z', + '@timestamp': (Date.now() - 249200000).toString(), ecs: { version: '8.6.0', }, diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts index 49f4ab0a6d12f..0fd0e463e7087 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/findings_page.ts @@ -410,6 +410,12 @@ export function FindingsPageProvider({ getService, getPageObjects }: FtrProvider }, }); + const isLatestFindingsTableThere = async () => { + const table = await testSubjects.findAll('docTable'); + const trueOrFalse = table.length > 0 ? true : false; + return trueOrFalse; + }; + return { navigateToLatestFindingsPage, navigateToVulnerabilities, @@ -426,5 +432,6 @@ export function FindingsPageProvider({ getService, getPageObjects }: FtrProvider misconfigurationsFlyout, toastMessage, detectionRuleApi, + isLatestFindingsTableThere, }; } diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings.ts b/x-pack/test/cloud_security_posture_functional/pages/findings.ts index 69c1fd6949f51..4ec0240f735c9 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings.ts @@ -17,12 +17,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const retry = getService('retry'); const pageObjects = getPageObjects(['common', 'findings', 'header']); const chance = new Chance(); + const timeFiveHoursAgo = (Date.now() - 18000000).toString(); // We need to use a dataset for the tests to run // We intentionally make some fields start with a capital letter to test that the query bar is case-insensitive/case-sensitive const data = [ { - '@timestamp': '1695819664234', + '@timestamp': timeFiveHoursAgo, resource: { id: chance.guid(), name: `kubelet`, sub_type: 'lower case sub type' }, result: { evaluation: chance.integer() % 2 === 0 ? 'passed' : 'failed' }, rule: { @@ -39,7 +40,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { cluster_id: 'Upper case cluster id', }, { - '@timestamp': '1695819673242', + '@timestamp': timeFiveHoursAgo, resource: { id: chance.guid(), name: `Pod`, sub_type: 'Upper case sub type' }, result: { evaluation: chance.integer() % 2 === 0 ? 'passed' : 'failed' }, rule: { @@ -56,7 +57,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { cluster_id: 'Another Upper case cluster id', }, { - '@timestamp': '1695819676242', + '@timestamp': timeFiveHoursAgo, resource: { id: chance.guid(), name: `process`, sub_type: 'another lower case type' }, result: { evaluation: 'passed' }, rule: { @@ -73,7 +74,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { cluster_id: 'lower case cluster id', }, { - '@timestamp': '1695819680202', + '@timestamp': timeFiveHoursAgo, resource: { id: chance.guid(), name: `process`, sub_type: 'Upper case type again' }, result: { evaluation: 'failed' }, rule: { @@ -122,7 +123,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await findings.index.add(data); await findings.navigateToLatestFindingsPage(); - await retry.waitFor( 'Findings table to be loaded', async () => (await latestFindingsTable.getRowsCount()) === data.length diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings_old_data.ts b/x-pack/test/cloud_security_posture_functional/pages/findings_old_data.ts new file mode 100644 index 0000000000000..a8cda10482e2e --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/pages/findings_old_data.ts @@ -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 expect from '@kbn/expect'; +import Chance from 'chance'; +import type { FtrProviderContext } from '../ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const pageObjects = getPageObjects(['common', 'findings', 'header']); + const chance = new Chance(); + const hoursToMillisecond = (hours: number) => hours * 60 * 60 * 1000; + + const dataOldKspm = [ + { + '@timestamp': (Date.now() - hoursToMillisecond(27)).toString(), + resource: { id: chance.guid(), name: `kubelet`, sub_type: 'lower case sub type' }, + result: { evaluation: chance.integer() % 2 === 0 ? 'passed' : 'failed' }, + rule: { + name: 'Upper case rule name', + section: 'Upper case section', + benchmark: { + id: 'cis_k8s', + posture_type: 'kspm', + name: 'CIS Kubernetes V1.23', + version: 'v1.0.0', + }, + type: 'process', + }, + cluster_id: 'Upper case cluster id', + }, + ]; + + const dataOldCspm = [ + { + '@timestamp': (Date.now() - hoursToMillisecond(27)).toString(), + resource: { id: chance.guid(), name: `kubelet`, sub_type: 'lower case sub type' }, + result: { evaluation: chance.integer() % 2 === 0 ? 'passed' : 'failed' }, + rule: { + name: 'Upper case rule name', + section: 'Upper case section', + benchmark: { + id: 'cis_aws', + posture_type: 'cspm', + name: 'CIS AWS V1.23', + version: 'v1.0.0', + }, + type: 'process', + }, + cluster_id: 'Upper case cluster id', + }, + ]; + + describe.skip('Old Data', function () { + this.tags(['cloud_security_posture_findings']); + let findings: typeof pageObjects.findings; + + before(async () => { + findings = pageObjects.findings; + + // Before we start any test we must wait for cloud_security_posture plugin to complete its initialization + await findings.waitForPluginInitialized(); + }); + + after(async () => { + await findings.index.remove(); + }); + + describe('Findings page with old data', () => { + it('returns no Findings KSPM', async () => { + // Prepare mocked findings + await findings.index.remove(); + await findings.index.add(dataOldKspm); + + await findings.navigateToLatestFindingsPage(); + pageObjects.header.waitUntilLoadingHasFinished(); + expect(await findings.isLatestFindingsTableThere()).to.be(false); + }); + it('returns no Findings CSPM', async () => { + // Prepare mocked findings + await findings.index.remove(); + await findings.index.add(dataOldCspm); + + await findings.navigateToLatestFindingsPage(); + pageObjects.header.waitUntilLoadingHasFinished(); + expect(await findings.isLatestFindingsTableThere()).to.be(false); + }); + }); + }); +} diff --git a/x-pack/test/cloud_security_posture_functional/pages/index.ts b/x-pack/test/cloud_security_posture_functional/pages/index.ts index 9d4e17ec0c88c..f1bb7f8fb7875 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/index.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/index.ts @@ -16,5 +16,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./compliance_dashboard')); loadTestFile(require.resolve('./vulnerability_dashboard')); loadTestFile(require.resolve('./cis_integration')); + loadTestFile(require.resolve('./findings_old_data')); }); } diff --git a/x-pack/test/dataset_quality_api_integration/common/config.ts b/x-pack/test/dataset_quality_api_integration/common/config.ts index 7a0c7c08fb2f0..e10ad4273fe76 100644 --- a/x-pack/test/dataset_quality_api_integration/common/config.ts +++ b/x-pack/test/dataset_quality_api_integration/common/config.ts @@ -13,6 +13,7 @@ import { createDatasetQualityUsers } from '@kbn/dataset-quality-plugin/server/te import { FtrConfigProviderContext } from '@kbn/test'; import supertest from 'supertest'; import { format, UrlObject } from 'url'; +import { createLogger, LogLevel, LogsSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { FtrProviderContext, InheritedFtrProviderContext, @@ -64,6 +65,9 @@ export interface CreateTest { services: InheritedServices & { datasetQualityFtrConfig: () => DatasetQualityFtrConfig; registry: ({ getService }: FtrProviderContext) => ReturnType; + logSynthtraceEsClient: ( + context: InheritedFtrProviderContext + ) => Promise; datasetQualityApiClient: (context: InheritedFtrProviderContext) => DatasetQualityApiClient; }; junit: { reportName: string }; @@ -95,6 +99,12 @@ export function createTestConfig( ...services, datasetQualityFtrConfig: () => config, registry: RegistryProvider, + logSynthtraceEsClient: (context: InheritedFtrProviderContext) => + new LogsSynthtraceEsClient({ + client: context.getService('es'), + logger: createLogger(LogLevel.info), + refreshAfterIndex: true, + }), datasetQualityApiClient: async (_: InheritedFtrProviderContext) => { const { username, password } = servers.kibana; const esUrl = format(esServer); diff --git a/x-pack/test/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts b/x-pack/test/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts index d28ddb5f04962..79818e970a2ab 100644 --- a/x-pack/test/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts +++ b/x-pack/test/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts @@ -10,10 +10,7 @@ import supertest from 'supertest'; import request from 'superagent'; import type { APIEndpoint } from '@kbn/dataset-quality-plugin/server/routes'; import { formatRequest } from '@kbn/server-route-repository'; -import { - APIClientRequestParamsOf, - APIReturnType, -} from '@kbn/dataset-quality-plugin/public/services/rest/create_call_dataset_quality_api'; +import type { APIClientRequestParamsOf, APIReturnType } from '@kbn/dataset-quality-plugin/common'; export function createDatasetQualityApiClient(st: supertest.SuperTest) { return async ( diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams.spec.ts index cd236c109c667..6d11326bf213e 100644 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams.spec.ts +++ b/x-pack/test/dataset_quality_api_integration/tests/data_streams.spec.ts @@ -5,15 +5,19 @@ * 2.0. */ +import { log, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; import { DatasetQualityApiClientKey } from '../common/config'; import { DatasetQualityApiError } from '../common/dataset_quality_api_supertest'; import { FtrProviderContext } from '../common/ftr_provider_context'; import { expectToReject } from '../utils'; +import { cleanLogIndexTemplate, addIntegrationToLogIndexTemplate } from './es_utils'; export default function ApiTest({ getService }: FtrProviderContext) { const registry = getService('registry'); + const synthtrace = getService('logSynthtraceEsClient'); const datasetQualityApiClient = getService('datasetQualityApiClient'); + const es = getService('es'); async function callApiAs(user: DatasetQualityApiClientKey) { return await datasetQualityApiClient[user]({ @@ -21,7 +25,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { params: { query: { type: 'logs', - sortOrder: 'asc', }, }, }); @@ -40,10 +43,67 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); describe('when required privileges are set', () => { - it('returns true when user has logMonitoring privileges', async () => { - const privileges = await callApiAs('datasetQualityLogsUser'); + describe('and uncategorized datastreams', () => { + const integration = 'my-custom-integration'; - expect(privileges.body.items.length).to.be(0); + before(async () => { + await addIntegrationToLogIndexTemplate({ esClient: es, name: integration }); + + await synthtrace.index([ + timerange('2023-11-20T15:00:00.000Z', '2023-11-20T15:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => + log.create().message('This is a log message').timestamp(timestamp).defaults({ + 'log.file.path': '/my-service.log', + }) + ), + ]); + }); + + it('returns stats correctly', async () => { + const stats = await callApiAs('datasetQualityLogsUser'); + + expect(stats.body.dataStreamsStats.length).to.be(1); + expect(stats.body.dataStreamsStats[0].integration).to.be(integration); + expect(stats.body.dataStreamsStats[0].size).not.empty(); + expect(stats.body.dataStreamsStats[0].size_bytes).greaterThan(0); + expect(stats.body.dataStreamsStats[0].last_activity).greaterThan(0); + }); + + after(async () => { + await synthtrace.clean(); + await cleanLogIndexTemplate({ esClient: es }); + }); + }); + + describe('and categorized datastreams', () => { + before(async () => { + await synthtrace.index([ + timerange('2023-11-20T15:00:00.000Z', '2023-11-20T15:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => + log.create().message('This is a log message').timestamp(timestamp).defaults({ + 'log.file.path': '/my-service.log', + }) + ), + ]); + }); + + it('returns stats correctly', async () => { + const stats = await callApiAs('datasetQualityLogsUser'); + + expect(stats.body.dataStreamsStats.length).to.be(1); + expect(stats.body.dataStreamsStats[0].integration).not.ok(); + expect(stats.body.dataStreamsStats[0].size).not.empty(); + expect(stats.body.dataStreamsStats[0].size_bytes).greaterThan(0); + expect(stats.body.dataStreamsStats[0].last_activity).greaterThan(0); + }); + + after(async () => { + await synthtrace.clean(); + }); }); }); }); diff --git a/x-pack/test/dataset_quality_api_integration/tests/es_utils.ts b/x-pack/test/dataset_quality_api_integration/tests/es_utils.ts new file mode 100644 index 0000000000000..607522089952f --- /dev/null +++ b/x-pack/test/dataset_quality_api_integration/tests/es_utils.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Client } from '@elastic/elasticsearch'; + +export async function addIntegrationToLogIndexTemplate({ + esClient, + name, + managedBy = 'fleet', +}: { + esClient: Client; + name: string; + managedBy?: string; +}) { + const { index_templates: indexTemplates } = await esClient.indices.getIndexTemplate({ + name: 'logs', + }); + + await esClient.indices.putIndexTemplate({ + name: 'logs', + body: { + ...indexTemplates[0].index_template, + _meta: { + ...indexTemplates[0].index_template._meta, + package: { + name, + }, + managed_by: managedBy, + }, + }, + }); +} + +export async function cleanLogIndexTemplate({ esClient }: { esClient: Client }) { + const { index_templates: indexTemplates } = await esClient.indices.getIndexTemplate({ + name: 'logs', + }); + + await esClient.indices.putIndexTemplate({ + name: 'logs', + body: { + ...indexTemplates[0].index_template, + _meta: { + ...indexTemplates[0].index_template._meta, + package: undefined, + managed_by: undefined, + }, + }, + }); +} diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/index.ts b/x-pack/test/detection_engine_api_integration/basic/tests/index.ts index 315a06043684f..5b3449707d38f 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/index.ts +++ b/x-pack/test/detection_engine_api_integration/basic/tests/index.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export export default ({ loadTestFile }: FtrProviderContext): void => { describe('detection engine api basic license', function () { - loadTestFile(require.resolve('./create_rules')); loadTestFile(require.resolve('./create_rules_bulk')); loadTestFile(require.resolve('./delete_rules')); loadTestFile(require.resolve('./delete_rules_bulk')); @@ -22,8 +21,6 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./update_rules_bulk')); loadTestFile(require.resolve('./patch_rules_bulk')); loadTestFile(require.resolve('./patch_rules')); - loadTestFile(require.resolve('./query_signals')); - loadTestFile(require.resolve('./open_close_signals')); loadTestFile(require.resolve('./import_timelines')); loadTestFile(require.resolve('./coverage_overview')); }); diff --git a/x-pack/test/detection_engine_api_integration/utils/index.ts b/x-pack/test/detection_engine_api_integration/utils/index.ts index a1373f03a1817..d3fd910681a3e 100644 --- a/x-pack/test/detection_engine_api_integration/utils/index.ts +++ b/x-pack/test/detection_engine_api_integration/utils/index.ts @@ -44,7 +44,6 @@ export * from './get_rule_for_signal_testing_with_timestamp_override'; export * from './get_rule_with_web_hook_action'; export * from './get_rule_with_legacy_investigation_fields'; export * from './get_saved_query_rule_for_signal_testing'; -export * from './get_signal_status'; export * from './get_signals_by_id'; export * from './get_signals_by_ids'; export * from './get_signals_by_rule_ids'; diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_dynamic_template_metric.ts b/x-pack/test/fleet_api_integration/apis/epm/install_dynamic_template_metric.ts index cc2bb4ebd8582..9bcf3fc673eab 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_dynamic_template_metric.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_dynamic_template_metric.ts @@ -24,14 +24,14 @@ export default function (providerContext: FtrProviderContext) { setupFleetAndAgents(providerContext); after(async () => { - await deletePackage('istio', '0.3.3'); + await deletePackage('no_tsdb_to_tsdb', '0.2.0'); }); it('should install with metric_type added as time_series_metric', async function () { - const templateName = 'metrics-istio.istiod_metrics@package'; + const templateName = 'metrics-no_tsdb_to_tsdb.test@package'; await supertest - .post(`/api/fleet/epm/packages/istio/0.3.3`) + .post(`/api/fleet/epm/packages/no_tsdb_to_tsdb/0.2.0`) .set('kbn-xsrf', 'xxxx') .send({ force: true }) .expect(200); @@ -46,7 +46,7 @@ export default function (providerContext: FtrProviderContext) { const template = resp.component_templates[0].component_template; const dynamicTemplates = template.template.mappings.dynamic_templates; - const mappingName = 'istio.istiod.metrics.*.counter'; + const mappingName = 'test.metrics.*.counter'; const counter = dynamicTemplates.find((tmpl: any) => Object.keys(tmpl)[0] === mappingName); expect(counter[mappingName].mapping.time_series_metric).to.eql('counter'); diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/fields/fields.yml b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/fields/fields.yml index e1fd2db653efc..6cc90f2148d13 100644 --- a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/fields/fields.yml +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/fields/fields.yml @@ -20,3 +20,10 @@ - name: 'some_metric_field' type: integer metric_type: gauge +- name: test.metrics.*.counter + type: object + object_type: double + object_type_mapping_type: "*" + metric_type: counter + description: > + Istiod counter metric diff --git a/x-pack/test/functional/apps/aiops/change_point_detection.ts b/x-pack/test/functional/apps/aiops/change_point_detection.ts index f643de514c0cb..25ed676e9429b 100644 --- a/x-pack/test/functional/apps/aiops/change_point_detection.ts +++ b/x-pack/test/functional/apps/aiops/change_point_detection.ts @@ -19,20 +19,20 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('change point detection', async function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); }); it(`loads the change point detection page`, async () => { // Start navigation from the base of the ML app. await ml.navigation.navigateToMl(); await elasticChart.setNewChartUiDebugFlag(true); - await aiops.changePointDetectionPage.navigateToIndexPatternSelection(); + await aiops.changePointDetectionPage.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForChangePointDetection('ft_ecommerce'); await aiops.changePointDetectionPage.assertChangePointDetectionPageExists(); }); diff --git a/x-pack/test/functional/apps/aiops/log_pattern_analysis.ts b/x-pack/test/functional/apps/aiops/log_pattern_analysis.ts index 921d02c8c0c67..6ea8a1d4abc36 100644 --- a/x-pack/test/functional/apps/aiops/log_pattern_analysis.ts +++ b/x-pack/test/functional/apps/aiops/log_pattern_analysis.ts @@ -36,20 +36,20 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); - await ml.testResources.createIndexPatternIfNeeded('logstash-*', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('logstash-*', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle('logstash-*'); + await ml.testResources.deleteDataViewByTitle('logstash-*'); }); it(`loads the log pattern analysis page and filters in patterns in discover`, async () => { // Start navigation from the base of the ML app. await ml.navigation.navigateToMl(); await elasticChart.setNewChartUiDebugFlag(true); - await aiops.logPatternAnalysisPage.navigateToIndexPatternSelection(); + await aiops.logPatternAnalysisPage.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForLogPatternAnalysisDetection('logstash-*'); await aiops.logPatternAnalysisPage.assertLogPatternAnalysisPageExists(); @@ -76,7 +76,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { // Start navigation from the base of the ML app. await ml.navigation.navigateToMl(); await elasticChart.setNewChartUiDebugFlag(true); - await aiops.logPatternAnalysisPage.navigateToIndexPatternSelection(); + await aiops.logPatternAnalysisPage.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForLogPatternAnalysisDetection('logstash-*'); await aiops.logPatternAnalysisPage.assertLogPatternAnalysisPageExists(); diff --git a/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts b/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts index 9845cf0a5180f..403bbe6382f6c 100644 --- a/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts +++ b/x-pack/test/functional/apps/aiops/log_pattern_analysis_in_discover.ts @@ -36,13 +36,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); - await ml.testResources.createIndexPatternIfNeeded('logstash-*', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('logstash-*', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle('logstash-*'); + await ml.testResources.deleteDataViewByTitle('logstash-*'); }); it(`loads the log pattern analysis flyout and shows patterns in discover`, async () => { diff --git a/x-pack/test/functional/apps/aiops/log_rate_analysis.ts b/x-pack/test/functional/apps/aiops/log_rate_analysis.ts index 8e33b4b1c8e4a..68c9256b382d0 100644 --- a/x-pack/test/functional/apps/aiops/log_rate_analysis.ts +++ b/x-pack/test/functional/apps/aiops/log_rate_analysis.ts @@ -15,6 +15,7 @@ import { logRateAnalysisTestData } from './log_rate_analysis_test_data'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'console', 'header', 'home', 'security']); + const browser = getService('browser'); const elasticChart = getService('elasticChart'); const aiops = getService('aiops'); @@ -28,7 +29,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the saved search selection page` ); - await aiops.logRateAnalysisPage.navigateToIndexPatternSelection(); + await aiops.logRateAnalysisPage.navigateToDataViewSelection(); await ml.testExecution.logTestStep(`${testData.suiteTitle} loads the log rate analysis page`); await ml.jobSourceSelection.selectSourceForLogRateAnalysis(testData.sourceIndexOrSavedSearch); @@ -147,6 +148,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await aiops.logRateAnalysisPage.clickRerunAnalysisButton(true); } + // Wait for the analysis to finish + await aiops.logRateAnalysisPage.assertAnalysisComplete(testData.analysisType); + + // At this stage the baseline and deviation brush position should be stored in + // the url state and a full browser refresh should restore the analysis. + await browser.refresh(); await aiops.logRateAnalysisPage.assertAnalysisComplete(testData.analysisType); // The group switch should be disabled by default @@ -234,7 +241,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { before(async () => { await aiops.logRateAnalysisDataGenerator.generateData(testData.dataGenerator); - await ml.testResources.createIndexPatternIfNeeded( + await ml.testResources.createDataViewIfNeeded( testData.sourceIndexOrSavedSearch, '@timestamp' ); @@ -260,7 +267,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { after(async () => { await elasticChart.setNewChartUiDebugFlag(false); if (testData.dataGenerator !== 'kibana_sample_data_logs') { - await ml.testResources.deleteIndexPatternByTitle(testData.sourceIndexOrSavedSearch); + await ml.testResources.deleteDataViewByTitle(testData.sourceIndexOrSavedSearch); } await aiops.logRateAnalysisDataGenerator.removeGeneratedData(testData.dataGenerator); }); diff --git a/x-pack/test/functional/apps/discover/visualize_field.ts b/x-pack/test/functional/apps/discover/visualize_field.ts index a61a2abba1870..428ef13c34866 100644 --- a/x-pack/test/functional/apps/discover/visualize_field.ts +++ b/x-pack/test/functional/apps/discover/visualize_field.ts @@ -255,5 +255,76 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const data = await PageObjects.lens.getCurrentChartDebugStateForVizType('xyVisChart'); assertMatchesExpectedData(data!); }); + + it('should allow editing the query in the dashboard', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await monacoEditor.setCodeEditorValue('from logstash-* | limit 10'); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('TextBasedLangEditor-expand'); + // save the visualization + await testSubjects.click('unifiedHistogramSaveVisualization'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.lens.saveModal('TextBasedChart1', false, false, false, 'new'); + await testSubjects.existOrFail('embeddablePanelHeading-TextBasedChart1'); + await elasticChart.setNewChartUiDebugFlag(true); + await PageObjects.header.waitUntilLoadingHasFinished(); + // open the inline editing flyout + await testSubjects.click('embeddablePanelToggleMenuIcon'); + await testSubjects.click('embeddablePanelAction-ACTION_CONFIGURE_IN_LENS'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // change the query + await monacoEditor.setCodeEditorValue('from logstash-* | stats maxB = max(bytes)'); + await testSubjects.click('TextBasedLangEditor-run-query-button'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect((await PageObjects.lens.getMetricVisualizationData()).length).to.be.equal(1); + + // change the query to display a datatabler + await monacoEditor.setCodeEditorValue('from logstash-* | limit 10'); + await testSubjects.click('TextBasedLangEditor-run-query-button'); + await PageObjects.lens.waitForVisualization(); + expect(await testSubjects.exists('lnsDataTable')).to.be(true); + + await PageObjects.lens.removeDimension('lnsDatatable_metrics'); + await PageObjects.lens.removeDimension('lnsDatatable_metrics'); + await PageObjects.lens.removeDimension('lnsDatatable_metrics'); + await PageObjects.lens.removeDimension('lnsDatatable_metrics'); + + await PageObjects.lens.configureTextBasedLanguagesDimension({ + dimension: 'lnsDatatable_metrics > lns-empty-dimension', + field: 'bytes', + keepOpen: true, + }); + await testSubjects.click('lns-indexPattern-dimensionContainerBack'); + // click donut from suggestions + await testSubjects.click('lensSuggestionsPanelToggleButton'); + await testSubjects.click('lnsSuggestion-donut'); + expect(await testSubjects.exists('partitionVisChart')).to.be(true); + }); + + it('should default title when saving chart in Discover (even when modal is closed and reopened)', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await monacoEditor.setCodeEditorValue( + 'from logstash-* | stats averageB = avg(bytes) by extension' + ); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.chooseLensChart('Bar vertical stacked'); + await testSubjects.click('TextBasedLangEditor-expand'); + await testSubjects.click('unifiedHistogramSaveVisualization'); + await PageObjects.header.waitUntilLoadingHasFinished(); + let title = await testSubjects.getAttribute('savedObjectTitle', 'value'); + expect(title).to.equal('Bar vertical stacked'); + await testSubjects.click('saveCancelButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('unifiedHistogramSaveVisualization'); + await PageObjects.header.waitUntilLoadingHasFinished(); + title = await testSubjects.getAttribute('savedObjectTitle', 'value'); + expect(title).to.equal('Bar vertical stacked'); + }); }); } diff --git a/x-pack/test/functional/apps/infra/index.ts b/x-pack/test/functional/apps/infra/index.ts index e34b074f8829e..5ad5c004c30c9 100644 --- a/x-pack/test/functional/apps/infra/index.ts +++ b/x-pack/test/functional/apps/infra/index.ts @@ -29,6 +29,7 @@ export default ({ loadTestFile }: FtrProviderContext) => { loadTestFile(require.resolve('./logs/log_stream_date_nano')); loadTestFile(require.resolve('./logs/link_to')); loadTestFile(require.resolve('./logs/log_stream')); + loadTestFile(require.resolve('./logs/ml_job_id_formats/tests')); }); }); }; diff --git a/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/assert_id_formats.ts b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/assert_id_formats.ts new file mode 100644 index 0000000000000..fb89001425d94 --- /dev/null +++ b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/assert_id_formats.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { IdFormat } from '@kbn/infra-plugin/common/http_api/latest'; + +const rateHashedPattern = /logs-[0-9a-fA-F]{32,}-log-entry-rate/; +const rateLegacyPattern = /kibana-logs-ui-.*-.*-log-entry-rate/; +const categoriesCountHashedPattern = /logs-[0-9a-fA-F]{32,}-log-entry-categories-count/; +const categoriesCountLegacyPattern = /kibana-logs-ui-.*-.*-log-entry-categories-count/; + +export function assertIdFormats( + url: string, + expected: { + 'log-entry-rate': IdFormat | undefined; + 'log-entry-categories-count': IdFormat | undefined; + } +) { + const idFormats = extractIdFormats(url); + expect(idFormats).to.eql(expected); +} + +function extractIdFormats(url: string) { + let rateFormat; + if (rateHashedPattern.test(url)) { + rateFormat = 'hashed'; + } else if (rateLegacyPattern.test(url)) { + rateFormat = 'legacy'; + } + + let categoriesCountFormat; + if (categoriesCountHashedPattern.test(url)) { + categoriesCountFormat = 'hashed'; + } else if (categoriesCountLegacyPattern.test(url)) { + categoriesCountFormat = 'legacy'; + } + + return { + 'log-entry-rate': rateFormat, + 'log-entry-categories-count': categoriesCountFormat, + }; +} diff --git a/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/ml_job_configs.ts b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/ml_job_configs.ts new file mode 100644 index 0000000000000..facd1a059d3f5 --- /dev/null +++ b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/ml_job_configs.ts @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TypeOf } from '@kbn/config-schema'; +import { setupModuleBodySchema } from '@kbn/ml-plugin/server/routes/schemas/modules'; + +export interface MlJob { + jobId: string; + module: 'logs_ui_analysis' | 'logs_ui_categories'; + config: TypeOf; +} + +const rateConfig = { + prefix: '', + start: Date.now(), + indexPatternName: 'filebeat-*', + startDatafeed: true, + useDedicatedIndex: true, + jobOverrides: [ + { + job_id: 'log-entry-rate', + analysis_config: { + bucket_span: '900000ms', + }, + data_description: { + time_field: '@timestamp', + }, + custom_settings: { + logs_source_config: { + indexPattern: 'filebeat-*', + timestampField: '@timestamp', + bucketSpan: 900000, + }, + }, + }, + ], + datafeedOverrides: [ + { + job_id: 'log-entry-rate', + runtime_mappings: {}, + }, + ], +}; + +const categoriesCountConfig = { + prefix: '', + start: Date.now(), + indexPatternName: 'filebeat-*', + startDatafeed: true, + useDedicatedIndex: true, + jobOverrides: [ + { + job_id: 'log-entry-categories-count', + analysis_config: { + bucket_span: '900000ms', + }, + data_description: { + time_field: '@timestamp', + }, + custom_settings: { + logs_source_config: { + indexPattern: 'filebeat-*', + timestampField: '@timestamp', + bucketSpan: 900000, + datasetFilter: { + type: 'includeAll', + }, + }, + }, + }, + ], + datafeedOverrides: [ + { + job_id: 'log-entry-categories-count', + runtime_mappings: {}, + }, + ], + query: { + bool: { + filter: [ + { + exists: { + field: 'message', + }, + }, + ], + }, + }, +}; + +export const hashedRateJob: MlJob = { + jobId: 'logs-11558ee526445db2b42eb3d6b4af58d0-log-entry-rate', + module: 'logs_ui_analysis', + config: { + ...rateConfig, + prefix: 'logs-11558ee526445db2b42eb3d6b4af58d0-', + }, +}; + +export const hashedCategoriesCountJob: MlJob = { + jobId: 'logs-11558ee526445db2b42eb3d6b4af58d0-log-entry-categories-count', + module: 'logs_ui_categories', + config: { + ...categoriesCountConfig, + prefix: 'logs-11558ee526445db2b42eb3d6b4af58d0-', + }, +}; + +export const legacyRateJob: MlJob = { + jobId: 'kibana-logs-ui-default-default-log-entry-rate', + module: 'logs_ui_analysis', + config: { + ...rateConfig, + prefix: 'kibana-logs-ui-default-default-', + }, +}; + +export const legacyCategoriesCountJob: MlJob = { + jobId: 'kibana-logs-ui-default-default-log-entry-categories-count', + module: 'logs_ui_categories', + config: { + ...categoriesCountConfig, + prefix: 'kibana-logs-ui-default-default-', + }, +}; diff --git a/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/ml_job_helper.ts b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/ml_job_helper.ts new file mode 100644 index 0000000000000..7c6dcc9b5575f --- /dev/null +++ b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/ml_job_helper.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { MlApi } from '../../../../services/ml/api'; +import { MlJob } from './ml_job_configs'; + +export function createMlJobHelper(ml: MlApi) { + async function createMlJobs(jobs: MlJob[]) { + for (const mlJob of jobs) { + await ml.setupModule(mlJob.module, mlJob.config, 'default'); + await ml.waitForAnomalyDetectionJobToExist(mlJob.jobId); + } + } + + async function deleteMlJobs(jobs: MlJob[]) { + for (const mlJob of jobs) { + await ml.deleteAnomalyDetectionJobES(mlJob.jobId); + await ml.waitForAnomalyDetectionJobNotToExist(mlJob.jobId); + } + } + + return { createMlJobs, deleteMlJobs }; +} + +export type MlJobHelper = ReturnType; diff --git a/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/request_tracker.ts b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/request_tracker.ts new file mode 100644 index 0000000000000..fe7fb5a49b15d --- /dev/null +++ b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/request_tracker.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Browser } from '../../../../../../../test/functional/services/common/browser'; +import { CommonPageObject } from '../../../../../../../test/functional/page_objects/common_page'; + +type PerformanceResourceTimingWithHttpStatus = PerformanceResourceTiming & { + responseStatus: number; +}; + +export interface RequestLogEntry { + url: string; + timestamp: number; + status: number; +} + +declare global { + interface Window { + ftrLogsUiAnomalies?: { + requests: RequestLogEntry[]; + observer: PerformanceObserver; + }; + } +} + +export function createRequestTracker(browser: Browser, common: CommonPageObject) { + async function install() { + await browser.execute(() => { + function handleTimings(entryList: PerformanceObserverEntryList) { + const entries = entryList.getEntriesByType( + 'resource' + ) as PerformanceResourceTimingWithHttpStatus[]; + + entries + .filter((entry) => entry.initiatorType === 'fetch') + .forEach((entry) => { + if (window.ftrLogsUiAnomalies) { + window.ftrLogsUiAnomalies.requests.push({ + url: entry.name, + timestamp: entry.startTime, + status: entry.responseStatus, + }); + } else { + throw new Error('Request tracker not installed'); + } + }); + } + + const observer = new PerformanceObserver(handleTimings); + observer.observe({ type: 'resource', buffered: true }); + + window.ftrLogsUiAnomalies = { + observer, + requests: [], + }; + }); + } + + async function getRequests(pattern: RegExp, timeToWait: number = 0) { + if (timeToWait > 0) { + await common.sleep(timeToWait); + } + + // Passing RegExp to the browser doesn't seem to serialize well + // so we pass a string, but .toString returns it like /pattern/ which + // when we compile it in the browser gets escaped to /\/pattern\// + // thus we remove the surrounding slashes + const patternString = pattern.toString(); + const trimmedPattern = patternString.substring(1, patternString.length - 1); + + return await browser.execute((browserPattern: string) => { + const regExp = new RegExp(browserPattern); + if (window.ftrLogsUiAnomalies) { + const entries = window.ftrLogsUiAnomalies.requests.filter((entry) => + regExp.test(entry.url) + ); + entries.sort((a, b) => a.timestamp - b.timestamp); + return entries; + } else { + throw new Error('Request tracker not installed'); + } + }, trimmedPattern); + } + + async function uninstall() { + await browser.execute(() => { + if (window.ftrLogsUiAnomalies) { + window.ftrLogsUiAnomalies.observer.disconnect(); + delete window.ftrLogsUiAnomalies; + } else { + throw new Error('Request tracker not installed'); + } + }); + } + + return { install, getRequests, uninstall }; +} diff --git a/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/tests.ts b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/tests.ts new file mode 100644 index 0000000000000..06ea712c7ccc0 --- /dev/null +++ b/x-pack/test/functional/apps/infra/logs/ml_job_id_formats/tests.ts @@ -0,0 +1,322 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; +import { assertIdFormats } from './assert_id_formats'; +import { createMlJobHelper, MlJobHelper } from './ml_job_helper'; +import { createRequestTracker } from './request_tracker'; +import { + hashedRateJob, + hashedCategoriesCountJob, + legacyRateJob, + legacyCategoriesCountJob, +} from './ml_job_configs'; + +const anomalyDetectorsPattern = + /anomaly_detectors\/.*-log-entry-(rate|categories-count)\/results\/overall_buckets/; + +export default ({ getService, getPageObjects }: FtrProviderContext) => { + const retry = getService('retry'); + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const pageObjects = getPageObjects(['common']); + const logsUi = getService('logsUi'); + const ml = getService('ml'); + const requestTracker = createRequestTracker(browser, pageObjects.common); + let mlJobHelper: MlJobHelper; + + // Disabled until https://github.com/elastic/kibana/issues/171913 is addressed + describe.skip('ML job ID formats', function () { + this.beforeAll(async () => { + // Access to ml.api has to happen inside a test or test hook + mlJobHelper = createMlJobHelper(ml.api); + await esArchiver.load('x-pack/test/functional/es_archives/infra/simple_logs'); + }); + + this.afterAll(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/infra/simple_logs'); + }); + + describe('hashed format', () => { + // The hashed format always takes priority. If, for some reason, the same job exists + // in both formats, only the hashed format job will be used. + + it('loads rate job in the hashed ID format', async () => { + await mlJobHelper.createMlJobs([hashedRateJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': 'hashed', + 'log-entry-categories-count': undefined, + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([hashedRateJob]); + }); + + it('loads category count job in the hashed ID format', async () => { + await mlJobHelper.createMlJobs([hashedCategoriesCountJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': undefined, + 'log-entry-categories-count': 'hashed', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([hashedCategoriesCountJob]); + }); + + it('loads rate and category count job in the hashed ID format', async () => { + await mlJobHelper.createMlJobs([hashedRateJob, hashedCategoriesCountJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': 'hashed', + 'log-entry-categories-count': 'hashed', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([hashedRateJob, hashedCategoriesCountJob]); + }); + }); + + describe('legacy format', () => { + it('loads rate job in the legacy ID format', async () => { + await mlJobHelper.createMlJobs([legacyRateJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': 'legacy', + 'log-entry-categories-count': undefined, + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([legacyRateJob]); + }); + + it('loads category count job in the legacy ID format', async () => { + await mlJobHelper.createMlJobs([legacyCategoriesCountJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': undefined, + 'log-entry-categories-count': 'legacy', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([legacyCategoriesCountJob]); + }); + + it('loads rate and category count job in the legacy ID format', async () => { + await mlJobHelper.createMlJobs([legacyRateJob, legacyCategoriesCountJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': 'legacy', + 'log-entry-categories-count': 'legacy', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([legacyRateJob, legacyCategoriesCountJob]); + }); + }); + + describe('mixed formats', () => { + it('loads rate job in the hashed format and category count job in the legacy format', async () => { + await mlJobHelper.createMlJobs([hashedRateJob, legacyCategoriesCountJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': 'hashed', + 'log-entry-categories-count': 'legacy', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([hashedRateJob, legacyCategoriesCountJob]); + }); + + it('loads rate job in the legacy format and category count job in the hashed format', async () => { + await mlJobHelper.createMlJobs([legacyRateJob, hashedCategoriesCountJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + assertIdFormats(requests[0].url, { + 'log-entry-rate': 'legacy', + 'log-entry-categories-count': 'hashed', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([legacyRateJob, hashedCategoriesCountJob]); + }); + }); + + describe('creation and recreation', () => { + it('create first ML job', async () => { + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getSetupScreen()).to.be.ok(); + }); + + await logsUi.logEntryRatePage.startJobSetup(); + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getSetupFlyout()).to.be.ok(); + }); + + await logsUi.logEntryRatePage.startRateJobCreation(); + await retry.waitFor( + 'Create ML job button is enabled', + async () => await logsUi.logEntryRatePage.canCreateJob() + ); + + await logsUi.logEntryRatePage.createJob(); + await retry.waitFor( + 'ML job created', + async () => await logsUi.logEntryRatePage.jobCreationDone() + ); + + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + + assertIdFormats(requests[requests.length - 1].url, { + 'log-entry-rate': 'hashed', + 'log-entry-categories-count': undefined, + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([hashedRateJob]); + }); + + it('create second ML job', async () => { + await mlJobHelper.createMlJobs([legacyRateJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + + await logsUi.logEntryRatePage.manageMlJobs(); + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getSetupFlyout()).to.be.ok(); + }); + + await logsUi.logEntryRatePage.startCategoriesCountJobCreation(); + await retry.waitFor( + 'Create ML job button is enabled', + async () => await logsUi.logEntryRatePage.canCreateJob() + ); + + await logsUi.logEntryRatePage.createJob(); + await retry.waitFor( + 'ML job created', + async () => await logsUi.logEntryRatePage.jobCreationDone() + ); + + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + + assertIdFormats(requests[requests.length - 1].url, { + 'log-entry-rate': 'legacy', + 'log-entry-categories-count': 'hashed', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([legacyRateJob, hashedCategoriesCountJob]); + }); + + it('migrate legacy job', async () => { + await mlJobHelper.createMlJobs([legacyRateJob, hashedCategoriesCountJob]); + await logsUi.logEntryRatePage.navigateTo(); + await requestTracker.install(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getResultsScreen()).to.be.ok(); + }); + + await logsUi.logEntryRatePage.manageMlJobs(); + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getSetupFlyout()).to.be.ok(); + }); + + await logsUi.logEntryRatePage.startRateJobCreation(); + await retry.waitFor( + 'Recreate ML job button is enabled', + async () => await logsUi.logEntryRatePage.canRecreateJob() + ); + + await logsUi.logEntryRatePage.recreateJob(); + await retry.waitFor( + 'ML job recreated', + async () => await logsUi.logEntryRatePage.jobCreationDone() + ); + + const requests = await requestTracker.getRequests(anomalyDetectorsPattern, 2000); + expect(requests).not.to.be.empty(); + + assertIdFormats(requests[requests.length - 1].url, { + 'log-entry-rate': 'hashed', + 'log-entry-categories-count': 'hashed', + }); + + await requestTracker.uninstall(); + await mlJobHelper.deleteMlJobs([hashedRateJob, hashedCategoriesCountJob]); + }); + }); + }); +}; diff --git a/x-pack/test/functional/apps/maps/group4/mvt_geotile_grid.js b/x-pack/test/functional/apps/maps/group4/mvt_geotile_grid.js index 081a1a41a93df..55e504e207d4a 100644 --- a/x-pack/test/functional/apps/maps/group4/mvt_geotile_grid.js +++ b/x-pack/test/functional/apps/maps/group4/mvt_geotile_grid.js @@ -53,7 +53,7 @@ export default function ({ getPageObjects, getService }) { index: 'logstash-*', gridPrecision: '8', renderAs: 'grid', - requestBody: `(aggs:(max_of_bytes:(max:(field:bytes))),fields:!((field:'@timestamp',format:date_time),(field:'relatedContent.article:modified_time',format:date_time),(field:'relatedContent.article:published_time',format:date_time),(field:utc_time,format:date_time)),query:(bool:(filter:!((range:('@timestamp':(format:strict_date_optional_time,gte:'2015-09-20T00:00:00.000Z',lte:'2015-09-20T01:00:00.000Z')))),must:!(),must_not:!(),should:!())),runtime_mappings:())`, + requestBody: `(aggs:(max_of_bytes:(max:(field:bytes))),fields:!((field:'@timestamp',format:date_time),(field:'relatedContent.article:modified_time',format:date_time),(field:'relatedContent.article:published_time',format:date_time),(field:utc_time,format:date_time)),query:(bool:(filter:!((range:('@timestamp':(format:strict_date_optional_time,gte:'2015-09-20T00:00:00.000Z',lte:'2015-09-20T01:00:00.000Z'))),(exists:(field:geo.coordinates))),must:!(),must_not:!(),should:!())),runtime_mappings:())`, }); //Should correctly load meta for style-rule (sigma is set to 1, opacity to 1) diff --git a/x-pack/test/functional/apps/maps/group4/mvt_scaling.js b/x-pack/test/functional/apps/maps/group4/mvt_scaling.js index cd779392ba821..e624ab39dee12 100644 --- a/x-pack/test/functional/apps/maps/group4/mvt_scaling.js +++ b/x-pack/test/functional/apps/maps/group4/mvt_scaling.js @@ -55,7 +55,7 @@ export default function ({ getPageObjects, getService }) { hasLabels: 'false', index: 'geo_shapes*', requestBody: - '(fields:!(prop1),query:(bool:(filter:!(),must:!(),must_not:!(),should:!())),runtime_mappings:(),size:10001)', + '(fields:!(prop1),query:(bool:(filter:!((exists:(field:geometry))),must:!(),must_not:!(),should:!())),runtime_mappings:(),size:10001)', }); }); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_charts_dashboard_embeddables.ts b/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_charts_dashboard_embeddables.ts index 9927f37a6c8f9..19b48858b115b 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_charts_dashboard_embeddables.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_charts_dashboard_embeddables.ts @@ -40,7 +40,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); await PageObjects.common.setTime({ from, to }); @@ -48,7 +48,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); await PageObjects.common.unsetTime(); }); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_embeddables_migration.ts b/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_embeddables_migration.ts index 2760c3c136557..8e942d8e1e4b5 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_embeddables_migration.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_integrations/anomaly_embeddables_migration.ts @@ -70,7 +70,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); @@ -85,7 +85,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_integrations/map_to_ml.ts b/x-pack/test/functional/apps/ml/anomaly_detection_integrations/map_to_ml.ts index 3ce45876f77b1..f77c46de6341e 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_integrations/map_to_ml.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_integrations/map_to_ml.ts @@ -36,7 +36,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await ml.securityUI.loginAsMlPowerUser(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await kibanaServer.importExport.load(dashboardArchive); await browser.setWindowSize(1920, 1080); }); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/advanced_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/advanced_job.ts index 2c9c9cb7a6b98..db5be20f2e978 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/advanced_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/advanced_job.ts @@ -199,8 +199,8 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/categorization_small'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); - await ml.testResources.createIndexPatternIfNeeded('ft_categorization_small', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_categorization_small', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createCalendar(calendarId); @@ -209,8 +209,8 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); - await ml.testResources.deleteIndexPatternByTitle('ft_categorization_small'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_categorization_small'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/categorization_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/categorization_job.ts index b1939d75d05c3..cbdc873286f07 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/categorization_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/categorization_job.ts @@ -86,7 +86,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/categorization_small'); - await ml.testResources.createIndexPatternIfNeeded('ft_categorization_small', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_categorization_small', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createCalendar(calendarId); @@ -95,7 +95,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_categorization_small'); + await ml.testResources.deleteDataViewByTitle('ft_categorization_small'); }); it('job creation loads the categorization wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_jobs_to_advanced_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_jobs_to_advanced_job.ts index 49383315df1f9..4ca0079a0e438 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_jobs_to_advanced_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_jobs_to_advanced_job.ts @@ -209,8 +209,8 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/categorization_small'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); - await ml.testResources.createIndexPatternIfNeeded('ft_categorization_small', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_categorization_small', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -220,8 +220,8 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); - await ml.testResources.deleteIndexPatternByTitle('ft_categorization_small'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_categorization_small'); }); describe('from multi-metric job creation wizard', function () { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_single_metric_job_to_multi_metric.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_single_metric_job_to_multi_metric.ts index c469440030038..ba90e58524bc9 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_single_metric_job_to_multi_metric.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/convert_single_metric_job_to_multi_metric.ts @@ -16,16 +16,16 @@ export default function ({ getService }: FtrProviderContext) { const calendarId = `wizard-test-calendar_${Date.now()}`; const remoteName = 'ftr-remote:'; - const indexPatternName = 'ft_farequote'; - const indexPatternString = config.get('esTestCluster.ccs') - ? remoteName + indexPatternName - : indexPatternName; + const esIndexPatternName = 'ft_farequote'; + const esIndexPatternString = config.get('esTestCluster.ccs') + ? remoteName + esIndexPatternName + : esIndexPatternName; describe('single metric job conversion to multi-metric job', function () { this.tags(['ml']); before(async () => { await esNode.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded(indexPatternString, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(esIndexPatternString, '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createCalendar(calendarId); @@ -34,7 +34,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle(indexPatternString); + await ml.testResources.deleteDataViewByTitle(esIndexPatternString); }); const jobId = `fq_single_to_multi_${Date.now()}`; @@ -59,7 +59,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.jobManagement.navigateToNewJobSourceSelection(); await ml.testExecution.logTestStep('loads the job type selection page'); - await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(indexPatternString); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(esIndexPatternString); await ml.testExecution.logTestStep('loads the single metric job wizard page'); await ml.jobTypeSelection.selectSingleMetricJob(); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/custom_urls.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/custom_urls.ts index dd8b72c3504af..5a557d2270944 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/custom_urls.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/custom_urls.ts @@ -69,7 +69,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); testDashboardId = await ml.testResources.createMLTestDashboardIfNeeded(); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -80,7 +80,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.testResources.deleteMLTestDashboard(); await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('opens the custom URLs tab in the edit job flyout', async () => { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/date_nanos_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/date_nanos_job.ts index d63f6af6c0486..864d89b2b08f3 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/date_nanos_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/date_nanos_job.ts @@ -94,17 +94,14 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/event_rate_nanos'); - await ml.testResources.createIndexPatternIfNeeded( - 'ft_event_rate_gen_trend_nanos', - '@timestamp' - ); + await ml.testResources.createDataViewIfNeeded('ft_event_rate_gen_trend_nanos', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); }); after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_event_rate_gen_trend_nanos'); + await ml.testResources.deleteDataViewByTitle('ft_event_rate_gen_trend_nanos'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/delete_job_and_delete_annotations.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/delete_job_and_delete_annotations.ts index 13ab18934f942..ebfc468ff86d4 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/delete_job_and_delete_annotations.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/delete_job_and_delete_annotations.ts @@ -20,10 +20,10 @@ export default function ({ getService }: FtrProviderContext) { const ml = getService('ml'); const remoteName = 'ftr-remote:'; - const indexPatternName = 'ft_farequote'; - const indexPatternString = config.get('esTestCluster.ccs') - ? remoteName + indexPatternName - : indexPatternName; + const esIndexPatternName = 'ft_farequote'; + const esIndexPatternString = config.get('esTestCluster.ccs') + ? remoteName + esIndexPatternName + : esIndexPatternName; const testSetupJobConfigs = [SINGLE_METRIC_JOB_CONFIG, MULTI_METRIC_JOB_CONFIG]; @@ -64,7 +64,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esNode.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded(indexPatternString, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(esIndexPatternString, '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); @@ -72,7 +72,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle(indexPatternString); + await ml.testResources.deleteDataViewByTitle(esIndexPatternString); }); for (const { suiteTitle, jobId, deleteAnnotations, expectedAnnotations } of testConfigs) { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/geo_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/geo_job.ts index daed44cce85fa..35d6d40cdbe27 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/geo_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/geo_job.ts @@ -84,7 +84,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createCalendar(calendarId); @@ -93,7 +93,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); }); it('job creation loads the geo wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/multi_metric_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/multi_metric_job.ts index 9bbfdef22ce55..fa2e5d11eca0e 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/multi_metric_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/multi_metric_job.ts @@ -84,7 +84,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createCalendar(calendarId); @@ -93,7 +93,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('job creation loads the multi metric wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/population_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/population_job.ts index ea02186c45b74..5451ea16d8e4c 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/population_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/population_job.ts @@ -98,7 +98,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createCalendar(calendarId); @@ -107,7 +107,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); }); it('job creation loads the population wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/saved_search_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/saved_search_job.ts index 7d9c528d763d7..b8493e2daa1b6 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/saved_search_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/saved_search_job.ts @@ -269,7 +269,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.createSavedSearchFarequoteFilterIfNeeded(); await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded(); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded(); @@ -283,7 +283,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job.ts index b1575f0fa57ba..7ce5d1838a1a5 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job.ts @@ -75,10 +75,10 @@ export default function ({ getService }: FtrProviderContext) { const calendarId = `wizard-test-calendar_${Date.now()}`; const remoteName = 'ftr-remote:'; - const indexPatternName = 'ft_farequote'; - const indexPatternString = config.get('esTestCluster.ccs') - ? remoteName + indexPatternName - : indexPatternName; + const esIndexPatternName = 'ft_farequote'; + const esIndexPatternString = config.get('esTestCluster.ccs') + ? remoteName + esIndexPatternName + : esIndexPatternName; const fieldStatsEntries = [ { @@ -92,7 +92,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esNode.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded(indexPatternString, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(esIndexPatternString, '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createCalendar(calendarId); @@ -101,7 +101,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle(indexPatternString); + await ml.testResources.deleteDataViewByTitle(esIndexPatternString); }); it('job creation loads the single metric wizard for the source data', async () => { @@ -113,7 +113,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.jobManagement.navigateToNewJobSourceSelection(); await ml.testExecution.logTestStep('job creation loads the job type selection page'); - await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(indexPatternString); + await ml.jobSourceSelection.selectSourceForAnomalyDetectionJob(esIndexPatternString); await ml.testExecution.logTestStep('job creation loads the single metric job wizard page'); await ml.jobTypeSelection.selectSingleMetricJob(); @@ -230,7 +230,7 @@ export default function ({ getService }: FtrProviderContext) { it('job cloning creates a temporary data view and opens the single metric wizard if a matching data view does not exist', async () => { await ml.testExecution.logTestStep('delete data view used by job'); - await ml.testResources.deleteIndexPatternByTitle(indexPatternString); + await ml.testResources.deleteDataViewByTitle(esIndexPatternString); // Refresh page to ensure page has correct cache of data views await browser.refresh(); @@ -244,7 +244,7 @@ export default function ({ getService }: FtrProviderContext) { it('job cloning opens the existing job in the single metric wizard', async () => { await ml.testExecution.logTestStep('recreate data view used by job'); - await ml.testResources.createIndexPatternIfNeeded(indexPatternString, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(esIndexPatternString, '@timestamp'); await ml.navigation.navigateToMl(); await ml.navigation.navigateToJobManagement(); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job_without_datafeed_start.ts b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job_without_datafeed_start.ts index 4cdea1a726fe9..7d1724fbd0181 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job_without_datafeed_start.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_jobs/single_metric_job_without_datafeed_start.ts @@ -60,7 +60,7 @@ export default function ({ getService }: FtrProviderContext) { this.tags(['ml']); before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); @@ -68,7 +68,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('job creation loads the single metric wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts index 66261321ccb80..4d9fd0bbead81 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/aggregated_scripted_job.ts @@ -364,16 +364,16 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); }); after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); }); for (const testData of supportedTestSuites) { describe(testData.suiteTitle, function () { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/annotations.ts b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/annotations.ts index 05e38d565e969..ab1177d2dbc84 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/annotations.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/annotations.ts @@ -32,7 +32,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); const JOB_CONFIG = ml.commonConfig.getADFqSingleMetricJobConfig(jobId); @@ -47,7 +47,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); describe('creating', function () { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/anomaly_explorer.ts b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/anomaly_explorer.ts index 29cc28993d6c2..a6e867676d10f 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/anomaly_explorer.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/anomaly_explorer.ts @@ -76,7 +76,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.createMLTestDashboardIfNeeded(); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -85,7 +85,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await ml.testResources.deleteMLTestDashboard(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts index 93ec331230a8a..3a60e8fca97c2 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts @@ -45,7 +45,7 @@ export default function ({ getService }: FtrProviderContext) { describe('with single metric job', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createAndRunAnomalyDetectionLookbackJob(JOB_CONFIG, DATAFEED_CONFIG); @@ -54,7 +54,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('opens a job from job list link', async () => { diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/single_metric_viewer.ts b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/single_metric_viewer.ts index 809ebf204e2a7..1779589a5a0c1 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/single_metric_viewer.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/single_metric_viewer.ts @@ -46,7 +46,7 @@ export default function ({ getService }: FtrProviderContext) { describe('with single metric job', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createAndRunAnomalyDetectionLookbackJob(JOB_CONFIG, DATAFEED_CONFIG); @@ -55,7 +55,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('opens a job from job list link', async () => { @@ -134,7 +134,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createAndRunAnomalyDetectionLookbackJob(jobConfig, datafeedConfig); await ml.securityUI.loginAsMlPowerUser(); @@ -142,7 +142,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); }); it('opens a job from job list link', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts index 6dd953a84e4d0..9bf4bc7c41c15 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation.ts @@ -17,7 +17,7 @@ import { const testDiscoverCustomUrl: DiscoverUrlConfig = { label: 'Show data', - indexPattern: 'ft_bank_marketing', + indexName: 'ft_bank_marketing', queryEntityFieldNames: ['day'], timeRange: TIME_RANGE_TYPE.AUTO, }; @@ -43,7 +43,7 @@ export default function ({ getService }: FtrProviderContext) { let testDashboardId: string | null = null; before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/bm_classification'); - await ml.testResources.createIndexPatternIfNeeded('ft_bank_marketing'); + await ml.testResources.createDataViewIfNeeded('ft_bank_marketing'); await ml.testResources.setKibanaTimeZoneToUTC(); testDashboardId = await ml.testResources.createMLTestDashboardIfNeeded(); @@ -52,7 +52,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_bank_marketing'); + await ml.testResources.deleteDataViewByTitle('ft_bank_marketing'); }); const jobId = `bm_1_${Date.now()}`; @@ -76,7 +76,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'y', trainingPercent: 20, modelMemory: '60mb', - createIndexPattern: true, + createDataView: true, fieldStatsEntries: [ { fieldName: 'age', @@ -201,7 +201,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await ml.api.deleteIndices(testData.destinationIndex); - await ml.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await ml.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the data frame analytics wizard', async () => { @@ -338,10 +338,8 @@ export default function ({ getService }: FtrProviderContext) { await ml.dataFrameAnalyticsCreation.continueToCreateStep(); await ml.testExecution.logTestStep('sets the create data view switch'); - await ml.dataFrameAnalyticsCreation.assertCreateIndexPatternSwitchExists(); - await ml.dataFrameAnalyticsCreation.setCreateIndexPatternSwitchState( - testData.createIndexPattern - ); + await ml.dataFrameAnalyticsCreation.assertCreateDataViewSwitchExists(); + await ml.dataFrameAnalyticsCreation.setCreateDataViewSwitchState(testData.createDataView); }); it('runs the analytics job and displays it correctly in the job list', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation_saved_search.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation_saved_search.ts index 1444c13192e56..6efa43ac14cca 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation_saved_search.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/classification_creation_saved_search.ts @@ -18,7 +18,7 @@ export default function ({ getService }: FtrProviderContext) { describe.skip('classification saved search creation', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote_small'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote_small', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote_small', '@timestamp'); await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded('ft_farequote_small'); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded('ft_farequote_small'); // Need to use the saved searches with filters that match multiple airlines @@ -36,7 +36,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote_small'); + await ml.testResources.deleteDataViewByTitle('ft_farequote_small'); }); const dateNow = Date.now(); @@ -93,7 +93,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'airline', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { fieldStatsValues: { airline: ['AAL', 'AWE', 'ASA', 'ACA', 'AMX'] } as Record< string, @@ -193,7 +193,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'airline', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { fieldStatsValues: { airline: ['AAL', 'AWE', 'ASA', 'ACA', 'AMX'] } as Record< string, @@ -293,7 +293,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'airline', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { fieldStatsValues: { airline: ['AAL', 'ASA'], @@ -385,7 +385,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'airline', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { fieldStatsValues: { airline: ['ASA', 'FFT'] } as Record, source: 'ft_farequote_small', @@ -463,7 +463,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await ml.api.deleteIndices(testData.destinationIndex); - await ml.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await ml.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the data frame analytics wizard', async () => { @@ -592,10 +592,8 @@ export default function ({ getService }: FtrProviderContext) { await ml.dataFrameAnalyticsCreation.continueToCreateStep(); await ml.testExecution.logTestStep('sets the create data view switch'); - await ml.dataFrameAnalyticsCreation.assertCreateIndexPatternSwitchExists(); - await ml.dataFrameAnalyticsCreation.setCreateIndexPatternSwitchState( - testData.createIndexPattern - ); + await ml.dataFrameAnalyticsCreation.assertCreateDataViewSwitchExists(); + await ml.dataFrameAnalyticsCreation.setCreateDataViewSwitchState(testData.createDataView); }); it('runs the analytics job and displays it correctly in the job list', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts index 19baea2c48c1f..da62f44fb305d 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/cloning.ts @@ -19,7 +19,7 @@ export default function ({ getService }: FtrProviderContext) { const testDataList: Array<{ suiteTitle: string; archive: string; - indexPattern: { name: string; timeField: string }; + dataView: { name: string; timeField: string }; job: DeepPartial; }> = (() => { const timestamp = Date.now(); @@ -28,7 +28,7 @@ export default function ({ getService }: FtrProviderContext) { { suiteTitle: 'classification job supported by the form', archive: 'x-pack/test/functional/es_archives/ml/bm_classification', - indexPattern: { name: 'ft_bank_marketing', timeField: '@timestamp' }, + dataView: { name: 'ft_bank_marketing', timeField: '@timestamp' }, job: { id: `bm_1_${timestamp}`, description: @@ -63,7 +63,7 @@ export default function ({ getService }: FtrProviderContext) { { suiteTitle: 'outlier detection job supported by the form', archive: 'x-pack/test/functional/es_archives/ml/ihp_outlier', - indexPattern: { name: 'ft_ihp_outlier', timeField: '@timestamp' }, + dataView: { name: 'ft_ihp_outlier', timeField: '@timestamp' }, job: { id: `ihp_1_${timestamp}`, description: 'This is the job description', @@ -92,7 +92,7 @@ export default function ({ getService }: FtrProviderContext) { { suiteTitle: 'regression job supported by the form', archive: 'x-pack/test/functional/es_archives/ml/egs_regression', - indexPattern: { name: 'ft_egs_regression', timeField: '@timestamp' }, + dataView: { name: 'ft_egs_regression', timeField: '@timestamp' }, job: { id: `egs_1_${timestamp}`, description: 'This is the job description', @@ -141,9 +141,9 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded(testData.archive); - await ml.testResources.createIndexPatternIfNeeded( - testData.indexPattern.name, - testData.indexPattern.timeField + await ml.testResources.createDataViewIfNeeded( + testData.dataView.name, + testData.dataView.timeField ); await ml.api.createDataFrameAnalyticsJob(testData.job as DataFrameAnalyticsConfig); @@ -157,9 +157,9 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.deleteIndices(cloneDestIndex); await ml.api.deleteIndices(testData.job.dest!.index as string); - await ml.testResources.deleteIndexPatternByTitle(testData.job.dest!.index as string); - await ml.testResources.deleteIndexPatternByTitle(cloneDestIndex); - await ml.testResources.deleteIndexPatternByTitle(testData.indexPattern.name); + await ml.testResources.deleteDataViewByTitle(testData.job.dest!.index as string); + await ml.testResources.deleteDataViewByTitle(cloneDestIndex); + await ml.testResources.deleteDataViewByTitle(testData.dataView.name); }); it('opens the existing job in the data frame analytics job wizard', async () => { 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 a5dad1827d27d..dac2d1ae1fa36 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 @@ -15,7 +15,7 @@ import { const testDiscoverCustomUrl: DiscoverUrlConfig = { label: 'Show data', - indexPattern: 'ft_farequote', + indexName: 'ft_farequote', queryEntityFieldNames: ['airline'], timeRange: TIME_RANGE_TYPE.AUTO, }; @@ -70,7 +70,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); await ml.api.createAndRunDFAJob(dfaJobConfig); @@ -79,7 +79,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); await ml.api.deleteIndices('user-farequote_small'); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); describe('run custom urls', function () { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts index 8b4514add92cb..85624edc27a58 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts @@ -17,7 +17,7 @@ import { const testDiscoverCustomUrl: DiscoverUrlConfig = { label: 'Show data', - indexPattern: 'ft_ihp_outlier', + indexName: 'ft_ihp_outlier', queryEntityFieldNames: ['SaleType'], timeRange: TIME_RANGE_TYPE.AUTO, }; @@ -44,7 +44,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ihp_outlier'); - await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier'); + await ml.testResources.createDataViewIfNeeded('ft_ihp_outlier'); testDashboardId = await ml.testResources.createMLTestDashboardIfNeeded(); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -53,7 +53,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_ihp_outlier'); + await ml.testResources.deleteDataViewByTitle('ft_ihp_outlier'); }); const jobId = `ihp_1_${Date.now()}`; @@ -83,7 +83,7 @@ export default function ({ getService }: FtrProviderContext) { }, }, modelMemory: '5mb', - createIndexPattern: true, + createDataView: true, advancedEditorContent: [ '{', ' "description": "Outlier detection job based on ft_ihp_outlier dataset with runtime fields",', @@ -192,7 +192,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await ml.api.deleteIndices(testData.destinationIndex); - await ml.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await ml.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the data frame analytics wizard', async () => { @@ -324,10 +324,8 @@ export default function ({ getService }: FtrProviderContext) { await ml.dataFrameAnalyticsCreation.continueToCreateStep(); await ml.testExecution.logTestStep('sets the create data view switch'); - await ml.dataFrameAnalyticsCreation.assertCreateIndexPatternSwitchExists(); - await ml.dataFrameAnalyticsCreation.setCreateIndexPatternSwitchState( - testData.createIndexPattern - ); + await ml.dataFrameAnalyticsCreation.assertCreateDataViewSwitchExists(); + await ml.dataFrameAnalyticsCreation.setCreateDataViewSwitchState(testData.createDataView); }); it('runs the analytics job and displays it correctly in the job list', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation_saved_search.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation_saved_search.ts index a6f68a8eafd0b..eae64ccf532dc 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation_saved_search.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation_saved_search.ts @@ -16,7 +16,7 @@ export default function ({ getService }: FtrProviderContext) { describe('outlier detection saved search creation', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote_small'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote_small', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote_small', '@timestamp'); await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded('ft_farequote_small'); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded('ft_farequote_small'); await ml.testResources.createSavedSearchFarequoteFilterAndLuceneIfNeeded( @@ -31,7 +31,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote_small'); + await ml.testResources.deleteDataViewByTitle('ft_farequote_small'); }); const dateNow = Date.now(); @@ -63,7 +63,7 @@ export default function ({ getService }: FtrProviderContext) { }, }, modelMemory: '1mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', histogramCharts: [ @@ -140,7 +140,7 @@ export default function ({ getService }: FtrProviderContext) { }, }, modelMemory: '65mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', histogramCharts: [ @@ -217,7 +217,7 @@ export default function ({ getService }: FtrProviderContext) { }, }, modelMemory: '65mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', histogramCharts: [ @@ -295,7 +295,7 @@ export default function ({ getService }: FtrProviderContext) { }, }, modelMemory: '65mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', histogramCharts: [ @@ -362,7 +362,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await ml.api.deleteIndices(testData.destinationIndex); - await ml.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await ml.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the data frame analytics wizard', async () => { @@ -463,10 +463,8 @@ export default function ({ getService }: FtrProviderContext) { await ml.dataFrameAnalyticsCreation.continueToCreateStep(); await ml.testExecution.logTestStep('sets the create data view switch'); - await ml.dataFrameAnalyticsCreation.assertCreateIndexPatternSwitchExists(); - await ml.dataFrameAnalyticsCreation.setCreateIndexPatternSwitchState( - testData.createIndexPattern - ); + await ml.dataFrameAnalyticsCreation.assertCreateDataViewSwitchExists(); + await ml.dataFrameAnalyticsCreation.setCreateDataViewSwitchState(testData.createDataView); }); it('runs the analytics job and displays it correctly in the job list', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts index b4ed75c35043a..d59f31f412325 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts @@ -36,7 +36,7 @@ export default function ({ getService }: FtrProviderContext) { const testDiscoverCustomUrl: DiscoverUrlConfig = { label: 'Show data', - indexPattern: 'ft_egs_regression', + indexName: 'ft_egs_regression', queryEntityFieldNames: ['stabf'], timeRange: TIME_RANGE_TYPE.AUTO, }; @@ -57,7 +57,7 @@ export default function ({ getService }: FtrProviderContext) { let testDashboardId: string | null = null; before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/egs_regression'); - await ml.testResources.createIndexPatternIfNeeded('ft_egs_regression'); + await ml.testResources.createDataViewIfNeeded('ft_egs_regression'); await ml.testResources.setKibanaTimeZoneToUTC(); testDashboardId = await ml.testResources.createMLTestDashboardIfNeeded(); @@ -66,7 +66,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_egs_regression'); + await ml.testResources.deleteDataViewByTitle('ft_egs_regression'); }); const jobId = `egs_1_${Date.now()}`; @@ -90,7 +90,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'stab', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, advancedEditorContent: [ '{', ' "description": "Regression job based on ft_egs_regression dataset with runtime fields",', @@ -197,7 +197,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await ml.api.deleteIndices(testData.destinationIndex); - await ml.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await ml.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the data frame analytics wizard', async () => { @@ -339,10 +339,8 @@ export default function ({ getService }: FtrProviderContext) { await ml.dataFrameAnalyticsCreation.continueToCreateStep(); await ml.testExecution.logTestStep('sets the create data view switch'); - await ml.dataFrameAnalyticsCreation.assertCreateIndexPatternSwitchExists(); - await ml.dataFrameAnalyticsCreation.setCreateIndexPatternSwitchState( - testData.createIndexPattern - ); + await ml.dataFrameAnalyticsCreation.assertCreateDataViewSwitchExists(); + await ml.dataFrameAnalyticsCreation.setCreateDataViewSwitchState(testData.createDataView); }); it('runs the analytics job and displays it correctly in the job list', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation_saved_search.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation_saved_search.ts index 043f546dea69f..a226ea7cdbe7e 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation_saved_search.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation_saved_search.ts @@ -16,7 +16,7 @@ export default function ({ getService }: FtrProviderContext) { describe('regression saved search creation', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote_small'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote_small', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote_small', '@timestamp'); await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded('ft_farequote_small'); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded('ft_farequote_small'); await ml.testResources.createSavedSearchFarequoteFilterAndLuceneIfNeeded( @@ -31,7 +31,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote_small'); + await ml.testResources.deleteDataViewByTitle('ft_farequote_small'); }); const dateNow = Date.now(); @@ -73,7 +73,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'responsetime', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', runtimeFieldsEditorContent: ['{', ' "uppercase_airline": {', ' "type": "keyword",'], @@ -161,7 +161,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'responsetime', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', runtimeFieldsEditorContent: ['{', ' "uppercase_airline": {', ' "type": "keyword",'], @@ -249,7 +249,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'responsetime', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', runtimeFieldsEditorContent: ['{', ' "uppercase_airline": {', ' "type": "keyword",'], @@ -331,7 +331,7 @@ export default function ({ getService }: FtrProviderContext) { dependentVariable: 'responsetime', trainingPercent: 20, modelMemory: '20mb', - createIndexPattern: true, + createDataView: true, expected: { source: 'ft_farequote_small', runtimeFieldsEditorContent: ['{', ' "uppercase_airline": {', ' "type": "keyword",'], @@ -401,7 +401,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await ml.api.deleteIndices(testData.destinationIndex); - await ml.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await ml.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the data frame analytics wizard', async () => { @@ -498,10 +498,8 @@ export default function ({ getService }: FtrProviderContext) { await ml.dataFrameAnalyticsCreation.continueToCreateStep(); await ml.testExecution.logTestStep('sets the create data view switch'); - await ml.dataFrameAnalyticsCreation.assertCreateIndexPatternSwitchExists(); - await ml.dataFrameAnalyticsCreation.setCreateIndexPatternSwitchState( - testData.createIndexPattern - ); + await ml.dataFrameAnalyticsCreation.assertCreateDataViewSwitchExists(); + await ml.dataFrameAnalyticsCreation.setCreateDataViewSwitchState(testData.createDataView); }); it('runs the analytics job and displays it correctly in the job list', async () => { diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts index 77cae02f3cfcb..7ccf329222a55 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/results_view_content.ts @@ -18,7 +18,7 @@ export default function ({ getService }: FtrProviderContext) { const testDataList: Array<{ suiteTitle: string; archive: string; - indexPattern: { name: string; timeField: string }; + dataView: { name: string; timeField: string }; job: DeepPartial; sortBy: { column: string; @@ -38,7 +38,7 @@ export default function ({ getService }: FtrProviderContext) { { suiteTitle: 'binary classification job', archive: 'x-pack/test/functional/es_archives/ml/ihp_outlier', - indexPattern: { name: 'ft_ihp_outlier', timeField: '@timestamp' }, + dataView: { name: 'ft_ihp_outlier', timeField: '@timestamp' }, job: { id: `ihp_fi_binary_${timestamp}`, description: @@ -107,7 +107,7 @@ export default function ({ getService }: FtrProviderContext) { { suiteTitle: 'multi class classification job', archive: 'x-pack/test/functional/es_archives/ml/ihp_outlier', - indexPattern: { name: 'ft_ihp_outlier', timeField: '@timestamp' }, + dataView: { name: 'ft_ihp_outlier', timeField: '@timestamp' }, job: { id: `ihp_fi_multi_${timestamp}`, description: @@ -178,7 +178,7 @@ export default function ({ getService }: FtrProviderContext) { { suiteTitle: 'regression job', archive: 'x-pack/test/functional/es_archives/ml/egs_regression', - indexPattern: { name: 'ft_egs_regression', timeField: '@timestamp' }, + dataView: { name: 'ft_egs_regression', timeField: '@timestamp' }, job: { id: `egs_fi_reg_${timestamp}`, description: 'This is the job description', @@ -252,9 +252,9 @@ export default function ({ getService }: FtrProviderContext) { await ml.securityUI.loginAsMlPowerUser(); for (const testData of testDataList) { await esArchiver.loadIfNeeded(testData.archive); - await ml.testResources.createIndexPatternIfNeeded( - testData.indexPattern.name, - testData.indexPattern.timeField + await ml.testResources.createDataViewIfNeeded( + testData.dataView.name, + testData.dataView.timeField ); await ml.api.createAndRunDFAJob(testData.job as DataFrameAnalyticsConfig); } @@ -263,7 +263,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); for (const testData of testDataList) { - await ml.testResources.deleteIndexPatternByTitle(testData.indexPattern.name); + await ml.testResources.deleteDataViewByTitle(testData.dataView.name); } }); @@ -273,13 +273,13 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToMl(); await ml.navigation.navigateToDataFrameAnalytics(); await ml.dataFrameAnalyticsTable.waitForAnalyticsToLoad(); - await ml.testResources.createIndexPatternIfNeeded(testData.job.dest!.index as string); + await ml.testResources.createDataViewIfNeeded(testData.job.dest!.index as string); await ml.dataFrameAnalyticsTable.openResultsView(testData.job.id as string); }); after(async () => { await ml.api.deleteIndices(testData.job.dest!.index as string); - await ml.testResources.deleteIndexPatternByTitle(testData.job.dest!.index as string); + await ml.testResources.deleteDataViewByTitle(testData.job.dest!.index as string); }); it('should display the total feature importance in the results view', async () => { diff --git a/x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts b/x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts index 5195997c3ba31..bec8999104410 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts @@ -84,10 +84,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('data drift', async function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ihp_outlier'); - await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier'); + await ml.testResources.createDataViewIfNeeded('ft_ihp_outlier'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.createSavedSearchFarequoteFilterAndKueryIfNeeded(); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -97,10 +97,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/ml/ihp_outlier'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/farequote'); await Promise.all([ - ml.testResources.deleteIndexPatternByTitle('ft_fare*'), - ml.testResources.deleteIndexPatternByTitle('ft_fare*,ft_fareq*'), - ml.testResources.deleteIndexPatternByTitle('ft_farequote'), - ml.testResources.deleteIndexPatternByTitle('ft_ihp_outlier'), + ml.testResources.deleteDataViewByTitle('ft_fare*'), + ml.testResources.deleteDataViewByTitle('ft_fare*,ft_fareq*'), + ml.testResources.deleteDataViewByTitle('ft_farequote'), + ml.testResources.deleteDataViewByTitle('ft_ihp_outlier'), ]); }); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts index 073023ed6b5dc..f0185fc371006 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts @@ -26,7 +26,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the saved search selection page` ); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the index data visualizer page` @@ -147,8 +147,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/module_sample_logs'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_module_sample_logs', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_module_sample_logs', '@timestamp'); await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded(); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded(); await ml.testResources.createSavedSearchFarequoteFilterAndKueryIfNeeded(); @@ -159,8 +159,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { after(async () => { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_logs'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_logs'); }); describe('with farequote', function () { @@ -223,7 +223,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the saved search selection page` ); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the index data visualizer page` diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_actions_panel.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_actions_panel.ts index c7e00f8ed5b54..6f259a8120d28 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_actions_panel.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_actions_panel.ts @@ -14,7 +14,7 @@ export default function ({ getService }: FtrProviderContext) { describe('index based actions panel on trial license', function () { this.tags(['ml']); - const indexPatternName = 'ft_farequote'; + const esIndexName = 'ft_farequote'; const advancedJobWizardDatafeedQuery = JSON.stringify( { @@ -33,7 +33,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded(indexPatternName, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(esIndexName, '@timestamp'); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded(); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -42,7 +42,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle(indexPatternName); + await ml.testResources.deleteDataViewByTitle(esIndexName); }); describe('create advanced job action', function () { @@ -52,10 +52,10 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToDataVisualizer(); await ml.testExecution.logTestStep('loads the saved search selection page'); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep('loads the index data visualizer page'); - await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(indexPatternName); + await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(esIndexName); }); it('opens the advanced job wizard', async () => { @@ -84,7 +84,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToDataVisualizer(); await ml.testExecution.logTestStep('loads the saved search selection page'); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep('loads the index data visualizer page'); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(savedSearch); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_data_view_management.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_data_view_management.ts index 6f15f5a33274e..28611dbcb8a1b 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_data_view_management.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_data_view_management.ts @@ -118,7 +118,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the saved search selection page` ); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the index data visualizer page` @@ -182,12 +182,12 @@ export default function ({ getService }: FtrProviderContext) { }); beforeEach(async () => { - await ml.testResources.createIndexPatternIfNeeded(indexPatternTitle, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(indexPatternTitle, '@timestamp'); await navigateToIndexDataVisualizer(originalTestData); }); afterEach(async () => { - await ml.testResources.deleteIndexPatternByTitle(indexPatternTitle); + await ml.testResources.deleteDataViewByTitle(indexPatternTitle); }); it(`adds new field`, async () => { diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_filters.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_filters.ts index be8c06028685f..4be111e00bc85 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_filters.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_filters.ts @@ -54,7 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the saved search selection page` ); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the index data visualizer page` @@ -91,7 +91,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the saved search selection page` ); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep( `${testData.suiteTitle} loads the index data visualizer page` @@ -124,7 +124,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('data visualizer with pinned global filters', function () { before(async function () { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.createSavedSearchFarequoteFilterAndLuceneIfNeeded(); await ml.testResources.createSavedSearchFarequoteFilterAndKueryIfNeeded(); @@ -133,7 +133,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async function () { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); describe(`with ${farequoteDataViewTestData.suiteTitle}`, function () { diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts index 47c6e7725686d..7d38012c3651b 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_dashboard.ts @@ -115,7 +115,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('field statistics in Dashboard', function () { before(async function () { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.createSavedSearchFarequoteFilterAndLuceneIfNeeded(); await ml.securityUI.loginAsMlPowerUser(); }); @@ -123,7 +123,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async function () { await ml.testResources.clearAdvancedSettingProperty(SHOW_FIELD_STATISTICS); await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); runTests(farequoteLuceneFiltersSearchTestData); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts index c0c7a47414ce5..34a8d59cc2147 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_grid_in_discover.ts @@ -96,8 +96,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async function () { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/module_sample_logs'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_module_sample_logs', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_module_sample_logs', '@timestamp'); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded(); await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded(); await ml.testResources.createSavedSearchFarequoteFilterAndLuceneIfNeeded(); @@ -109,8 +109,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async function () { await ml.testResources.clearAdvancedSettingProperty(SHOW_FIELD_STATISTICS); await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_logs'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_logs'); }); describe('when enabled', function () { diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_random_sampler.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_random_sampler.ts index ce74bbfb8884a..e5fee365ff08e 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_random_sampler.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer_random_sampler.ts @@ -17,7 +17,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await ml.navigation.navigateToDataVisualizer(); await ml.testExecution.logTestStep(`loads the saved search selection page`); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep(`loads the index data visualizer page`); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(sourceIndexOrSavedSearch); @@ -28,8 +28,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/module_sample_logs'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_module_sample_logs', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_module_sample_logs', '@timestamp'); await ml.testResources.createSavedSearchFarequoteLuceneIfNeeded(); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -40,8 +40,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { after(async () => { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_logs'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_logs'); await browser.removeLocalStorageItem('dataVisualizer.randomSamplerPreference'); }); diff --git a/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts b/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts index 1c289dd66f0e7..b986d29c7fee7 100644 --- a/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts +++ b/x-pack/test/functional/apps/ml/permissions/full_ml_access.ts @@ -132,9 +132,9 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.loadIfNeeded( 'x-pack/test/functional/es_archives/ml/module_sample_ecommerce' ); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded(ecIndexPattern, 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ihp_outlier', '@timestamp'); + await ml.testResources.createDataViewIfNeeded(ecIndexPattern, 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createAndRunAnomalyDetectionLookbackJob( @@ -170,9 +170,9 @@ export default function ({ getService }: FtrProviderContext) { await ml.api.deleteCalendar(calendarId); await ml.api.deleteFilter(filterId); await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_ihp_outlier'); - await ml.testResources.deleteIndexPatternByTitle(ecIndexPattern); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_ihp_outlier'); + await ml.testResources.deleteDataViewByTitle(ecIndexPattern); }); for (const testUser of testUsers) { @@ -387,7 +387,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.testExecution.logTestStep( 'should load an index into the data visualizer page' ); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(ecIndexPattern); await ml.testExecution.logTestStep('should display the time range step'); diff --git a/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts b/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts index 960c3a6a4b0b8..7ffdf2286439d 100644 --- a/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts +++ b/x-pack/test/functional/apps/ml/permissions/read_ml_access.ts @@ -138,9 +138,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await esArchiver.loadIfNeeded( 'x-pack/test/functional/es_archives/ml/module_sample_ecommerce' ); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded(ecIndexPattern, 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ihp_outlier', '@timestamp'); + await ml.testResources.createDataViewIfNeeded(ecIndexPattern, 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.api.createAndRunAnomalyDetectionLookbackJob( @@ -176,9 +176,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await ml.api.deleteCalendar(calendarId); await ml.api.deleteFilter(filterId); await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_ihp_outlier'); - await ml.testResources.deleteIndexPatternByTitle(ecIndexPattern); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_ihp_outlier'); + await ml.testResources.deleteDataViewByTitle(ecIndexPattern); }); for (const testUser of testUsers) { @@ -378,7 +378,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await ml.testExecution.logTestStep( 'should load an index into the data visualizer page' ); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(ecIndexPattern); await ml.testExecution.logTestStep('should display the time range step'); diff --git a/x-pack/test/functional/apps/ml/short_tests/model_management/model_list.ts b/x-pack/test/functional/apps/ml/short_tests/model_management/model_list.ts index 5a50a34b4ee17..ebcdfbeb4b170 100644 --- a/x-pack/test/functional/apps/ml/short_tests/model_management/model_list.ts +++ b/x-pack/test/functional/apps/ml/short_tests/model_management/model_list.ts @@ -120,7 +120,7 @@ export default function ({ getService }: FtrProviderContext) { // Need to delete index before ingest pipeline, else it will give error await ml.api.deleteIngestPipeline(modelWithPipelineAndDestIndex.modelId); - await ml.testResources.deleteIndexPatternByTitle( + await ml.testResources.deleteDataViewByTitle( modelWithPipelineAndDestIndexExpectedValues.dataViewTitle ); }); diff --git a/x-pack/test/functional/apps/ml/short_tests/notifications/notification_list.ts b/x-pack/test/functional/apps/ml/short_tests/notifications/notification_list.ts index 062b2809c375d..e4511615a51a2 100644 --- a/x-pack/test/functional/apps/ml/short_tests/notifications/notification_list.ts +++ b/x-pack/test/functional/apps/ml/short_tests/notifications/notification_list.ts @@ -29,7 +29,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Notifications list', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); @@ -54,7 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await spacesService.delete(idSpace1); await ml.api.cleanMlIndices(); await ml.testResources.cleanMLSavedObjects(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('displays a generic notification indicator', async () => { diff --git a/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts b/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts index 91121528d477a..32fe57b442753 100644 --- a/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts +++ b/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts @@ -18,7 +18,7 @@ export default function ({ getService }: FtrProviderContext) { describe('calendar creation', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await asyncForEach(jobConfigs, async (jobConfig) => { // @ts-expect-error not full interface @@ -30,7 +30,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); afterEach(async () => { diff --git a/x-pack/test/functional/apps/ml/short_tests/settings/calendar_edit.ts b/x-pack/test/functional/apps/ml/short_tests/settings/calendar_edit.ts index 9f68ccc8a1196..f7c1497b2b56e 100644 --- a/x-pack/test/functional/apps/ml/short_tests/settings/calendar_edit.ts +++ b/x-pack/test/functional/apps/ml/short_tests/settings/calendar_edit.ts @@ -24,7 +24,7 @@ export default function ({ getService }: FtrProviderContext) { describe('calendar edit', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await asyncForEach(jobConfigs, async (jobConfig) => { // @ts-expect-error not full interface @@ -43,7 +43,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); afterEach(async () => { diff --git a/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts b/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts index 6976b4db4eda6..0ddb7da85c526 100644 --- a/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts +++ b/x-pack/test/functional/apps/ml/stack_management_jobs/export_jobs.ts @@ -257,16 +257,16 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await ml.api.cleanMlIndices(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/bm_classification'); - await ml.testResources.createIndexPatternIfNeeded('ft_bank_marketing', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_bank_marketing', '@timestamp'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ihp_outlier'); - await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ihp_outlier', '@timestamp'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/egs_regression'); - await ml.testResources.createIndexPatternIfNeeded('ft_egs_regression', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_egs_regression', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -289,10 +289,10 @@ export default function ({ getService }: FtrProviderContext) { 'anomaly_detection_jobs', 'data_frame_analytics_jobs', ]); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_bank_marketing'); - await ml.testResources.deleteIndexPatternByTitle('ft_ihp_outlier'); - await ml.testResources.deleteIndexPatternByTitle('ft_egs_regression'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_bank_marketing'); + await ml.testResources.deleteDataViewByTitle('ft_ihp_outlier'); + await ml.testResources.deleteDataViewByTitle('ft_egs_regression'); }); it('opens export flyout and exports anomaly detector jobs', async () => { diff --git a/x-pack/test/functional/apps/ml/stack_management_jobs/import_jobs.ts b/x-pack/test/functional/apps/ml/stack_management_jobs/import_jobs.ts index b4782e37596e3..8a3fa058fe253 100644 --- a/x-pack/test/functional/apps/ml/stack_management_jobs/import_jobs.ts +++ b/x-pack/test/functional/apps/ml/stack_management_jobs/import_jobs.ts @@ -36,8 +36,8 @@ export default function ({ getService }: FtrProviderContext) { await ml.api.cleanMlIndices(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/bm_classification'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_bank_marketing', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_bank_marketing', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); @@ -47,8 +47,8 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await ml.api.cleanMlIndices(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_bank_marketing'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_bank_marketing'); }); for (const testData of testDataListPositive) { diff --git a/x-pack/test/functional/apps/ml/stack_management_jobs/manage_spaces.ts b/x-pack/test/functional/apps/ml/stack_management_jobs/manage_spaces.ts index 55b2bdfa12063..06ec8e19b10c3 100644 --- a/x-pack/test/functional/apps/ml/stack_management_jobs/manage_spaces.ts +++ b/x-pack/test/functional/apps/ml/stack_management_jobs/manage_spaces.ts @@ -111,8 +111,8 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ihp_outlier'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); - await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ihp_outlier', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); @@ -137,8 +137,8 @@ export default function ({ getService }: FtrProviderContext) { } await ml.api.cleanMlIndices(); await ml.testResources.cleanMLSavedObjects([spaceIds.idSpace1]); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_ihp_outlier'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_ihp_outlier'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/ml/stack_management_jobs/synchronize.ts b/x-pack/test/functional/apps/ml/stack_management_jobs/synchronize.ts index 317a71ae79a0b..42a462d259812 100644 --- a/x-pack/test/functional/apps/ml/stack_management_jobs/synchronize.ts +++ b/x-pack/test/functional/apps/ml/stack_management_jobs/synchronize.ts @@ -24,7 +24,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ihp_outlier'); - await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); @@ -40,7 +40,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.api.deleteDataFrameAnalyticsJobES(dfaJobId); } await ml.testResources.cleanMLSavedObjects(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); }); it('should have nothing to sync initially', async () => { diff --git a/x-pack/test/functional/apps/transform/actions/deleting.ts b/x-pack/test/functional/apps/transform/actions/deleting.ts index 80a00e0b09dfd..911c656e9fd5f 100644 --- a/x-pack/test/functional/apps/transform/actions/deleting.ts +++ b/x-pack/test/functional/apps/transform/actions/deleting.ts @@ -65,7 +65,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); for (const testData of testDataList) { await transform.api.createAndRunTransform( @@ -80,11 +80,11 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { for (const testData of testDataList) { - await transform.testResources.deleteIndexPatternByTitle(testData.originalConfig.dest.index); + await transform.testResources.deleteDataViewByTitle(testData.originalConfig.dest.index); await transform.api.deleteIndices(testData.originalConfig.dest.index); } await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/transform/actions/reauthorizing.ts b/x-pack/test/functional/apps/transform/actions/reauthorizing.ts index 9f731f6947cbd..f256e902eac97 100644 --- a/x-pack/test/functional/apps/transform/actions/reauthorizing.ts +++ b/x-pack/test/functional/apps/transform/actions/reauthorizing.ts @@ -138,7 +138,7 @@ export default function ({ getService }: FtrProviderContext) { ); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); for (const testData of testDataList) { await transform.api.createTransform(testData.originalConfig.id, testData.originalConfig, { @@ -157,12 +157,12 @@ export default function ({ getService }: FtrProviderContext) { await transform.securityCommon.clearAllTransformApiKeys(); for (const testData of testDataList) { - await transform.testResources.deleteIndexPatternByTitle(testData.originalConfig.dest.index); + await transform.testResources.deleteDataViewByTitle(testData.originalConfig.dest.index); await transform.api.deleteIndices(testData.originalConfig.dest.index); } await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/transform/actions/resetting.ts b/x-pack/test/functional/apps/transform/actions/resetting.ts index c6e5180dfa8fb..b62772f63454b 100644 --- a/x-pack/test/functional/apps/transform/actions/resetting.ts +++ b/x-pack/test/functional/apps/transform/actions/resetting.ts @@ -67,7 +67,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); for (const testData of testDataList) { await transform.api.createAndRunTransform( @@ -82,11 +82,11 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { for (const testData of testDataList) { - await transform.testResources.deleteIndexPatternByTitle(testData.originalConfig.dest.index); + await transform.testResources.deleteDataViewByTitle(testData.originalConfig.dest.index); await transform.api.deleteIndices(testData.originalConfig.dest.index); } await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/transform/actions/starting.ts b/x-pack/test/functional/apps/transform/actions/starting.ts index 2cccd4525856d..2ecd345ac0e1a 100644 --- a/x-pack/test/functional/apps/transform/actions/starting.ts +++ b/x-pack/test/functional/apps/transform/actions/starting.ts @@ -110,7 +110,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); for (const testData of testDataList) { if ( @@ -135,12 +135,12 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { for (const testData of testDataList) { - await transform.testResources.deleteIndexPatternByTitle(testData.originalConfig.dest.index); + await transform.testResources.deleteDataViewByTitle(testData.originalConfig.dest.index); await transform.api.deleteIndices(testData.originalConfig.dest.index); } await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); for (const testData of testDataList) { diff --git a/x-pack/test/functional/apps/transform/creation/index_pattern/continuous_transform.ts b/x-pack/test/functional/apps/transform/creation/index_pattern/continuous_transform.ts index e56d06e15a625..d345aabc4fabe 100644 --- a/x-pack/test/functional/apps/transform/creation/index_pattern/continuous_transform.ts +++ b/x-pack/test/functional/apps/transform/creation/index_pattern/continuous_transform.ts @@ -36,7 +36,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); const DEFAULT_NUM_FAILURE_RETRIES = '5'; @@ -326,7 +326,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); after(async () => { await transform.api.deleteIndices(testData.destinationIndex); - await transform.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await transform.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts b/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts index 69406c5830421..0f461150166f6 100644 --- a/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts +++ b/x-pack/test/functional/apps/transform/creation/index_pattern/creation_index_pattern.ts @@ -25,7 +25,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('creation_index_pattern', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await transform.testResources.setKibanaTimeZoneToUTC(); await transform.securityUI.loginAsTransformPowerUser(); @@ -33,7 +33,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); await transform.securityUI.logout(); }); @@ -509,7 +509,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await transform.api.deleteIndices(testData.destinationIndex); - await transform.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await transform.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts index 3f0adc5783893..e6f783b88eedf 100644 --- a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts +++ b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_runtime_mappings.ts @@ -37,7 +37,7 @@ export default function ({ getService }: FtrProviderContext) { describe('creation with runtime mappings', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await transform.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await transform.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await transform.testResources.setKibanaTimeZoneToUTC(); await transform.securityUI.loginAsTransformPowerUser(); @@ -45,7 +45,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_farequote'); + await transform.testResources.deleteDataViewByTitle('ft_farequote'); }); const histogramCharts: HistogramCharts = [ @@ -254,7 +254,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await transform.api.deleteIndices(testData.destinationIndex); - await transform.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await transform.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_saved_search.ts b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_saved_search.ts index c976be55a7885..b0e331635610c 100644 --- a/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_saved_search.ts +++ b/x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/creation_saved_search.ts @@ -23,7 +23,7 @@ export default function ({ getService }: FtrProviderContext) { describe('creation_saved_search', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await transform.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); + await transform.testResources.createDataViewIfNeeded('ft_farequote', '@timestamp'); await transform.testResources.createSavedSearchFarequoteFilterIfNeeded(); await transform.testResources.setKibanaTimeZoneToUTC(); @@ -33,7 +33,7 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { await transform.api.cleanTransformIndices(); await transform.testResources.deleteSavedSearches(); - await transform.testResources.deleteIndexPatternByTitle('ft_farequote'); + await transform.testResources.deleteDataViewByTitle('ft_farequote'); }); const testDataList: Array = [ @@ -121,7 +121,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await transform.api.deleteIndices(testData.destinationIndex); - await transform.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await transform.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('loads the wizard for the source data', async () => { diff --git a/x-pack/test/functional/apps/transform/edit_clone/cloning.ts b/x-pack/test/functional/apps/transform/edit_clone/cloning.ts index caa6552024e14..1645547443c04 100644 --- a/x-pack/test/functional/apps/transform/edit_clone/cloning.ts +++ b/x-pack/test/functional/apps/transform/edit_clone/cloning.ts @@ -199,7 +199,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await transform.api.createAndRunTransform( transformConfigWithPivot.id, transformConfigWithPivot @@ -223,17 +223,17 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await transform.testResources.deleteIndexPatternByTitle(transformConfigWithPivot.dest.index); - await transform.testResources.deleteIndexPatternByTitle( + await transform.testResources.deleteDataViewByTitle(transformConfigWithPivot.dest.index); + await transform.testResources.deleteDataViewByTitle( transformConfigWithRuntimeMapping.dest.index ); - await transform.testResources.deleteIndexPatternByTitle(transformConfigWithLatest.dest.index); + await transform.testResources.deleteDataViewByTitle(transformConfigWithLatest.dest.index); await transform.api.deleteIndices(transformConfigWithPivot.dest.index); await transform.api.deleteIndices(transformConfigWithRuntimeMapping.dest.index); await transform.api.deleteIndices(transformConfigWithLatest.dest.index); await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); const testDataList: TestData[] = [ @@ -397,7 +397,7 @@ export default function ({ getService }: FtrProviderContext) { describe(`${testData.suiteTitle}`, function () { after(async () => { await transform.api.deleteIndices(testData.destinationIndex); - await transform.testResources.deleteIndexPatternByTitle(testData.destinationIndex); + await transform.testResources.deleteDataViewByTitle(testData.destinationIndex); }); it('opens the existing transform in the wizard', async () => { diff --git a/x-pack/test/functional/apps/transform/edit_clone/editing.ts b/x-pack/test/functional/apps/transform/edit_clone/editing.ts index 10cacc361779c..1a8394ca9a668 100644 --- a/x-pack/test/functional/apps/transform/edit_clone/editing.ts +++ b/x-pack/test/functional/apps/transform/edit_clone/editing.ts @@ -27,7 +27,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await transform.api.createAndRunTransform( transformConfigWithPivot.id, @@ -43,12 +43,12 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await transform.testResources.deleteIndexPatternByTitle(transformConfigWithPivot.dest.index); + await transform.testResources.deleteDataViewByTitle(transformConfigWithPivot.dest.index); await transform.api.deleteIndices(transformConfigWithPivot.dest.index); - await transform.testResources.deleteIndexPatternByTitle(transformConfigWithLatest.dest.index); + await transform.testResources.deleteDataViewByTitle(transformConfigWithLatest.dest.index); await transform.api.deleteIndices(transformConfigWithLatest.dest.index); await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); const testDataList = [ diff --git a/x-pack/test/functional/apps/transform/permissions/full_transform_access.ts b/x-pack/test/functional/apps/transform/permissions/full_transform_access.ts index 2e7779767eaca..0d745a5123995 100644 --- a/x-pack/test/functional/apps/transform/permissions/full_transform_access.ts +++ b/x-pack/test/functional/apps/transform/permissions/full_transform_access.ts @@ -55,7 +55,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await transform.api.createAndRunTransform( transformConfigWithPivot.id, @@ -67,12 +67,10 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await transform.testResources.deleteIndexPatternByTitle( - transformConfigWithPivot.dest.index - ); + await transform.testResources.deleteDataViewByTitle(transformConfigWithPivot.dest.index); await transform.api.deleteIndices(transformConfigWithPivot.dest.index); await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); it('should display elements in the Transform list page correctly', async () => { diff --git a/x-pack/test/functional/apps/transform/permissions/read_transform_access.ts b/x-pack/test/functional/apps/transform/permissions/read_transform_access.ts index 4e715d4f07467..02cfcfdfba003 100644 --- a/x-pack/test/functional/apps/transform/permissions/read_transform_access.ts +++ b/x-pack/test/functional/apps/transform/permissions/read_transform_access.ts @@ -55,7 +55,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await transform.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await transform.api.createAndRunTransform( transformConfigWithPivot.id, @@ -67,12 +67,10 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await transform.testResources.deleteIndexPatternByTitle( - transformConfigWithPivot.dest.index - ); + await transform.testResources.deleteDataViewByTitle(transformConfigWithPivot.dest.index); await transform.api.deleteIndices(transformConfigWithPivot.dest.index); await transform.api.cleanTransformIndices(); - await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await transform.testResources.deleteDataViewByTitle('ft_ecommerce'); }); it('should display elements in the Transform list page correctly', async () => { diff --git a/x-pack/test/functional/apps/user_profiles/config.ts b/x-pack/test/functional/apps/user_profiles/config.ts new file mode 100644 index 0000000000000..d0d07ff200281 --- /dev/null +++ b/x-pack/test/functional/apps/user_profiles/config.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/x-pack/test/api_integration/apis/management/index_management/mapping.helpers.js b/x-pack/test/functional/apps/user_profiles/index.ts similarity index 52% rename from x-pack/test/api_integration/apis/management/index_management/mapping.helpers.js rename to x-pack/test/functional/apps/user_profiles/index.ts index abb790cf2f551..5932e2729bf4b 100644 --- a/x-pack/test/api_integration/apis/management/index_management/mapping.helpers.js +++ b/x-pack/test/functional/apps/user_profiles/index.ts @@ -5,12 +5,10 @@ * 2.0. */ -import { API_BASE_PATH } from './constants'; +import { FtrProviderContext } from '../../ftr_provider_context'; -export const registerHelpers = ({ supertest }) => { - const getIndexMapping = (indexName) => supertest.get(`${API_BASE_PATH}/mapping/${indexName}`); - - return { - getIndexMapping, - }; +export default ({ loadTestFile }: FtrProviderContext) => { + describe('User Profiles page', function () { + loadTestFile(require.resolve('./user_profiles')); + }); }; diff --git a/x-pack/test/functional/apps/user_profiles/user_profiles.ts b/x-pack/test/functional/apps/user_profiles/user_profiles.ts new file mode 100644 index 0000000000000..a9f2f7a519502 --- /dev/null +++ b/x-pack/test/functional/apps/user_profiles/user_profiles.ts @@ -0,0 +1,160 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default ({ getPageObjects }: FtrProviderContext) => { + const pageObjects = getPageObjects(['common', 'userProfiles', 'settings']); + + describe('User Profile Page', async () => { + before(async () => {}); + + describe('Details', async () => { + before(async () => { + await pageObjects.common.navigateToApp('security_account'); + }); + + it('should set the full name', async () => { + await pageObjects.userProfiles.setFullNameInputField('Test User 2'); + + await pageObjects.userProfiles.saveUserProfileChanges(); + + let toast = await pageObjects.common.closeToast(); + + expect(toast).to.be('Profile updated'); + + await pageObjects.userProfiles.setFullNameInputField('test user'); + + await pageObjects.userProfiles.saveUserProfileChanges(); + + toast = await pageObjects.common.closeToast(); + + expect(toast).to.be('Profile updated'); + }); + + it('should set the email', async () => { + await pageObjects.userProfiles.setEmailInputField('test@test.com'); + + await pageObjects.userProfiles.saveUserProfileChanges(); + + let toast = await pageObjects.common.closeToast(); + + expect(toast).to.be('Profile updated'); + + await pageObjects.userProfiles.setEmailInputField('', true); + + await pageObjects.userProfiles.saveUserProfileChanges(); + + toast = await pageObjects.common.closeToast(); + + expect(toast).to.be('Profile updated'); + }); + }); + + describe('Change Password', async () => { + before(async () => { + await pageObjects.common.navigateToApp('security_account'); + }); + + it('should set the current password and enter a new password, then submit', async () => { + const changePasswordButton = await pageObjects.userProfiles.getChangePasswordButton(); + await changePasswordButton.click(); + + await pageObjects.userProfiles.setCurrentPasswordField('changeme'); + await pageObjects.userProfiles.setNewPasswordField('changeme2'); + await pageObjects.userProfiles.setConfirmPasswordField('changeme2'); + + const submitButton = await pageObjects.userProfiles.getChangePasswordFormSubmitButton(); + await submitButton.click(); + + const initialToast = await pageObjects.common.closeToast(); + + expect(initialToast).to.be('Password successfully changed'); + + await changePasswordButton.click(); + + await pageObjects.userProfiles.setCurrentPasswordField('changeme2'); + await pageObjects.userProfiles.setNewPasswordField('changeme'); + await pageObjects.userProfiles.setConfirmPasswordField('changeme'); + + await submitButton.click(); + + const resetToast = await pageObjects.common.closeToast(); + + expect(resetToast).to.be('Password successfully changed'); + }); + }); + + describe('Theme', async () => { + it('should change theme based on the User Profile Theme control with default Adv. Settings value (light)', async () => { + await pageObjects.common.navigateToApp('security_account'); + + const themeKeyPadMenu = await pageObjects.userProfiles.getThemeKeypadMenu(); + expect(themeKeyPadMenu).not.to.be(null); + + await pageObjects.userProfiles.changeUserProfileTheme('Dark'); + const darkModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(darkModeTag).to.be('v8dark'); + + await pageObjects.userProfiles.changeUserProfileTheme('Light'); + const lightModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(lightModeTag).to.be('v8light'); + + await pageObjects.userProfiles.changeUserProfileTheme('Space default'); + const spaceDefaultModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(spaceDefaultModeTag).to.be('v8light'); + }); + + it('should change theme based on the User Profile Theme control with default Adv. Settings value set to dark', async () => { + await pageObjects.common.navigateToUrl('management', 'kibana/settings', { + basePath: '', + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, + shouldUseHashForSubUrl: false, + }); + + let advancedSetting = await pageObjects.settings.getAdvancedSettingCheckbox( + 'theme:darkMode' + ); + expect(advancedSetting).to.be(null); + + await pageObjects.settings.toggleAdvancedSettingCheckbox('theme:darkMode', true); + advancedSetting = await pageObjects.settings.getAdvancedSettingCheckbox('theme:darkMode'); + expect(advancedSetting).to.be('true'); + + await pageObjects.common.navigateToApp('security_account'); + + let spaceDefaultModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(spaceDefaultModeTag).to.be('v8dark'); + + await pageObjects.userProfiles.changeUserProfileTheme('Light'); + const lightModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(lightModeTag).to.be('v8light'); + + await pageObjects.userProfiles.changeUserProfileTheme('Dark'); + const darkModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(darkModeTag).to.be('v8dark'); + + await pageObjects.userProfiles.changeUserProfileTheme('Space default'); + spaceDefaultModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(spaceDefaultModeTag).to.be('v8dark'); + + await pageObjects.common.navigateToUrl('management', 'kibana/settings', { + basePath: '', + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, + shouldUseHashForSubUrl: false, + }); + + await pageObjects.settings.toggleAdvancedSettingCheckbox('theme:darkMode', false); + advancedSetting = await pageObjects.settings.getAdvancedSettingCheckbox('theme:darkMode'); + expect(advancedSetting).to.be(null); + }); + }); + }); +}; diff --git a/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0_multiple_docs/data.json b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0_multiple_docs/data.json new file mode 100644 index 0000000000000..a56ba3832c67b --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0_multiple_docs/data.json @@ -0,0 +1,1268 @@ +{ + "type": "doc", + "value": { + "id": "eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1", + "index": ".alerts-security.alerts-default", + "source": { + "@timestamp": "2023-04-27T11:03:57.906Z", + "Endpoint": { + "capabilities": [ + "isolation", + "kill_process", + "suspend_process", + "running_processes", + "get_file", + "execute" + ], + "configuration": { + "isolation": true + }, + "policy": { + "applied": { + "endpoint_policy_version": 3, + "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A", + "name": "With Eventing", + "status": "success", + "version": 5 + } + }, + "state": { + "isolation": true + }, + "status": "enrolled" + }, + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb", + "type": "endpoint", + "version": "8.8.0" + }, + "data_stream": { + "dataset": "endpoint.alerts", + "namespace": "default", + "type": "logs" + }, + "dll": [ + { + "Ext": { + "compile_time": 1534424710, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 5362483200, + "mapped_size": 0 + }, + "code_signature": { + "subject_name": "Cybereason Inc", + "trusted": true + }, + "hash": { + "md5": "1f2d082566b0fc5f2c238a5180db7451", + "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", + "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" + }, + "path": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", + "pe": { + "architecture": "x64" + } + } + ], + "ecs": { + "version": "1.4.0" + }, + "elastic": { + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb" + } + }, + "event.action": "creation", + "event.agent_id_status": "auth_metadata_missing", + "event.category": "malware", + "event.code": "malicious_file", + "event.dataset": "endpoint", + "event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "event.ingested": "2023-04-27T10:58:03Z", + "event.kind": "signal", + "event.module": "endpoint", + "event.sequence": 5826, + "event.type": "creation", + "file": { + "Ext": { + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "malware_classification": { + "identifier": "endpointpe", + "score": 1, + "threshold": 0.66, + "version": "3.0.33" + }, + "quarantine_message": "fake quarantine message", + "quarantine_result": true, + "temp_file_path": "C:/temp/fake_malware.exe" + }, + "accessed": 1682752652103, + "created": 1682752652103, + "hash": { + "md5": "fake file md5", + "sha1": "fake file sha1", + "sha256": "fake file sha256" + }, + "mtime": 1682752652103, + "name": "fake_malware.exe", + "owner": "SYSTEM", + "path": "C:/fake_malware.exe", + "size": 3456 + }, + "user": { + "name": "user1" + }, + "host": { + "architecture": "wtnozeqvub", + "hostname": "Host-fwarau82er", + "id": "4260adf9-5e63-445d-92c6-e03359bcd342", + "ip": [ + "10.249.37.72", + "10.150.39.243", + "10.186.17.170" + ], + "mac": [ + "f5-f-97-dc-20-67", + "b5-56-ca-98-81-ca", + "22-86-39-4c-87-33" + ], + "name": "Host-fwarau82er", + "os": { + "Ext": { + "variant": "Darwin" + }, + "family": "Darwin", + "full": "macOS Monterey", + "name": "macOS", + "platform": "macOS", + "version": "12.6.1" + } + }, + "kibana.alert.ancestors": [ + { + "depth": 0, + "id": "vT9cwocBh3b8EMpD8lsi", + "index": ".ds-logs-endpoint.alerts-default-2023.04.27-000001", + "type": "event" + } + ], + "kibana.alert.depth": 1, + "kibana.alert.last_detected": "2023-04-27T11:03:57.993Z", + "kibana.alert.original_event.action": "creation", + "kibana.alert.original_event.agent_id_status": "auth_metadata_missing", + "kibana.alert.original_event.category": "malware", + "kibana.alert.original_event.code": "malicious_file", + "kibana.alert.original_event.dataset": "endpoint", + "kibana.alert.original_event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "kibana.alert.original_event.ingested": "2023-04-27T10:58:03Z", + "kibana.alert.original_event.kind": "alert", + "kibana.alert.original_event.module": "endpoint", + "kibana.alert.original_event.sequence": 5826, + "kibana.alert.original_event.type": "creation", + "kibana.alert.original_time": "2023-04-29T07:17:32.103Z", + "kibana.alert.reason": "malware event with process malware writer, file fake_malware.exe, on Host-fwarau82er created medium alert Endpoint Security.", + "kibana.alert.risk_score": 47, + "kibana.alert.rule.actions": [ + ], + "kibana.alert.rule.author": [ + "Elastic" + ], + "kibana.alert.rule.category": "Custom Query Rule", + "kibana.alert.rule.consumer": "siem", + "kibana.alert.rule.created_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.created_by": "elastic", + "kibana.alert.rule.description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "kibana.alert.rule.enabled": true, + "kibana.alert.rule.exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "kibana.alert.rule.execution.uuid": "ebf843ff-e0e1-47f8-9ed2-cc8066afbcef", + "kibana.alert.rule.false_positives": [ + ], + "kibana.alert.rule.from": "now-10m", + "kibana.alert.rule.immutable": true, + "kibana.alert.rule.indices": [ + "logs-endpoint.alerts-*" + ], + "kibana.alert.rule.interval": "5m", + "kibana.alert.rule.license": "Elastic License v2", + "kibana.alert.rule.max_signals": 10000, + "kibana.alert.rule.name": "Endpoint Security", + "kibana.alert.rule.parameters": { + "author": [ + "Elastic" + ], + "description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "false_positives": [ + ], + "from": "now-10m", + "immutable": true, + "index": [ + "logs-endpoint.alerts-*" + ], + "language": "kuery", + "license": "Elastic License v2", + "max_signals": 10000, + "query": "event.kind:alert and event.module:(endpoint and not endgame)\n", + "references": [ + ], + "related_integrations": [ + { + "package": "endpoint", + "version": "^8.2.0" + } + ], + "required_fields": [ + { + "ecs": true, + "name": "event.kind", + "type": "keyword" + }, + { + "ecs": true, + "name": "event.module", + "type": "keyword" + } + ], + "risk_score": 47, + "risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "rule_name_override": "message", + "setup": "", + "severity": "medium", + "severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "threat": [ + ], + "timestamp_override": "event.ingested", + "to": "now", + "type": "query", + "version": 101 + }, + "kibana.alert.rule.producer": "siem", + "kibana.alert.rule.references": [ + ], + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.risk_score": 47, + "kibana.alert.rule.risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "kibana.alert.rule.rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "kibana.alert.rule.rule_name_override": "message", + "kibana.alert.rule.rule_type_id": "siem.queryRule", + "kibana.alert.rule.severity": "medium", + "kibana.alert.rule.severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "kibana.alert.rule.tags": [ + "Elastic", + "Endpoint Security" + ], + "kibana.alert.rule.threat": [ + ], + "kibana.alert.rule.timestamp_override": "event.ingested", + "kibana.alert.rule.to": "now", + "kibana.alert.rule.type": "query", + "kibana.alert.rule.updated_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.updated_by": "elastic", + "kibana.alert.rule.uuid": "7015a3e2-e4ea-11ed-8c11-49608884878f", + "kibana.alert.rule.version": 101, + "kibana.alert.severity": "medium", + "kibana.alert.start": "2023-04-27T11:03:57.993Z", + "kibana.alert.status": "active", + "kibana.alert.url": "http://localhost:5601/app/security/alerts/redirect/eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1?index=.alerts-security.alerts-default×tamp=2023-04-27T11:03:57.906Z", + "kibana.alert.uuid": "eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1", + "kibana.alert.workflow_status": "open", + "kibana.space_ids": [ + "default" + ], + "kibana.version": "8.8.0", + "process": { + "Ext": { + "ancestry": [ + "qa5jgw1wr7", + "5k1hclygc6" + ], + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "token": { + "domain": "NT AUTHORITY", + "integrity_level": 16384, + "integrity_level_name": "system", + "privileges": [ + { + "description": "Replace a process level token", + "enabled": false, + "name": "SeAssignPrimaryTokenPrivilege" + } + ], + "sid": "S-1-5-18", + "type": "tokenPrimary", + "user": "SYSTEM" + }, + "user": "SYSTEM" + }, + "entity_id": "nqh8ts6ves", + "entry_leader": { + "entity_id": "jnm38bel0w", + "name": "fake entry", + "pid": 791 + }, + "executable": "C:/malware.exe", + "group_leader": { + "entity_id": "jnm38bel0w", + "name": "fake leader", + "pid": 848 + }, + "hash": { + "md5": "fake md5", + "sha1": "fake sha1", + "sha256": "fake sha256" + }, + "name": "malware writer", + "parent": { + "entity_id": "qa5jgw1wr7", + "pid": 1 + }, + "pid": 2, + "session_leader": { + "entity_id": "jnm38bel0w", + "name": "fake session", + "pid": 909 + }, + "start": 1682752652103, + "uptime": 0 + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "170865e675eda76202f0095b23869d8d0726df4c91a343876df38b566bf1e57d", + "index": ".alerts-security.alerts-default", + "source": { + "@timestamp": "2023-04-27T11:03:57.906Z", + "Endpoint": { + "capabilities": [ + "isolation", + "kill_process", + "suspend_process", + "running_processes", + "get_file", + "execute" + ], + "configuration": { + "isolation": true + }, + "policy": { + "applied": { + "endpoint_policy_version": 3, + "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A", + "name": "With Eventing", + "status": "success", + "version": 5 + } + }, + "state": { + "isolation": true + }, + "status": "enrolled" + }, + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb", + "type": "endpoint", + "version": "8.8.0" + }, + "data_stream": { + "dataset": "endpoint.alerts", + "namespace": "default", + "type": "logs" + }, + "dll": [ + { + "Ext": { + "compile_time": 1534424710, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 5362483200, + "mapped_size": 0 + }, + "code_signature": { + "subject_name": "Cybereason Inc", + "trusted": true + }, + "hash": { + "md5": "1f2d082566b0fc5f2c238a5180db7451", + "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", + "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" + }, + "path": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", + "pe": { + "architecture": "x64" + } + } + ], + "ecs": { + "version": "1.4.0" + }, + "elastic": { + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb" + } + }, + "event.action": "creation", + "event.agent_id_status": "auth_metadata_missing", + "event.category": "malware", + "event.code": "malicious_file", + "event.dataset": "endpoint", + "event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "event.ingested": "2023-04-27T10:58:03Z", + "event.kind": "signal", + "event.module": "endpoint", + "event.sequence": 5826, + "event.type": "creation", + "file": { + "Ext": { + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "malware_classification": { + "identifier": "endpointpe", + "score": 1, + "threshold": 0.66, + "version": "3.0.33" + }, + "quarantine_message": "fake quarantine message", + "quarantine_result": true, + "temp_file_path": "C:/temp/fake_malware.exe" + }, + "accessed": 1682752652103, + "created": 1682752652103, + "hash": { + "md5": "fake file md5", + "sha1": "fake file sha1", + "sha256": "fake file sha256" + }, + "mtime": 1682752652103, + "name": "fake_malware.exe", + "owner": "SYSTEM", + "path": "C:/fake_malware.exe", + "size": 3456 + }, + "user": { + "name": "user1" + }, + "host": { + "architecture": "wtnozeqvub", + "hostname": "Host-fwarau82er", + "id": "4260adf9-5e63-445d-92c6-e03359bcd342", + "ip": [ + "10.249.37.72", + "10.150.39.243", + "10.186.17.170" + ], + "mac": [ + "f5-f-97-dc-20-67", + "b5-56-ca-98-81-ca", + "22-86-39-4c-87-33" + ], + "name": "Host-fwarau82er", + "os": { + "Ext": { + "variant": "Darwin" + }, + "family": "Darwin", + "full": "macOS Monterey", + "name": "macOS", + "platform": "macOS", + "version": "12.6.1" + } + }, + "kibana.alert.ancestors": [ + { + "depth": 0, + "id": "vT9cwocBh3b8EMpD8lsi", + "index": ".ds-logs-endpoint.alerts-default-2023.04.27-000001", + "type": "event" + } + ], + "kibana.alert.depth": 1, + "kibana.alert.last_detected": "2023-04-27T11:03:57.993Z", + "kibana.alert.original_event.action": "creation", + "kibana.alert.original_event.agent_id_status": "auth_metadata_missing", + "kibana.alert.original_event.category": "malware", + "kibana.alert.original_event.code": "malicious_file", + "kibana.alert.original_event.dataset": "endpoint", + "kibana.alert.original_event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "kibana.alert.original_event.ingested": "2023-04-27T10:58:03Z", + "kibana.alert.original_event.kind": "alert", + "kibana.alert.original_event.module": "endpoint", + "kibana.alert.original_event.sequence": 5826, + "kibana.alert.original_event.type": "creation", + "kibana.alert.original_time": "2023-04-29T07:17:32.103Z", + "kibana.alert.reason": "malware event with process malware writer, file fake_malware.exe, on Host-fwarau82er created medium alert Endpoint Security.", + "kibana.alert.risk_score": 47, + "kibana.alert.rule.actions": [ + ], + "kibana.alert.rule.author": [ + "Elastic" + ], + "kibana.alert.rule.category": "Custom Query Rule", + "kibana.alert.rule.consumer": "siem", + "kibana.alert.rule.created_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.created_by": "elastic", + "kibana.alert.rule.description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "kibana.alert.rule.enabled": true, + "kibana.alert.rule.exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "kibana.alert.rule.execution.uuid": "ebf843ff-e0e1-47f8-9ed2-cc8066afbcef", + "kibana.alert.rule.false_positives": [ + ], + "kibana.alert.rule.from": "now-10m", + "kibana.alert.rule.immutable": true, + "kibana.alert.rule.indices": [ + "logs-endpoint.alerts-*" + ], + "kibana.alert.rule.interval": "5m", + "kibana.alert.rule.license": "Elastic License v2", + "kibana.alert.rule.max_signals": 10000, + "kibana.alert.rule.name": "Endpoint Security", + "kibana.alert.rule.parameters": { + "author": [ + "Elastic" + ], + "description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "false_positives": [ + ], + "from": "now-10m", + "immutable": true, + "index": [ + "logs-endpoint.alerts-*" + ], + "language": "kuery", + "license": "Elastic License v2", + "max_signals": 10000, + "query": "event.kind:alert and event.module:(endpoint and not endgame)\n", + "references": [ + ], + "related_integrations": [ + { + "package": "endpoint", + "version": "^8.2.0" + } + ], + "required_fields": [ + { + "ecs": true, + "name": "event.kind", + "type": "keyword" + }, + { + "ecs": true, + "name": "event.module", + "type": "keyword" + } + ], + "risk_score": 47, + "risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "rule_name_override": "message", + "setup": "", + "severity": "medium", + "severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "threat": [ + ], + "timestamp_override": "event.ingested", + "to": "now", + "type": "query", + "version": 101 + }, + "kibana.alert.rule.producer": "siem", + "kibana.alert.rule.references": [ + ], + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.risk_score": 47, + "kibana.alert.rule.risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "kibana.alert.rule.rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "kibana.alert.rule.rule_name_override": "message", + "kibana.alert.rule.rule_type_id": "siem.queryRule", + "kibana.alert.rule.severity": "medium", + "kibana.alert.rule.severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "kibana.alert.rule.tags": [ + "Elastic", + "Endpoint Security" + ], + "kibana.alert.rule.threat": [ + ], + "kibana.alert.rule.timestamp_override": "event.ingested", + "kibana.alert.rule.to": "now", + "kibana.alert.rule.type": "query", + "kibana.alert.rule.updated_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.updated_by": "elastic", + "kibana.alert.rule.uuid": "7015a3e2-e4ea-11ed-8c11-49608884878f", + "kibana.alert.rule.version": 101, + "kibana.alert.severity": "medium", + "kibana.alert.start": "2023-04-27T11:03:57.993Z", + "kibana.alert.status": "active", + "kibana.alert.url": "http://localhost:5601/app/security/alerts/redirect/eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1?index=.alerts-security.alerts-default×tamp=2023-04-27T11:03:57.906Z", + "kibana.alert.uuid": "eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1", + "kibana.alert.workflow_status": "open", + "kibana.space_ids": [ + "default" + ], + "kibana.version": "8.8.0", + "process": { + "Ext": { + "ancestry": [ + "qa5jgw1wr7", + "5k1hclygc6" + ], + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "token": { + "domain": "NT AUTHORITY", + "integrity_level": 16384, + "integrity_level_name": "system", + "privileges": [ + { + "description": "Replace a process level token", + "enabled": false, + "name": "SeAssignPrimaryTokenPrivilege" + } + ], + "sid": "S-1-5-18", + "type": "tokenPrimary", + "user": "SYSTEM" + }, + "user": "SYSTEM" + }, + "entity_id": "nqh8ts6ves", + "entry_leader": { + "entity_id": "jnm38bel0w", + "name": "fake entry", + "pid": 791 + }, + "executable": "C:/malware.exe", + "group_leader": { + "entity_id": "jnm38bel0w", + "name": "fake leader", + "pid": 848 + }, + "hash": { + "md5": "fake md5", + "sha1": "fake sha1", + "sha256": "fake sha256" + }, + "name": "malware writer", + "parent": { + "entity_id": "qa5jgw1wr7", + "pid": 1 + }, + "pid": 2, + "session_leader": { + "entity_id": "jnm38bel0w", + "name": "fake session", + "pid": 909 + }, + "start": 1682752652103, + "uptime": 0 + } + } + } +} + +{ + "type": "doc", + "value": { + "id": "f3bbdf17847c703e37dca942dc6c1db69eb8af18a74c1f52b6d0bd76c6b3b135", + "index": ".alerts-security.alerts-default", + "source": { + "@timestamp": "2023-04-27T11:03:57.906Z", + "Endpoint": { + "capabilities": [ + "isolation", + "kill_process", + "suspend_process", + "running_processes", + "get_file", + "execute" + ], + "configuration": { + "isolation": true + }, + "policy": { + "applied": { + "endpoint_policy_version": 3, + "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A", + "name": "With Eventing", + "status": "success", + "version": 5 + } + }, + "state": { + "isolation": true + }, + "status": "enrolled" + }, + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb", + "type": "endpoint", + "version": "8.8.0" + }, + "data_stream": { + "dataset": "endpoint.alerts", + "namespace": "default", + "type": "logs" + }, + "dll": [ + { + "Ext": { + "compile_time": 1534424710, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 5362483200, + "mapped_size": 0 + }, + "code_signature": { + "subject_name": "Cybereason Inc", + "trusted": true + }, + "hash": { + "md5": "1f2d082566b0fc5f2c238a5180db7451", + "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", + "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" + }, + "path": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", + "pe": { + "architecture": "x64" + } + } + ], + "ecs": { + "version": "1.4.0" + }, + "elastic": { + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb" + } + }, + "event.action": "creation", + "event.agent_id_status": "auth_metadata_missing", + "event.category": "malware", + "event.code": "malicious_file", + "event.dataset": "endpoint", + "event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "event.ingested": "2023-04-27T10:58:03Z", + "event.kind": "signal", + "event.module": "endpoint", + "event.sequence": 5826, + "event.type": "creation", + "file": { + "Ext": { + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "malware_classification": { + "identifier": "endpointpe", + "score": 1, + "threshold": 0.66, + "version": "3.0.33" + }, + "quarantine_message": "fake quarantine message", + "quarantine_result": true, + "temp_file_path": "C:/temp/fake_malware.exe" + }, + "accessed": 1682752652103, + "created": 1682752652103, + "hash": { + "md5": "fake file md5", + "sha1": "fake file sha1", + "sha256": "fake file sha256" + }, + "mtime": 1682752652103, + "name": "fake_malware.exe", + "owner": "SYSTEM", + "path": "C:/fake_malware.exe", + "size": 3456 + }, + "user": { + "name": "user1" + }, + "host": { + "architecture": "wtnozeqvub", + "hostname": "Host-fwarau82er", + "id": "4260adf9-5e63-445d-92c6-e03359bcd342", + "ip": [ + "10.249.37.72", + "10.150.39.243", + "10.186.17.170" + ], + "mac": [ + "f5-f-97-dc-20-67", + "b5-56-ca-98-81-ca", + "22-86-39-4c-87-33" + ], + "name": "Host-fwarau82er", + "os": { + "Ext": { + "variant": "Darwin" + }, + "family": "Darwin", + "full": "macOS Monterey", + "name": "macOS", + "platform": "macOS", + "version": "12.6.1" + } + }, + "kibana.alert.ancestors": [ + { + "depth": 0, + "id": "vT9cwocBh3b8EMpD8lsi", + "index": ".ds-logs-endpoint.alerts-default-2023.04.27-000001", + "type": "event" + } + ], + "kibana.alert.depth": 1, + "kibana.alert.last_detected": "2023-04-27T11:03:57.993Z", + "kibana.alert.original_event.action": "creation", + "kibana.alert.original_event.agent_id_status": "auth_metadata_missing", + "kibana.alert.original_event.category": "malware", + "kibana.alert.original_event.code": "malicious_file", + "kibana.alert.original_event.dataset": "endpoint", + "kibana.alert.original_event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "kibana.alert.original_event.ingested": "2023-04-27T10:58:03Z", + "kibana.alert.original_event.kind": "alert", + "kibana.alert.original_event.module": "endpoint", + "kibana.alert.original_event.sequence": 5826, + "kibana.alert.original_event.type": "creation", + "kibana.alert.original_time": "2023-04-29T07:17:32.103Z", + "kibana.alert.reason": "malware event with process malware writer, file fake_malware.exe, on Host-fwarau82er created medium alert Endpoint Security.", + "kibana.alert.risk_score": 47, + "kibana.alert.rule.actions": [ + ], + "kibana.alert.rule.author": [ + "Elastic" + ], + "kibana.alert.rule.category": "Custom Query Rule", + "kibana.alert.rule.consumer": "siem", + "kibana.alert.rule.created_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.created_by": "elastic", + "kibana.alert.rule.description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "kibana.alert.rule.enabled": true, + "kibana.alert.rule.exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "kibana.alert.rule.execution.uuid": "ebf843ff-e0e1-47f8-9ed2-cc8066afbcef", + "kibana.alert.rule.false_positives": [ + ], + "kibana.alert.rule.from": "now-10m", + "kibana.alert.rule.immutable": true, + "kibana.alert.rule.indices": [ + "logs-endpoint.alerts-*" + ], + "kibana.alert.rule.interval": "5m", + "kibana.alert.rule.license": "Elastic License v2", + "kibana.alert.rule.max_signals": 10000, + "kibana.alert.rule.name": "Endpoint Security", + "kibana.alert.rule.parameters": { + "author": [ + "Elastic" + ], + "description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "false_positives": [ + ], + "from": "now-10m", + "immutable": true, + "index": [ + "logs-endpoint.alerts-*" + ], + "language": "kuery", + "license": "Elastic License v2", + "max_signals": 10000, + "query": "event.kind:alert and event.module:(endpoint and not endgame)\n", + "references": [ + ], + "related_integrations": [ + { + "package": "endpoint", + "version": "^8.2.0" + } + ], + "required_fields": [ + { + "ecs": true, + "name": "event.kind", + "type": "keyword" + }, + { + "ecs": true, + "name": "event.module", + "type": "keyword" + } + ], + "risk_score": 47, + "risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "rule_name_override": "message", + "setup": "", + "severity": "medium", + "severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "threat": [ + ], + "timestamp_override": "event.ingested", + "to": "now", + "type": "query", + "version": 101 + }, + "kibana.alert.rule.producer": "siem", + "kibana.alert.rule.references": [ + ], + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.risk_score": 47, + "kibana.alert.rule.risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "kibana.alert.rule.rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "kibana.alert.rule.rule_name_override": "message", + "kibana.alert.rule.rule_type_id": "siem.queryRule", + "kibana.alert.rule.severity": "medium", + "kibana.alert.rule.severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "kibana.alert.rule.tags": [ + "Elastic", + "Endpoint Security" + ], + "kibana.alert.rule.threat": [ + ], + "kibana.alert.rule.timestamp_override": "event.ingested", + "kibana.alert.rule.to": "now", + "kibana.alert.rule.type": "query", + "kibana.alert.rule.updated_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.updated_by": "elastic", + "kibana.alert.rule.uuid": "7015a3e2-e4ea-11ed-8c11-49608884878f", + "kibana.alert.rule.version": 101, + "kibana.alert.severity": "medium", + "kibana.alert.start": "2023-04-27T11:03:57.993Z", + "kibana.alert.status": "active", + "kibana.alert.url": "http://localhost:5601/app/security/alerts/redirect/eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1?index=.alerts-security.alerts-default×tamp=2023-04-27T11:03:57.906Z", + "kibana.alert.uuid": "eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1", + "kibana.alert.workflow_status": "open", + "kibana.space_ids": [ + "default" + ], + "kibana.version": "8.8.0", + "process": { + "Ext": { + "ancestry": [ + "qa5jgw1wr7", + "5k1hclygc6" + ], + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "token": { + "domain": "NT AUTHORITY", + "integrity_level": 16384, + "integrity_level_name": "system", + "privileges": [ + { + "description": "Replace a process level token", + "enabled": false, + "name": "SeAssignPrimaryTokenPrivilege" + } + ], + "sid": "S-1-5-18", + "type": "tokenPrimary", + "user": "SYSTEM" + }, + "user": "SYSTEM" + }, + "entity_id": "nqh8ts6ves", + "entry_leader": { + "entity_id": "jnm38bel0w", + "name": "fake entry", + "pid": 791 + }, + "executable": "C:/malware.exe", + "group_leader": { + "entity_id": "jnm38bel0w", + "name": "fake leader", + "pid": 848 + }, + "hash": { + "md5": "fake md5", + "sha1": "fake sha1", + "sha256": "fake sha256" + }, + "name": "malware writer", + "parent": { + "entity_id": "qa5jgw1wr7", + "pid": 1 + }, + "pid": 2, + "session_leader": { + "entity_id": "jnm38bel0w", + "name": "fake session", + "pid": 909 + }, + "start": 1682752652103, + "uptime": 0 + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0_multiple_docs/mappings.json b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0_multiple_docs/mappings.json new file mode 100644 index 0000000000000..f5a6e53cc4d60 --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/alerts/8.8.0_multiple_docs/mappings.json @@ -0,0 +1,7900 @@ +{ + "type": "index", + "value": { + "aliases": { + ".alerts-security.alerts-default": { + "is_write_index": true + }, + ".siem-signals-default": { + "is_write_index": false + } + }, + "index": ".internal.alerts-security.alerts-default-000001", + "mappings": { + "_meta": { + "kibana": { + "version": "8.8.0" + }, + "managed": true, + "namespace": "default" + }, + "dynamic": "false", + "properties": { + "@timestamp": { + "type": "date" + }, + "agent": { + "properties": { + "build": { + "properties": { + "original": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "client": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "cloud": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "origin": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "target": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "container": { + "properties": { + "cpu": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "disk": { + "properties": { + "read": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "write": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "image": { + "properties": { + "hash": { + "properties": { + "all": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "tag": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "type": "object" + }, + "memory": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "network": { + "properties": { + "egress": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "ingress": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "runtime": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "destination": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "device": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "manufacturer": { + "ignore_above": 1024, + "type": "keyword" + }, + "model": { + "properties": { + "identifier": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dll": { + "properties": { + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dns": { + "properties": { + "answers": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "ttl": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "header_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "op_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "question": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resolved_ip": { + "type": "ip" + }, + "response_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ecs": { + "properties": { + "version": { + "type": "keyword" + } + } + }, + "email": { + "properties": { + "attachments": { + "properties": { + "file": { + "properties": { + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + } + } + } + }, + "type": "nested" + }, + "bcc": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cc": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "delivery_timestamp": { + "type": "date" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "from": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "local_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_id": { + "type": "wildcard" + }, + "origination_timestamp": { + "type": "date" + }, + "reply_to": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sender": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "subject": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "to": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x_mailer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "error": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "type": "match_only_text" + }, + "stack_trace": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event": { + "properties": { + "action": { + "type": "keyword" + }, + "agent_id_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "long" + }, + "end": { + "type": "date" + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingested": { + "type": "date" + }, + "kind": { + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "type": "keyword" + }, + "outcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "sequence": { + "type": "long" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "faas": { + "properties": { + "coldstart": { + "type": "boolean" + }, + "execution": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "trigger": { + "properties": { + "request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "host": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "boot": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cpu": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "disk": { + "properties": { + "read": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "write": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "network": { + "properties": { + "egress": { + "properties": { + "bytes": { + "type": "long" + }, + "packets": { + "type": "long" + } + } + }, + "ingress": { + "properties": { + "bytes": { + "type": "long" + }, + "packets": { + "type": "long" + } + } + } + } + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pid_ns_ino": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk": { + "properties": { + "calculated_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "calculated_score": { + "type": "float" + }, + "calculated_score_norm": { + "type": "float" + }, + "static_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "static_score": { + "type": "float" + }, + "static_score_norm": { + "type": "float" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uptime": { + "type": "long" + } + } + }, + "http": { + "properties": { + "request": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + } + } + }, + "bytes": { + "type": "long" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + } + } + }, + "bytes": { + "type": "long" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_code": { + "type": "long" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "kibana": { + "properties": { + "alert": { + "properties": { + "action_group": { + "type": "keyword" + }, + "ancestors": { + "properties": { + "depth": { + "type": "long" + }, + "id": { + "type": "keyword" + }, + "index": { + "type": "keyword" + }, + "rule": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "building_block_type": { + "type": "keyword" + }, + "case_ids": { + "type": "keyword" + }, + "depth": { + "type": "long" + }, + "duration": { + "properties": { + "us": { + "type": "long" + } + } + }, + "end": { + "type": "date" + }, + "flapping": { + "type": "boolean" + }, + "flapping_history": { + "type": "boolean" + }, + "group": { + "properties": { + "id": { + "type": "keyword" + }, + "index": { + "type": "integer" + } + } + }, + "instance": { + "properties": { + "id": { + "type": "keyword" + } + } + }, + "last_detected": { + "type": "date" + }, + "maintenance_window_ids": { + "type": "keyword" + }, + "new_terms": { + "type": "keyword" + }, + "original_event": { + "properties": { + "action": { + "type": "keyword" + }, + "agent_id_status": { + "type": "keyword" + }, + "category": { + "type": "keyword" + }, + "code": { + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "type": "keyword" + }, + "duration": { + "type": "keyword" + }, + "end": { + "type": "date" + }, + "hash": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "ingested": { + "type": "date" + }, + "kind": { + "type": "keyword" + }, + "module": { + "type": "keyword" + }, + "original": { + "type": "keyword" + }, + "outcome": { + "type": "keyword" + }, + "provider": { + "type": "keyword" + }, + "reason": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "sequence": { + "type": "long" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "url": { + "type": "keyword" + } + } + }, + "original_time": { + "type": "date" + }, + "reason": { + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "rule": { + "properties": { + "author": { + "type": "keyword" + }, + "building_block_type": { + "type": "keyword" + }, + "category": { + "type": "keyword" + }, + "consumer": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "type": "keyword" + }, + "description": { + "type": "keyword" + }, + "enabled": { + "type": "keyword" + }, + "exceptions_list": { + "type": "object" + }, + "execution": { + "properties": { + "uuid": { + "type": "keyword" + } + } + }, + "false_positives": { + "type": "keyword" + }, + "from": { + "type": "keyword" + }, + "immutable": { + "type": "keyword" + }, + "interval": { + "type": "keyword" + }, + "license": { + "type": "keyword" + }, + "max_signals": { + "type": "long" + }, + "name": { + "type": "keyword" + }, + "note": { + "type": "keyword" + }, + "parameters": { + "ignore_above": 4096, + "type": "flattened" + }, + "producer": { + "type": "keyword" + }, + "references": { + "type": "keyword" + }, + "revision": { + "type": "long" + }, + "rule_id": { + "type": "keyword" + }, + "rule_name_override": { + "type": "keyword" + }, + "rule_type_id": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "threat": { + "properties": { + "framework": { + "type": "keyword" + }, + "tactic": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + } + } + }, + "technique": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + }, + "subtechnique": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + } + } + } + } + } + } + }, + "timeline_id": { + "type": "keyword" + }, + "timeline_title": { + "type": "keyword" + }, + "timestamp_override": { + "type": "keyword" + }, + "to": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "type": "keyword" + }, + "uuid": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "severity": { + "type": "keyword" + }, + "start": { + "type": "date" + }, + "status": { + "type": "keyword" + }, + "suppression": { + "properties": { + "docs_count": { + "type": "long" + }, + "end": { + "type": "date" + }, + "start": { + "type": "date" + }, + "terms": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "keyword" + } + } + } + } + }, + "system_status": { + "type": "keyword" + }, + "threshold_result": { + "properties": { + "cardinality": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + }, + "count": { + "type": "long" + }, + "from": { + "type": "date" + }, + "terms": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "keyword" + } + } + } + } + }, + "time_range": { + "format": "epoch_millis||strict_date_optional_time", + "type": "date_range" + }, + "url": { + "ignore_above": 2048, + "index": false, + "type": "keyword" + }, + "uuid": { + "type": "keyword" + }, + "workflow_reason": { + "type": "keyword" + }, + "workflow_status": { + "type": "keyword" + }, + "workflow_user": { + "type": "keyword" + } + } + }, + "space_ids": { + "type": "keyword" + }, + "version": { + "type": "version" + } + } + }, + "labels": { + "type": "object" + }, + "log": { + "properties": { + "file": { + "properties": { + "path": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "level": { + "ignore_above": 1024, + "type": "keyword" + }, + "logger": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin": { + "properties": { + "file": { + "properties": { + "line": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "function": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "syslog": { + "properties": { + "appname": { + "ignore_above": 1024, + "type": "keyword" + }, + "facility": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgid": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "type": "long" + }, + "procid": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "structured_data": { + "type": "flattened" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "message": { + "type": "match_only_text" + }, + "network": { + "properties": { + "application": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes": { + "type": "long" + }, + "community_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "forwarded_ip": { + "type": "ip" + }, + "iana_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "inner": { + "properties": { + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "transport": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "observer": { + "properties": { + "egress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "orchestrator": { + "properties": { + "api_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "cluster": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "namespace": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "organization": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "package": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "build_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "checksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "install_scope": { + "ignore_above": 1024, + "type": "keyword" + }, + "installed": { + "type": "date" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "process": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "end": { + "type": "date" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "entry_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "attested_groups": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "attested_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "entry_meta": { + "properties": { + "source": { + "properties": { + "ip": { + "type": "ip" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "session_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + } + } + }, + "start": { + "type": "date" + } + } + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "env_vars": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "group_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "io": { + "properties": { + "bytes_skipped": { + "properties": { + "length": { + "type": "long" + }, + "offset": { + "type": "long" + } + } + }, + "max_bytes_per_process_exceeded": { + "type": "boolean" + }, + "text": { + "type": "wildcard" + }, + "total_bytes_captured": { + "type": "long" + }, + "total_bytes_skipped": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "end": { + "type": "date" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "group_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "thread": { + "properties": { + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "uptime": { + "type": "long" + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "previous": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "session_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "session_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + } + } + }, + "start": { + "type": "date" + } + } + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "thread": { + "properties": { + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + }, + "columns": { + "type": "long" + }, + "rows": { + "type": "long" + } + } + }, + "uptime": { + "type": "long" + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "related": { + "properties": { + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "hosts": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rule": { + "properties": { + "author": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "ruleset": { + "ignore_above": 1024, + "type": "keyword" + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "service": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "origin": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "target": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "signal": { + "properties": { + "ancestors": { + "properties": { + "depth": { + "path": "kibana.alert.ancestors.depth", + "type": "alias" + }, + "id": { + "path": "kibana.alert.ancestors.id", + "type": "alias" + }, + "index": { + "path": "kibana.alert.ancestors.index", + "type": "alias" + }, + "type": { + "path": "kibana.alert.ancestors.type", + "type": "alias" + } + } + }, + "depth": { + "path": "kibana.alert.depth", + "type": "alias" + }, + "group": { + "properties": { + "id": { + "path": "kibana.alert.group.id", + "type": "alias" + }, + "index": { + "path": "kibana.alert.group.index", + "type": "alias" + } + } + }, + "original_event": { + "properties": { + "action": { + "path": "kibana.alert.original_event.action", + "type": "alias" + }, + "category": { + "path": "kibana.alert.original_event.category", + "type": "alias" + }, + "code": { + "path": "kibana.alert.original_event.code", + "type": "alias" + }, + "created": { + "path": "kibana.alert.original_event.created", + "type": "alias" + }, + "dataset": { + "path": "kibana.alert.original_event.dataset", + "type": "alias" + }, + "duration": { + "path": "kibana.alert.original_event.duration", + "type": "alias" + }, + "end": { + "path": "kibana.alert.original_event.end", + "type": "alias" + }, + "hash": { + "path": "kibana.alert.original_event.hash", + "type": "alias" + }, + "id": { + "path": "kibana.alert.original_event.id", + "type": "alias" + }, + "kind": { + "path": "kibana.alert.original_event.kind", + "type": "alias" + }, + "module": { + "path": "kibana.alert.original_event.module", + "type": "alias" + }, + "outcome": { + "path": "kibana.alert.original_event.outcome", + "type": "alias" + }, + "provider": { + "path": "kibana.alert.original_event.provider", + "type": "alias" + }, + "reason": { + "path": "kibana.alert.original_event.reason", + "type": "alias" + }, + "risk_score": { + "path": "kibana.alert.original_event.risk_score", + "type": "alias" + }, + "risk_score_norm": { + "path": "kibana.alert.original_event.risk_score_norm", + "type": "alias" + }, + "sequence": { + "path": "kibana.alert.original_event.sequence", + "type": "alias" + }, + "severity": { + "path": "kibana.alert.original_event.severity", + "type": "alias" + }, + "start": { + "path": "kibana.alert.original_event.start", + "type": "alias" + }, + "timezone": { + "path": "kibana.alert.original_event.timezone", + "type": "alias" + }, + "type": { + "path": "kibana.alert.original_event.type", + "type": "alias" + } + } + }, + "original_time": { + "path": "kibana.alert.original_time", + "type": "alias" + }, + "reason": { + "path": "kibana.alert.reason", + "type": "alias" + }, + "rule": { + "properties": { + "author": { + "path": "kibana.alert.rule.author", + "type": "alias" + }, + "building_block_type": { + "path": "kibana.alert.building_block_type", + "type": "alias" + }, + "created_at": { + "path": "kibana.alert.rule.created_at", + "type": "alias" + }, + "created_by": { + "path": "kibana.alert.rule.created_by", + "type": "alias" + }, + "description": { + "path": "kibana.alert.rule.description", + "type": "alias" + }, + "enabled": { + "path": "kibana.alert.rule.enabled", + "type": "alias" + }, + "false_positives": { + "path": "kibana.alert.rule.false_positives", + "type": "alias" + }, + "from": { + "path": "kibana.alert.rule.from", + "type": "alias" + }, + "id": { + "path": "kibana.alert.rule.uuid", + "type": "alias" + }, + "immutable": { + "path": "kibana.alert.rule.immutable", + "type": "alias" + }, + "interval": { + "path": "kibana.alert.rule.interval", + "type": "alias" + }, + "license": { + "path": "kibana.alert.rule.license", + "type": "alias" + }, + "max_signals": { + "path": "kibana.alert.rule.max_signals", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.name", + "type": "alias" + }, + "note": { + "path": "kibana.alert.rule.note", + "type": "alias" + }, + "references": { + "path": "kibana.alert.rule.references", + "type": "alias" + }, + "risk_score": { + "path": "kibana.alert.risk_score", + "type": "alias" + }, + "rule_id": { + "path": "kibana.alert.rule.rule_id", + "type": "alias" + }, + "rule_name_override": { + "path": "kibana.alert.rule.rule_name_override", + "type": "alias" + }, + "severity": { + "path": "kibana.alert.severity", + "type": "alias" + }, + "tags": { + "path": "kibana.alert.rule.tags", + "type": "alias" + }, + "threat": { + "properties": { + "framework": { + "path": "kibana.alert.rule.threat.framework", + "type": "alias" + }, + "tactic": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.tactic.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.tactic.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.tactic.reference", + "type": "alias" + } + } + }, + "technique": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.technique.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.technique.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.technique.reference", + "type": "alias" + }, + "subtechnique": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.technique.subtechnique.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.technique.subtechnique.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.technique.subtechnique.reference", + "type": "alias" + } + } + } + } + } + } + }, + "timeline_id": { + "path": "kibana.alert.rule.timeline_id", + "type": "alias" + }, + "timeline_title": { + "path": "kibana.alert.rule.timeline_title", + "type": "alias" + }, + "timestamp_override": { + "path": "kibana.alert.rule.timestamp_override", + "type": "alias" + }, + "to": { + "path": "kibana.alert.rule.to", + "type": "alias" + }, + "type": { + "path": "kibana.alert.rule.type", + "type": "alias" + }, + "updated_at": { + "path": "kibana.alert.rule.updated_at", + "type": "alias" + }, + "updated_by": { + "path": "kibana.alert.rule.updated_by", + "type": "alias" + }, + "version": { + "path": "kibana.alert.rule.version", + "type": "alias" + } + } + }, + "status": { + "path": "kibana.alert.workflow_status", + "type": "alias" + }, + "threshold_result": { + "properties": { + "cardinality": { + "properties": { + "field": { + "path": "kibana.alert.threshold_result.cardinality.field", + "type": "alias" + }, + "value": { + "path": "kibana.alert.threshold_result.cardinality.value", + "type": "alias" + } + } + }, + "count": { + "path": "kibana.alert.threshold_result.count", + "type": "alias" + }, + "from": { + "path": "kibana.alert.threshold_result.from", + "type": "alias" + }, + "terms": { + "properties": { + "field": { + "path": "kibana.alert.threshold_result.terms.field", + "type": "alias" + }, + "value": { + "path": "kibana.alert.threshold_result.terms.value", + "type": "alias" + } + } + } + } + } + } + }, + "source": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "span": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tags": { + "type": "keyword" + }, + "threat": { + "properties": { + "enrichments": { + "properties": { + "indicator": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "first_seen": { + "type": "date" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "last_seen": { + "type": "date" + }, + "marking": { + "properties": { + "tlp": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlp_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "modified_at": { + "type": "date" + }, + "port": { + "type": "long" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scanner_stats": { + "type": "long" + }, + "sightings": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "matched": { + "properties": { + "atomic": { + "ignore_above": 1024, + "type": "keyword" + }, + "field": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "index": { + "ignore_above": 1024, + "type": "keyword" + }, + "occurred": { + "type": "date" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + }, + "type": "nested" + }, + "feed": { + "properties": { + "dashboard_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "framework": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "indicator": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "first_seen": { + "type": "date" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "last_seen": { + "type": "date" + }, + "marking": { + "properties": { + "tlp": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlp_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "modified_at": { + "type": "date" + }, + "port": { + "type": "long" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scanner_stats": { + "type": "long" + }, + "sightings": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "software": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "platforms": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tactic": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "technique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "subtechnique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "tls": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "client": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "supported_ciphers": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "established": { + "type": "boolean" + }, + "next_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "resumed": { + "type": "boolean" + }, + "server": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3s": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + }, + "version_protocol": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "trace": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "transaction": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "changes": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "effective": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "risk": { + "properties": { + "calculated_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "calculated_score": { + "type": "float" + }, + "calculated_score_norm": { + "type": "float" + }, + "static_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "static_score": { + "type": "float" + }, + "static_score_norm": { + "type": "float" + } + } + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + }, + "target": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "user_agent": { + "properties": { + "device": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vulnerability": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "enumeration": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "report_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "scanner": { + "properties": { + "vendor": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "score": { + "properties": { + "base": { + "type": "float" + }, + "environmental": { + "type": "float" + }, + "temporal": { + "type": "float" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "hidden": "true", + "mapping": { + "total_fields": { + "limit": "2500" + } + }, + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} diff --git a/x-pack/test/functional/page_objects/index.ts b/x-pack/test/functional/page_objects/index.ts index a8ac0895ed255..75f86f7645954 100644 --- a/x-pack/test/functional/page_objects/index.ts +++ b/x-pack/test/functional/page_objects/index.ts @@ -48,6 +48,7 @@ import { StatusPageObject } from './status_page'; import { TagManagementPageObject } from './tag_management_page'; import { UpgradeAssistantPageObject } from './upgrade_assistant_page'; import { UptimePageObject } from './uptime_page'; +import { UserProfilePageProvider } from './user_profile_page'; import { WatcherPageObject } from './watcher_page'; // just like services, PageObjects are defined as a map of @@ -95,5 +96,6 @@ export const pageObjects = { tagManagement: TagManagementPageObject, upgradeAssistant: UpgradeAssistantPageObject, uptime: UptimePageObject, + userProfiles: UserProfilePageProvider, watcher: WatcherPageObject, }; diff --git a/x-pack/test/functional/page_objects/remote_clusters_page.ts b/x-pack/test/functional/page_objects/remote_clusters_page.ts index b9f24dd1854d2..253ba3a27ff02 100644 --- a/x-pack/test/functional/page_objects/remote_clusters_page.ts +++ b/x-pack/test/functional/page_objects/remote_clusters_page.ts @@ -35,7 +35,7 @@ export function RemoteClustersPageProvider({ getService }: FtrProviderContext) { // Complete trust setup await testSubjects.click('setupTrustDoneButton'); - await testSubjects.setCheckbox('remoteClusterTrustCheckbox', 'check'); + await testSubjects.setCheckbox('remoteClusterTrustCheckboxLabel', 'check'); await testSubjects.click('remoteClusterTrustSubmitButton'); }, async getRemoteClustersList() { diff --git a/x-pack/test/functional/page_objects/user_profile_page.ts b/x-pack/test/functional/page_objects/user_profile_page.ts new file mode 100644 index 0000000000000..3380c10e20677 --- /dev/null +++ b/x-pack/test/functional/page_objects/user_profile_page.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export function UserProfilePageProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const find = getService('find'); + const browser = getService('browser'); + const retry = getService('retry'); + + const getThemeTag = async (): Promise => { + return await browser.execute('return __kbnThemeTag__'); + }; + + const getSaveProfileChangesButton = async () => { + return await testSubjects.find('saveProfileChangesButton'); + }; + + const getReloadWindowButton = async () => { + return await testSubjects.find('windowReloadButton'); + }; + + const getThemeKeypadButton = async (option: string) => { + option = option[0].toUpperCase() + option.substring(1).toLowerCase(); + return await testSubjects.find(`themeKeyPadItem${option}`); + }; + + const saveUserProfileChanges = async (): Promise => { + let saveProfileChangesButton; + await retry.try(async () => { + saveProfileChangesButton = await getSaveProfileChangesButton(); + expect(saveProfileChangesButton).not.to.be(null); + await saveProfileChangesButton.click(); + }); + }; + + const changeUserProfileTheme = async (theme: string): Promise => { + const themeModeButton = await getThemeKeypadButton(theme); + expect(themeModeButton).not.to.be(null); + await themeModeButton.click(); + + await saveUserProfileChanges(); + + let reloadWindowButton; + await retry.try(async () => { + reloadWindowButton = await getReloadWindowButton(); + expect(reloadWindowButton).not.to.be(null); + await reloadWindowButton.click(); + }); + }; + + return { + async getThemeKeypadMenu() { + return await find.byCssSelector('.euiKeyPadMenu'); + }, + + async setFullNameInputField(newFullName: string) { + return await testSubjects.setValue('userProfileFullName', newFullName); + }, + + async setEmailInputField(newEmailAddress: string, clearWithKeyboard: boolean = false) { + return await testSubjects.setValue('userProfileEmail', newEmailAddress, { + clearWithKeyboard, + }); + }, + + async getChangePasswordButton() { + return await testSubjects.find('openChangePasswordForm'); + }, + + async setCurrentPasswordField(currentPassword: string) { + return await testSubjects.setValue( + 'editUserChangePasswordCurrentPasswordInput', + currentPassword + ); + }, + + async setNewPasswordField(newPassword: string) { + return await testSubjects.setValue('editUserChangePasswordNewPasswordInput', newPassword); + }, + + async setConfirmPasswordField(newPassword: string) { + return await testSubjects.setValue('editUserChangePasswordConfirmPasswordInput', newPassword); + }, + + async getChangePasswordFormSubmitButton() { + return await testSubjects.find('changePasswordFormSubmitButton'); + }, + getThemeTag, + saveUserProfileChanges, + changeUserProfileTheme, + }; +} diff --git a/x-pack/test/functional/services/aiops/change_point_detection_page.ts b/x-pack/test/functional/services/aiops/change_point_detection_page.ts index 4f83137df472e..b4950763194c0 100644 --- a/x-pack/test/functional/services/aiops/change_point_detection_page.ts +++ b/x-pack/test/functional/services/aiops/change_point_detection_page.ts @@ -26,7 +26,7 @@ export function ChangePointDetectionPageProvider( const dashboardPage = getPageObject('dashboard'); return { - async navigateToIndexPatternSelection() { + async navigateToDataViewSelection() { await testSubjects.click('mlMainTab changePointDetection'); await testSubjects.existOrFail('mlPageSourceSelection'); }, diff --git a/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts b/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts index 59c786833a53e..661881a288381 100644 --- a/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts +++ b/x-pack/test/functional/services/aiops/log_pattern_analysis_page.ts @@ -21,7 +21,7 @@ export function LogPatternAnalysisPageProvider({ getService, getPageObject }: Ft }); }, - async navigateToIndexPatternSelection() { + async navigateToDataViewSelection() { await testSubjects.click('mlMainTab logCategorization'); await testSubjects.existOrFail('mlPageSourceSelection'); }, diff --git a/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts b/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts index 510a056ca5c42..ea2251a475889 100644 --- a/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts +++ b/x-pack/test/functional/services/aiops/log_rate_analysis_page.ts @@ -255,7 +255,7 @@ export function LogRateAnalysisPageProvider({ getService, getPageObject }: FtrPr }); }, - async navigateToIndexPatternSelection() { + async navigateToDataViewSelection() { await testSubjects.click('mlMainTab logRateAnalysis'); await testSubjects.existOrFail('mlPageSourceSelection'); }, diff --git a/x-pack/test/functional/services/logs_ui/log_entry_rate.ts b/x-pack/test/functional/services/logs_ui/log_entry_rate.ts index 6be84edeb1940..bf58d74a06c44 100644 --- a/x-pack/test/functional/services/logs_ui/log_entry_rate.ts +++ b/x-pack/test/functional/services/logs_ui/log_entry_rate.ts @@ -21,8 +21,60 @@ export function LogEntryRatePageProvider({ getPageObjects, getService }: FtrProv return await testSubjects.find('logEntryRateSetupPage'); }, + async getResultsScreen(): Promise { + return await testSubjects.find('logEntryRateResultsPage'); + }, + async getNoDataScreen() { return await testSubjects.find('noDataPage'); }, + + async startJobSetup() { + await testSubjects.click('infraLogEntryRateSetupContentMlSetupButton'); + }, + + async manageMlJobs() { + await testSubjects.click('infraManageJobsButtonManageMlJobsButton'); + }, + + async getSetupFlyout(): Promise { + return await testSubjects.find('infraLogAnalysisSetupFlyout'); + }, + + async startRateJobCreation() { + const buttons = await testSubjects.findAll('infraCreateJobButtonButton'); + await buttons[0].click(); + }, + + async startCategoriesCountJobCreation() { + const buttons = await testSubjects.findAll('infraCreateJobButtonButton'); + await buttons[1].click(); + }, + + async canCreateJob() { + const createJobButton = await testSubjects.find('infraCreateMLJobsButtonCreateMlJobButton'); + const disabled = await createJobButton.getAttribute('disabled'); + return disabled !== 'true'; + }, + + async createJob() { + await testSubjects.click('infraCreateMLJobsButtonCreateMlJobButton'); + }, + + async canRecreateJob() { + const createJobButton = await testSubjects.find( + 'infraRecreateMLJobsButtonRecreateMlJobsButton' + ); + const disabled = await createJobButton.getAttribute('disabled'); + return disabled !== 'true'; + }, + + async recreateJob() { + await testSubjects.click('infraRecreateMLJobsButtonRecreateMlJobsButton'); + }, + + async jobCreationDone() { + return await testSubjects.exists('infraProcessStepViewResultsButton'); + }, }; } diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts index beedbb145dce4..3580bd2c8529c 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_creation.ts @@ -623,22 +623,22 @@ export function MachineLearningDataFrameAnalyticsCreationProvider( }); }, - async assertCreateIndexPatternSwitchExists() { - await testSubjects.existOrFail(`mlAnalyticsCreateJobWizardCreateIndexPatternCheckbox`, { + async assertCreateDataViewSwitchExists() { + await testSubjects.existOrFail(`mlAnalyticsCreateJobWizardCreateDataViewCheckbox`, { allowHidden: true, }); }, - async getCreateIndexPatternSwitchCheckState(): Promise { + async getCreateDataViewSwitchCheckState(): Promise { const state = await testSubjects.getAttribute( - 'mlAnalyticsCreateJobWizardCreateIndexPatternCheckbox', + 'mlAnalyticsCreateJobWizardCreateDataViewCheckbox', 'checked' ); return state === 'true'; }, - async assertCreateIndexPatternSwitchCheckState(expectedCheckState: boolean) { - const actualCheckState = await this.getCreateIndexPatternSwitchCheckState(); + async assertCreateDataViewSwitchCheckState(expectedCheckState: boolean) { + const actualCheckState = await this.getCreateDataViewSwitchCheckState(); expect(actualCheckState).to.eql( expectedCheckState, `Create data view switch check state should be '${expectedCheckState}' (got '${actualCheckState}')` @@ -674,11 +674,11 @@ export function MachineLearningDataFrameAnalyticsCreationProvider( await this.assertDestIndexSameAsIdCheckState(checkState); }, - async setCreateIndexPatternSwitchState(checkState: boolean) { - if ((await this.getCreateIndexPatternSwitchCheckState()) !== checkState) { - await testSubjects.click('mlAnalyticsCreateJobWizardCreateIndexPatternCheckbox'); + async setCreateDataViewSwitchState(checkState: boolean) { + if ((await this.getCreateDataViewSwitchCheckState()) !== checkState) { + await testSubjects.click('mlAnalyticsCreateJobWizardCreateDataViewCheckbox'); } - await this.assertCreateIndexPatternSwitchCheckState(checkState); + await this.assertCreateDataViewSwitchCheckState(checkState); }, async assertStartJobCheckboxExists() { @@ -755,7 +755,6 @@ export function MachineLearningDataFrameAnalyticsCreationProvider( async assertCreationCalloutMessagesExist() { await testSubjects.existOrFail('analyticsWizardCreationCallout_0'); await testSubjects.existOrFail('analyticsWizardCreationCallout_1'); - await testSubjects.existOrFail('analyticsWizardCreationCallout_2'); }, async navigateToJobManagementPage() { diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_edit.ts b/x-pack/test/functional/services/ml/data_frame_analytics_edit.ts index a58820ae393bd..e05be8d8c768c 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_edit.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_edit.ts @@ -18,7 +18,7 @@ import { MlCustomUrls } from './custom_urls'; export interface DiscoverUrlConfig { label: string; - indexPattern: string; + indexName: string; queryEntityFieldNames: string[]; timeRange: TimeRangeType; timeRangeInterval?: string; @@ -98,7 +98,7 @@ export function MachineLearningDataFrameAnalyticsEditProvider( ); await mlCommonUI.selectSelectValueByVisibleText( 'mlJobCustomUrlDiscoverIndexPatternInput', - customUrl.indexPattern + customUrl.indexName ); await customUrls.setCustomUrlQueryEntityFieldNames(customUrl.queryEntityFieldNames); if (addTimerange) { diff --git a/x-pack/test/functional/services/ml/data_visualizer.ts b/x-pack/test/functional/services/ml/data_visualizer.ts index 3571f9193e6b3..cccdeaf07e4fc 100644 --- a/x-pack/test/functional/services/ml/data_visualizer.ts +++ b/x-pack/test/functional/services/ml/data_visualizer.ts @@ -55,7 +55,7 @@ export function MachineLearningDataVisualizerProvider({ getService }: FtrProvide ); }, - async navigateToIndexPatternSelection() { + async navigateToDataViewSelection() { await testSubjects.click('mlDataVisualizerSelectIndexButton'); await testSubjects.existOrFail('mlPageSourceSelection'); }, diff --git a/x-pack/test/functional/services/ml/test_resources.ts b/x-pack/test/functional/services/ml/test_resources.ts index 22f43a08f1e78..5035b6844b9c3 100644 --- a/x-pack/test/functional/services/ml/test_resources.ts +++ b/x-pack/test/functional/services/ml/test_resources.ts @@ -120,7 +120,7 @@ export function MachineLearningTestResourcesProvider( return savedObjectIds; }, - async getIndexPatternId(title: string, space?: string): Promise { + async getDataViewId(title: string, space?: string): Promise { return this.getSavedObjectIdByTitle(title, SavedObjectType.INDEX_PATTERN, space); }, @@ -136,11 +136,7 @@ export function MachineLearningTestResourcesProvider( return this.getSavedObjectIdByTitle(title, SavedObjectType.DASHBOARD); }, - async createIndexPattern( - title: string, - timeFieldName?: string, - space?: string - ): Promise { + async createDataView(title: string, timeFieldName?: string, space?: string): Promise { log.debug( `Creating index pattern with title '${title}'${ timeFieldName !== undefined ? ` and time field '${timeFieldName}'` : '' @@ -153,7 +149,7 @@ export function MachineLearningTestResourcesProvider( .send({ attributes: { title, timeFieldName } }); mlApi.assertResponseStatusCode(200, status, createResponse); - await this.assertIndexPatternExistByTitle(title, space); + await this.assertDataViewExistByTitle(title, space); log.debug(` > Created with id '${createResponse.id}'`); return createResponse.id; @@ -172,21 +168,21 @@ export function MachineLearningTestResourcesProvider( return createResponse; }, - async createIndexPatternIfNeeded( + async createDataViewIfNeeded( title: string, timeFieldName?: string, space?: string ): Promise { - const indexPatternId = await this.getIndexPatternId(title, space); - if (indexPatternId !== undefined) { + const dataViewId = await this.getDataViewId(title, space); + if (dataViewId !== undefined) { log.debug(`Index pattern with title '${title}' already exists. Nothing to create.`); - return indexPatternId; + return dataViewId; } else { - return await this.createIndexPattern(title, timeFieldName, space); + return await this.createDataView(title, timeFieldName, space); } }, - async assertIndexPatternNotExist(title: string) { + async assertDataViewNotExist(title: string) { await this.assertSavedObjectNotExistsByTitle(title, SavedObjectType.INDEX_PATTERN); }, @@ -218,7 +214,7 @@ export function MachineLearningTestResourcesProvider( return createResponse.id; }, - async createSavedSearchIfNeeded(savedSearch: any, indexPatternTitle: string): Promise { + async createSavedSearchIfNeeded(savedSearch: any, dataViewTitle: string): Promise { const title = savedSearch.requestBody.attributes.title; const savedSearchId = await this.getSavedSearchId(title); if (savedSearchId !== undefined) { @@ -227,24 +223,24 @@ export function MachineLearningTestResourcesProvider( } else { const body = await this.updateSavedSearchRequestBody( savedSearch.requestBody, - indexPatternTitle + dataViewTitle ); return await this.createSavedSearch(title, body); } }, - async updateSavedSearchRequestBody(body: object, indexPatternTitle: string): Promise { - const indexPatternId = await this.getIndexPatternId(indexPatternTitle); - if (indexPatternId === undefined) { + async updateSavedSearchRequestBody(body: object, dataViewTitle: string): Promise { + const dataViewId = await this.getDataViewId(dataViewTitle); + if (dataViewId === undefined) { throw new Error( - `Index pattern '${indexPatternTitle}' to base saved search on does not exist. ` + `Index pattern '${dataViewTitle}' to base saved search on does not exist. ` ); } // inject index pattern id const updatedBody = JSON.parse(JSON.stringify(body), (_key, value) => { if (value === 'INDEX_PATTERN_ID_PLACEHOLDER') { - return indexPatternId; + return dataViewId; } else { return value; } @@ -258,8 +254,8 @@ export function MachineLearningTestResourcesProvider( return updatedBody; }, - async createSavedSearchFarequoteFilterIfNeeded(indexPatternTitle: string = 'ft_farequote') { - await this.createSavedSearchIfNeeded(savedSearches.farequoteFilter, indexPatternTitle); + async createSavedSearchFarequoteFilterIfNeeded(dataViewTitle: string = 'ft_farequote') { + await this.createSavedSearchIfNeeded(savedSearches.farequoteFilter, dataViewTitle); }, async createMLTestDashboardIfNeeded(): Promise { @@ -281,48 +277,37 @@ export function MachineLearningTestResourcesProvider( } }, - async createSavedSearchFarequoteLuceneIfNeeded(indexPatternTitle: string = 'ft_farequote') { - await this.createSavedSearchIfNeeded(savedSearches.farequoteLucene, indexPatternTitle); + async createSavedSearchFarequoteLuceneIfNeeded(dataViewTitle: string = 'ft_farequote') { + await this.createSavedSearchIfNeeded(savedSearches.farequoteLucene, dataViewTitle); }, - async createSavedSearchFarequoteKueryIfNeeded(indexPatternTitle: string = 'ft_farequote') { - await this.createSavedSearchIfNeeded(savedSearches.farequoteKuery, indexPatternTitle); + async createSavedSearchFarequoteKueryIfNeeded(dataViewTitle: string = 'ft_farequote') { + await this.createSavedSearchIfNeeded(savedSearches.farequoteKuery, dataViewTitle); }, async createSavedSearchFarequoteFilterAndLuceneIfNeeded( - indexPatternTitle: string = 'ft_farequote' + dataViewTitle: string = 'ft_farequote' ) { - await this.createSavedSearchIfNeeded( - savedSearches.farequoteFilterAndLucene, - indexPatternTitle - ); + await this.createSavedSearchIfNeeded(savedSearches.farequoteFilterAndLucene, dataViewTitle); }, - async createSavedSearchFarequoteFilterAndKueryIfNeeded( - indexPatternTitle: string = 'ft_farequote' - ) { - await this.createSavedSearchIfNeeded( - savedSearches.farequoteFilterAndKuery, - indexPatternTitle - ); + async createSavedSearchFarequoteFilterAndKueryIfNeeded(dataViewTitle: string = 'ft_farequote') { + await this.createSavedSearchIfNeeded(savedSearches.farequoteFilterAndKuery, dataViewTitle); }, async createSavedSearchFarequoteFilterTwoAndLuceneIfNeeded( - indexPatternTitle: string = 'ft_farequote' + dataViewTitle: string = 'ft_farequote' ) { await this.createSavedSearchIfNeeded( savedSearches.farequoteFilterTwoAndLucene, - indexPatternTitle + dataViewTitle ); }, async createSavedSearchFarequoteFilterTwoAndKueryIfNeeded( - indexPatternTitle: string = 'ft_farequote' + dataViewTitle: string = 'ft_farequote' ) { - await this.createSavedSearchIfNeeded( - savedSearches.farequoteFilterTwoAndKuery, - indexPatternTitle - ); + await this.createSavedSearchIfNeeded(savedSearches.farequoteFilterTwoAndKuery, dataViewTitle); }, async deleteSavedObjectById( @@ -349,19 +334,19 @@ export function MachineLearningTestResourcesProvider( } }, - async deleteIndexPatternByTitle(title: string, space?: string) { + async deleteDataViewByTitle(title: string, space?: string) { log.debug(`Deleting index pattern with title '${title}'...`); - const indexPatternId = await this.getIndexPatternId(title, space); - if (indexPatternId === undefined) { + const dataViewId = await this.getDataViewId(title, space); + if (dataViewId === undefined) { log.debug(`Index pattern with title '${title}' does not exists. Nothing to delete.`); return; } else { - await this.deleteIndexPatternById(indexPatternId, space); + await this.deleteDataViewById(dataViewId, space); } }, - async deleteIndexPatternById(id: string, space?: string) { + async deleteDataViewById(id: string, space?: string) { await this.deleteSavedObjectById(id, SavedObjectType.INDEX_PATTERN, false, space); }, @@ -485,11 +470,11 @@ export function MachineLearningTestResourcesProvider( ); }, - async assertIndexPatternExistByTitle(title: string, space?: string) { + async assertDataViewExistByTitle(title: string, space?: string) { await this.assertSavedObjectExistsByTitle(title, SavedObjectType.INDEX_PATTERN, space); }, - async assertIndexPatternExistById(id: string) { + async assertDataViewExistById(id: string) { await this.assertSavedObjectExistsById(id, SavedObjectType.INDEX_PATTERN); }, diff --git a/x-pack/test/functional_basic/apps/ml/data_visualizer/group1/index.ts b/x-pack/test/functional_basic/apps/ml/data_visualizer/group1/index.ts index 37295dda128ad..cf8f8ed7db84a 100644 --- a/x-pack/test/functional_basic/apps/ml/data_visualizer/group1/index.ts +++ b/x-pack/test/functional_basic/apps/ml/data_visualizer/group1/index.ts @@ -25,8 +25,8 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_ecommerce'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_sample_ecommerce'); diff --git a/x-pack/test/functional_basic/apps/ml/data_visualizer/group2/index.ts b/x-pack/test/functional_basic/apps/ml/data_visualizer/group2/index.ts index e1ed6d554a398..c4205e1bffd65 100644 --- a/x-pack/test/functional_basic/apps/ml/data_visualizer/group2/index.ts +++ b/x-pack/test/functional_basic/apps/ml/data_visualizer/group2/index.ts @@ -25,8 +25,8 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_ecommerce'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_sample_ecommerce'); diff --git a/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts b/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts index 18a5dfaec2d60..d2e77f9522854 100644 --- a/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts +++ b/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index.ts @@ -25,8 +25,8 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_ecommerce'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_sample_ecommerce'); diff --git a/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index_data_visualizer_actions_panel.ts b/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index_data_visualizer_actions_panel.ts index f8e2c83a1afd7..62cbc2e41e36a 100644 --- a/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index_data_visualizer_actions_panel.ts +++ b/x-pack/test/functional_basic/apps/ml/data_visualizer/group3/index_data_visualizer_actions_panel.ts @@ -20,7 +20,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); - await ml.testResources.createIndexPatternIfNeeded(indexPatternName, '@timestamp'); + await ml.testResources.createDataViewIfNeeded(indexPatternName, '@timestamp'); await ml.testResources.createSavedSearchFarequoteKueryIfNeeded(); await ml.testResources.setKibanaTimeZoneToUTC(); @@ -34,7 +34,7 @@ export default function ({ getService }: FtrProviderContext) { await ml.navigation.navigateToDataVisualizer(); await ml.testExecution.logTestStep('loads the saved search selection page'); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.testExecution.logTestStep('loads the index data visualizer page'); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(savedSearch); diff --git a/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts b/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts index 0ff4eca82a5cf..49b477f9e110d 100644 --- a/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts +++ b/x-pack/test/functional_basic/apps/ml/permissions/full_ml_access.ts @@ -36,7 +36,7 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.loadIfNeeded( 'x-pack/test/functional/es_archives/ml/module_sample_ecommerce' ); - await ml.testResources.createIndexPatternIfNeeded(ecIndexPattern, 'order_date'); + await ml.testResources.createDataViewIfNeeded(ecIndexPattern, 'order_date'); await ml.securityUI.loginAs(testUser.user); }); @@ -105,7 +105,7 @@ export default function ({ getService }: FtrProviderContext) { it('should display elements on Index Data Visualizer page correctly', async () => { await ml.testExecution.logTestStep('should load an index into the data visualizer page'); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(ecIndexPattern); await ml.testExecution.logTestStep('should display the time range step'); diff --git a/x-pack/test/functional_basic/apps/ml/permissions/index.ts b/x-pack/test/functional_basic/apps/ml/permissions/index.ts index 53e78b4d08c15..8e72bb7bf51e2 100644 --- a/x-pack/test/functional_basic/apps/ml/permissions/index.ts +++ b/x-pack/test/functional_basic/apps/ml/permissions/index.ts @@ -25,8 +25,8 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await ml.testResources.deleteSavedSearches(); - await ml.testResources.deleteIndexPatternByTitle('ft_farequote'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_sample_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_farequote'); + await ml.testResources.deleteDataViewByTitle('ft_module_sample_ecommerce'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/farequote'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_sample_ecommerce'); diff --git a/x-pack/test/functional_basic/apps/ml/permissions/read_ml_access.ts b/x-pack/test/functional_basic/apps/ml/permissions/read_ml_access.ts index c7a3f13d23ed7..60554e8b1604e 100644 --- a/x-pack/test/functional_basic/apps/ml/permissions/read_ml_access.ts +++ b/x-pack/test/functional_basic/apps/ml/permissions/read_ml_access.ts @@ -36,7 +36,7 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.loadIfNeeded( 'x-pack/test/functional/es_archives/ml/module_sample_ecommerce' ); - await ml.testResources.createIndexPatternIfNeeded(ecIndexPattern, 'order_date'); + await ml.testResources.createDataViewIfNeeded(ecIndexPattern, 'order_date'); await ml.securityUI.loginAs(testUser.user); }); @@ -105,7 +105,7 @@ export default function ({ getService }: FtrProviderContext) { it('should display elements on Index Data Visualizer page correctly', async () => { await ml.testExecution.logTestStep('should load an index into the data visualizer page'); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(ecIndexPattern); await ml.testExecution.logTestStep('should display the time range step'); diff --git a/x-pack/test/functional_cloud/tests/cloud_links.ts b/x-pack/test/functional_cloud/tests/cloud_links.ts index 94f67401c98fd..6125b52135b9c 100644 --- a/x-pack/test/functional_cloud/tests/cloud_links.ts +++ b/x-pack/test/functional_cloud/tests/cloud_links.ts @@ -48,11 +48,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('A button to open a modal to view the CloudID and ES endpoint is added', async () => { - await PageObjects.common.clickAndValidate('helpMenuButton', 'endpointsHelpLink'); - expect(await find.byCssSelector('[data-test-subj="endpointsHelpLink"]')).to.not.be(null); + await PageObjects.common.clickAndValidate('helpMenuButton', 'connectionDetailsHelpLink'); + expect(await find.byCssSelector('[data-test-subj="connectionDetailsHelpLink"]')).to.not.be( + null + ); // Open the modal - await PageObjects.common.clickAndValidate('endpointsHelpLink', 'deploymentDetailsModal'); + await PageObjects.common.clickAndValidate( + 'connectionDetailsHelpLink', + 'deploymentDetailsModal' + ); const esEndpointInput = await find.byCssSelector( '[data-test-subj="deploymentDetailsEsEndpoint"]' diff --git a/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/alert_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/alert_flyout.ts index de7a2e42fda01..037e33267dfdb 100644 --- a/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/alert_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/alert_flyout.ts @@ -70,7 +70,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('anomaly detection alert', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); await ml.testResources.setKibanaTimeZoneToUTC(); await ml.securityUI.loginAsMlPowerUser(); diff --git a/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/index.ts b/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/index.ts index ef104c74b820d..7a898b63c3f22 100644 --- a/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/index.ts +++ b/x-pack/test/functional_with_es_ssl/apps/discover_ml_uptime/ml/index.ts @@ -23,7 +23,7 @@ export default ({ loadTestFile, getService }: FtrProviderContext) => { // NOTE: Logout needs to happen before anything else to avoid flaky behavior await ml.securityUI.logout(); - await ml.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + await ml.testResources.deleteDataViewByTitle('ft_ecommerce'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/ecommerce'); await ml.securityCommon.cleanMlUsers(); await ml.securityCommon.cleanMlRoles(); diff --git a/x-pack/test/observability_onboarding_api_integration/common/config.ts b/x-pack/test/observability_onboarding_api_integration/common/config.ts index 32d51a6388b09..55b98b2eaa233 100644 --- a/x-pack/test/observability_onboarding_api_integration/common/config.ts +++ b/x-pack/test/observability_onboarding_api_integration/common/config.ts @@ -13,6 +13,7 @@ import { createObservabilityOnboardingUsers } from '@kbn/observability-onboardin import { FtrConfigProviderContext } from '@kbn/test'; import supertest from 'supertest'; import { format, UrlObject } from 'url'; +import { createLogger, LogLevel, LogsSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { ObservabilityOnboardingFtrConfigName } from '../configs'; import { FtrProviderContext, @@ -64,6 +65,9 @@ export interface CreateTest { services: InheritedServices & { observabilityOnboardingFtrConfig: () => ObservabilityOnboardingFtrConfig; registry: ({ getService }: FtrProviderContext) => ReturnType; + logSynthtraceEsClient: ( + context: InheritedFtrProviderContext + ) => Promise; observabilityOnboardingApiClient: ( context: InheritedFtrProviderContext ) => ObservabilityOnboardingApiClient; @@ -97,6 +101,12 @@ export function createTestConfig( ...services, observabilityOnboardingFtrConfig: () => config, registry: RegistryProvider, + logSynthtraceEsClient: (context: InheritedFtrProviderContext) => + new LogsSynthtraceEsClient({ + client: context.getService('es'), + logger: createLogger(LogLevel.info), + refreshAfterIndex: true, + }), observabilityOnboardingApiClient: async (_: InheritedFtrProviderContext) => { const { username, password } = servers.kibana; const esUrl = format(esServer); diff --git a/x-pack/test/observability_onboarding_api_integration/tests/flow/progress/es_utils.ts b/x-pack/test/observability_onboarding_api_integration/tests/flow/progress/es_utils.ts deleted file mode 100644 index 33207ed6cdd8c..0000000000000 --- a/x-pack/test/observability_onboarding_api_integration/tests/flow/progress/es_utils.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export function createLogDoc({ - time, - logFilepath, - serviceName, - namespace, - datasetName, - message, - agentId, -}: { - time: number; - logFilepath: string; - serviceName?: string; - namespace: string; - datasetName: string; - message: string; - agentId?: string; -}) { - return { - input: { - type: 'log', - }, - '@timestamp': new Date(time).toISOString(), - log: { - file: { - path: logFilepath, - }, - }, - ...(serviceName - ? { - service: { - name: serviceName, - }, - } - : {}), - data_stream: { - namespace, - type: 'logs', - dataset: datasetName, - }, - message, - event: { - dataset: datasetName, - }, - ...(agentId - ? { - agent: { - id: agentId, - }, - } - : {}), - }; -} diff --git a/x-pack/test/observability_onboarding_api_integration/tests/flow/progress/progress.spec.ts b/x-pack/test/observability_onboarding_api_integration/tests/flow/progress/progress.spec.ts index 7311f116736a3..0a7802e9682c6 100644 --- a/x-pack/test/observability_onboarding_api_integration/tests/flow/progress/progress.spec.ts +++ b/x-pack/test/observability_onboarding_api_integration/tests/flow/progress/progress.spec.ts @@ -5,17 +5,17 @@ * 2.0. */ +import { log, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; import { ObservabilityOnboardingApiClientKey } from '../../../common/config'; import { FtrProviderContext } from '../../../common/ftr_provider_context'; import { ObservabilityOnboardingApiError } from '../../../common/observability_onboarding_api_supertest'; import { expectToReject } from '../../../common/utils/expect_to_reject'; -import { createLogDoc } from './es_utils'; export default function ApiTest({ getService }: FtrProviderContext) { const registry = getService('registry'); const observabilityOnboardingApiClient = getService('observabilityOnboardingApiClient'); - const es = getService('es'); + const synthtrace = getService('logSynthtraceEsClient'); async function callApi({ onboardingId, @@ -141,24 +141,24 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('with a different agentId', () => { describe('and onboarding type is logFiles', () => { before(async () => { - await es.indices.createDataStream({ - name: `logs-${datasetName}-${namespace}`, - }); - - const doc = createLogDoc({ - time: new Date('06/28/2023').getTime(), - logFilepath: '/my-service.log', - serviceName: 'my-service', - namespace, - datasetName, - message: 'This is a log message', - agentId: 'another-agent-id', - }); - - await es.bulk({ - body: [{ create: { _index: `logs-${datasetName}-${namespace}` } }, doc], - refresh: 'wait_for', - }); + await synthtrace.index([ + timerange('2023-11-20T10:00:00.000Z', '2023-11-20T10:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(datasetName) + .namespace(namespace) + .service('my-service') + .defaults({ + 'agent.id': 'another-agent-id', + 'log.file.path': '/my-service.log', + }) + ), + ]); }); it('should return log-ingest as incomplete', async () => { @@ -173,9 +173,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - await es.indices.deleteDataStream({ - name: `logs-${datasetName}-${namespace}`, - }); + await synthtrace.clean(); }); }); @@ -211,23 +209,23 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }); - await es.indices.createDataStream({ - name: `logs-system.syslog-${namespace}`, - }); - - const doc = createLogDoc({ - time: new Date('06/28/2023').getTime(), - logFilepath: '/var/log/system.log', - namespace, - datasetName: 'system.syslog', - message: 'This is a system log message', - agentId: 'another-agent-id', - }); - - await es.bulk({ - body: [{ create: { _index: `logs-system.syslog-${namespace}` } }, doc], - refresh: 'wait_for', - }); + await synthtrace.index([ + timerange('2023-11-20T10:00:00.000Z', '2023-11-20T10:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a system log message') + .timestamp(timestamp) + .dataset('system.syslog') + .namespace(namespace) + .defaults({ + 'agent.id': 'another-agent-id', + 'log.file.path': '/var/log/system.log', + }) + ), + ]); }); it('should return log-ingest as incomplete', async () => { @@ -242,9 +240,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - await es.indices.deleteDataStream({ - name: `logs-system.syslog-${namespace}`, - }); + await synthtrace.clean(); }); }); }); @@ -252,24 +248,24 @@ export default function ApiTest({ getService }: FtrProviderContext) { describe('with the expected agentId', () => { describe('and onboarding type is logFiles', () => { before(async () => { - await es.indices.createDataStream({ - name: `logs-${datasetName}-${namespace}`, - }); - - const doc = createLogDoc({ - time: new Date('06/28/2023').getTime(), - logFilepath: '/my-service.log', - serviceName: 'my-service', - namespace, - datasetName, - message: 'This is a log message', - agentId, - }); - - await es.bulk({ - body: [{ create: { _index: `logs-${datasetName}-${namespace}` } }, doc], - refresh: 'wait_for', - }); + await synthtrace.index([ + timerange('2023-11-20T10:00:00.000Z', '2023-11-20T10:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(datasetName) + .namespace(namespace) + .service('my-service') + .defaults({ + 'agent.id': agentId, + 'log.file.path': '/my-service.log', + }) + ), + ]); }); it('should return log-ingest as complete', async () => { @@ -284,9 +280,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - await es.indices.deleteDataStream({ - name: `logs-${datasetName}-${namespace}`, - }); + await synthtrace.clean(); }); }); @@ -322,23 +316,23 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }); - await es.indices.createDataStream({ - name: `logs-system.syslog-${namespace}`, - }); - - const doc = createLogDoc({ - time: new Date('06/28/2023').getTime(), - logFilepath: '/var/log/system.log', - namespace, - datasetName: 'system.syslog', - message: 'This is a system log message', - agentId, - }); - - await es.bulk({ - body: [{ create: { _index: `logs-system.syslog-${namespace}` } }, doc], - refresh: 'wait_for', - }); + await synthtrace.index([ + timerange('2023-11-20T10:00:00.000Z', '2023-11-20T10:01:00.000Z') + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a system log message') + .timestamp(timestamp) + .dataset('system.syslog') + .namespace(namespace) + .defaults({ + 'agent.id': agentId, + 'log.file.path': '/var/log/system.log', + }) + ), + ]); }); it('should return log-ingest as complete', async () => { @@ -353,9 +347,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); after(async () => { - await es.indices.deleteDataStream({ - name: `logs-system.syslog-${namespace}`, - }); + await synthtrace.clean(); }); }); }); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts index 7e48895a9060f..2217310e4e6ae 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts @@ -145,6 +145,7 @@ export default function ({ getService }: FtrProviderContext) { 'security:endpoint-meta-telemetry', 'security:telemetry-configuration', 'security:telemetry-detection-rules', + 'security:telemetry-diagnostic-timelines', 'security:telemetry-filterlist-artifact', 'security:telemetry-lists', 'security:telemetry-prebuilt-rule-alerts', diff --git a/x-pack/test/rule_registry/security_and_spaces/tests/basic/get_browser_fields_by_feature_id.ts b/x-pack/test/rule_registry/security_and_spaces/tests/basic/get_browser_fields_by_feature_id.ts index 94cbdbce77491..fcf67163b2bbb 100644 --- a/x-pack/test/rule_registry/security_and_spaces/tests/basic/get_browser_fields_by_feature_id.ts +++ b/x-pack/test/rule_registry/security_and_spaces/tests/basic/get_browser_fields_by_feature_id.ts @@ -45,9 +45,14 @@ export default ({ getService }: FtrProviderContext) => { 'logs', 'uptime', ]); - expect(Object.keys(resp.browserFields)).toEqual( - expect.arrayContaining(['base', 'event', 'kibana']) - ); + expect(Object.keys(resp.browserFields)).toEqual([ + 'base', + 'cloud', + 'container', + 'host', + 'kibana', + 'orchestrator', + ]); }); it(`${superUser.username} should be able to get browser fields for o11y featureIds`, async () => { @@ -57,21 +62,14 @@ export default ({ getService }: FtrProviderContext) => { 'logs', 'uptime', ]); - expect(Object.keys(resp.browserFields)).toEqual( - expect.arrayContaining([ - 'base', - 'agent', - 'anomaly', - 'ecs', - 'error', - 'event', - 'kibana', - 'monitor', - 'observer', - 'tls', - 'url', - ]) - ); + expect(Object.keys(resp.browserFields)).toEqual([ + 'base', + 'cloud', + 'container', + 'host', + 'kibana', + 'orchestrator', + ]); }); it(`${superUser.username} should NOT be able to get browser fields for siem featureId`, async () => { diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/generate_anomaly_alerts.ts b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/generate_anomaly_alerts.ts index cec6ed8528a10..8d93f1349cae6 100644 --- a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/generate_anomaly_alerts.ts +++ b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/generate_anomaly_alerts.ts @@ -78,7 +78,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('anomaly detection alert', function () { before(async () => { await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); - await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + await ml.testResources.createDataViewIfNeeded('ft_ecommerce', 'order_date'); const { job, datafeed } = createTestJobAndDatafeed(); diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/geographic_data.ts b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/geographic_data.ts index e79539d01bbb6..c6db2071f2354 100644 --- a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/geographic_data.ts +++ b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/geographic_data.ts @@ -101,7 +101,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await ml.testExecution.logTestStep('open index in data visualizer'); await ml.navigation.navigateToMl(); await ml.navigation.navigateToDataVisualizer(); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(LOGS_INDEX_PATTERN); await ml.testExecution.logTestStep('set data visualizer options'); diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/mapping_anomalies.ts b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/mapping_anomalies.ts index c6affe8bf3c3a..7dcc26758ed46 100644 --- a/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/mapping_anomalies.ts +++ b/x-pack/test/screenshot_creation/apps/ml_docs/anomaly_detection/mapping_anomalies.ts @@ -60,7 +60,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await ml.testExecution.logTestStep('open index in data visualizer'); await ml.navigation.navigateToMl(); await ml.navigation.navigateToDataVisualizer(); - await ml.dataVisualizer.navigateToIndexPatternSelection(); + await ml.dataVisualizer.navigateToDataViewSelection(); await ml.jobSourceSelection.selectSourceForIndexBasedDataVisualizer(LOGS_INDEX_PATTERN); await ml.testExecution.logTestStep('set data visualizer options'); diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/classification.ts b/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/classification.ts index 3dc766e428b59..f49750a993d07 100644 --- a/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/classification.ts +++ b/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/classification.ts @@ -40,12 +40,12 @@ export default function ({ getService }: FtrProviderContext) { describe('classification job', function () { before(async () => { await ml.api.createAndRunDFAJob(classificationJobConfig as DataFrameAnalyticsConfig); - await ml.testResources.createIndexPatternIfNeeded(classificationJobConfig.dest!.index!); + await ml.testResources.createDataViewIfNeeded(classificationJobConfig.dest!.index!); }); after(async () => { await ml.api.deleteDataFrameAnalyticsJobES(classificationJobConfig.id as string); - await ml.testResources.deleteIndexPatternByTitle(classificationJobConfig.dest!.index!); + await ml.testResources.deleteDataViewByTitle(classificationJobConfig.dest!.index!); await ml.api.deleteIndices(classificationJobConfig.dest!.index!); await ml.api.cleanMlIndices(); }); diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/outlier_detection.ts b/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/outlier_detection.ts index 73e3a22d28c94..88e6091cd008b 100644 --- a/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/outlier_detection.ts +++ b/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/outlier_detection.ts @@ -49,19 +49,19 @@ export default function ({ getService }: FtrProviderContext) { describe('outlier detection job', function () { before(async () => { await transform.api.createAndRunTransform(transformConfig.id, transformConfig); - await ml.testResources.createIndexPatternIfNeeded(transformConfig.dest.index); + await ml.testResources.createDataViewIfNeeded(transformConfig.dest.index); await ml.api.createAndRunDFAJob(outlierJobConfig as DataFrameAnalyticsConfig); - await ml.testResources.createIndexPatternIfNeeded(outlierJobConfig.dest!.index!); + await ml.testResources.createDataViewIfNeeded(outlierJobConfig.dest!.index!); }); after(async () => { - await ml.testResources.deleteIndexPatternByTitle(transformConfig.dest.index); + await ml.testResources.deleteDataViewByTitle(transformConfig.dest.index); await transform.api.deleteIndices(transformConfig.dest.index); await transform.api.cleanTransformIndices(); await ml.api.deleteDataFrameAnalyticsJobES(outlierJobConfig.id as string); - await ml.testResources.deleteIndexPatternByTitle(outlierJobConfig.dest!.index!); + await ml.testResources.deleteDataViewByTitle(outlierJobConfig.dest!.index!); await ml.api.deleteIndices(outlierJobConfig.dest!.index!); await ml.api.cleanMlIndices(); }); diff --git a/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/regression.ts b/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/regression.ts index edf8c8d971a6c..3dc79e031a8b4 100644 --- a/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/regression.ts +++ b/x-pack/test/screenshot_creation/apps/ml_docs/data_frame_analytics/regression.ts @@ -41,12 +41,12 @@ export default function ({ getService }: FtrProviderContext) { describe('regression job', function () { before(async () => { await ml.api.createAndRunDFAJob(regressionJobConfig as DataFrameAnalyticsConfig); - await ml.testResources.createIndexPatternIfNeeded(regressionJobConfig.dest!.index!); + await ml.testResources.createDataViewIfNeeded(regressionJobConfig.dest!.index!); }); after(async () => { await ml.api.deleteDataFrameAnalyticsJobES(regressionJobConfig.id as string); - await ml.testResources.deleteIndexPatternByTitle(regressionJobConfig.dest!.index!); + await ml.testResources.deleteDataViewByTitle(regressionJobConfig.dest!.index!); await ml.api.deleteIndices(regressionJobConfig.dest!.index!); await ml.api.cleanMlIndices(); }); diff --git a/x-pack/plugins/observability/common/custom_threshold_rule/constants.ts b/x-pack/test/security_solution_api_integration/config/ess/config.base.basic.ts similarity index 60% rename from x-pack/plugins/observability/common/custom_threshold_rule/constants.ts rename to x-pack/test/security_solution_api_integration/config/ess/config.base.basic.ts index 7f7c3a5bcbb3f..15104fe97292a 100644 --- a/x-pack/plugins/observability/common/custom_threshold_rule/constants.ts +++ b/x-pack/test/security_solution_api_integration/config/ess/config.base.basic.ts @@ -5,13 +5,9 @@ * 2.0. */ -export const METRIC_EXPLORER_AGGREGATIONS = [ - 'avg', - 'max', - 'min', - 'cardinality', - 'count', - 'sum', -] as const; +import { createTestConfig } from './config.base'; -export const CUSTOM_AGGREGATOR = 'custom'; +export default createTestConfig({ + license: 'basic', + ssl: true, +}); diff --git a/x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts b/x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts new file mode 100644 index 0000000000000..377d970d3451d --- /dev/null +++ b/x-pack/test/security_solution_api_integration/config/serverless/config.base.essentials.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { FtrConfigProviderContext } from '@kbn/test'; +export interface CreateTestConfigOptions { + testFiles: string[]; + junit: { reportName: string }; + kbnTestServerArgs?: string[]; + kbnTestServerEnv?: Record; +} +import { services } from '../../../../test_serverless/api_integration/services'; + +export function createTestConfig(options: CreateTestConfigOptions) { + return async ({ readConfigFile }: FtrConfigProviderContext) => { + const svlSharedConfig = await readConfigFile( + require.resolve('../../../../test_serverless/shared/config.base.ts') + ); + return { + ...svlSharedConfig.getAll(), + services: { + ...services, + }, + kbnTestServer: { + ...svlSharedConfig.get('kbnTestServer'), + serverArgs: [ + ...svlSharedConfig.get('kbnTestServer.serverArgs'), + '--serverless=security', + `--xpack.securitySolutionServerless.productTypes=${JSON.stringify([ + { product_line: 'security', product_tier: 'essentials' }, + { product_line: 'endpoint', product_tier: 'essentials' }, + ])}`, + ...(options.kbnTestServerArgs || []), + ], + env: { + ...svlSharedConfig.get('kbnTestServer.env'), + ...options.kbnTestServerEnv, + }, + }, + testFiles: options.testFiles, + junit: options.junit, + + mochaOpts: { + ...svlSharedConfig.get('mochaOpts'), + grep: '/^(?!.*@brokenInServerless).*@serverless.*/', + }, + }; + }; +} diff --git a/x-pack/test/security_solution_api_integration/package.json b/x-pack/test/security_solution_api_integration/package.json index 50dc47f95b1b3..96d592a5c9f7e 100644 --- a/x-pack/test/security_solution_api_integration/package.json +++ b/x-pack/test/security_solution_api_integration/package.json @@ -7,6 +7,8 @@ "scripts": { "initialize-server:dr:default": "node ./scripts/index.js server detections_response default_license", "run-tests:dr:default": "node ./scripts/index.js runner detections_response default_license", + "initialize-server:dr:basicEssentials": "node ./scripts/index.js server detections_response basic_essentials_license", + "run-tests:dr:basicEssentials": "node ./scripts/index.js runner detections_response basic_essentials_license", "initialize-server:ea:default": "node ./scripts/index.js server entity_analytics default_license", "run-tests:ea:default": "node ./scripts/index.js runner entity_analytics default_license", "exception_workflows:server:serverless": "npm run initialize-server:dr:default exceptions/workflows serverless", @@ -98,6 +100,11 @@ "telemetry:runner:serverless": "npm run run-tests:dr:default telemetry serverless serverlessEnv", "telemetry:qa:serverless": "npm run run-tests:dr:default telemetry serverless qaEnv", "telemetry:server:ess": "npm run initialize-server:dr:default telemetry ess", - "telemetry:runner:ess": "npm run run-tests:dr:default telemetry ess essEnv" + "telemetry:runner:ess": "npm run run-tests:dr:default telemetry ess essEnv", + "detection_engine_basicessentionals:server:serverless": "npm run initialize-server:dr:basicEssentials detection_engine serverless", + "detection_engine_basicessentionals:runner:serverless": "npm run run-tests:dr:basicEssentials detection_engine serverless serverlessEnv", + "detection_engine_basicessentionals:qa:serverless": "npm run run-tests:dr:basicEssentials detection_engine serverless qaEnv", + "detection_engine_basicessentionals:server:ess": "npm run initialize-server:dr:basicEssentials detection_engine ess", + "detection_engine_basicessentionals:runner:ess": "npm run run-tests:dr:basicEssentials detection_engine ess essEnv" } } diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/open_close_signals.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/open_close_alerts.ts similarity index 52% rename from x-pack/test/detection_engine_api_integration/basic/tests/open_close_signals.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/open_close_alerts.ts index cc1216e80dd8f..4af66d1da4a93 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/open_close_signals.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/open_close_alerts.ts @@ -14,40 +14,45 @@ import { DETECTION_ENGINE_QUERY_SIGNALS_URL, } from '@kbn/security-solution-plugin/common/constants'; import { DetectionAlert } from '@kbn/security-solution-plugin/common/api/detection_engine'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; import { - createSignalsIndex, - setSignalStatus, - getQuerySignalIds, + createAlertsIndex, + setAlertStatus, + getQueryAlertIds, deleteAllRules, createRule, - waitForSignalsToBePresent, - getSignalsByIds, + waitForAlertsToBePresent, + getAlertsByIds, waitForRuleSuccess, - getRuleForSignalTesting, + getRuleForAlertTesting, deleteAllAlerts, -} from '../../utils'; +} from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const log = getService('log'); const es = getService('es'); + // TODO: add a new service + const config = getService('config'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const auditbeatHost = dataPathBuilder.getPath('auditbeat/hosts'); - describe('open_close_signals', () => { + describe('@ess @serverless open_close_alerts', () => { describe('tests with auditbeat data', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(auditbeatHost); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(auditbeatHost); }); beforeEach(async () => { await deleteAllRules(supertest, log); - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -55,94 +60,94 @@ export default ({ getService }: FtrProviderContext) => { await deleteAllRules(supertest, log); }); - it('should be able to execute and get 10 signals', async () => { + it('should be able to execute and get 10 alerts', async () => { const rule = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: 'process.executable: "/usr/bin/sudo"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 10, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - expect(signalsOpen.hits.hits.length).equal(10); + await waitForAlertsToBePresent(supertest, log, 10, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + expect(alertsOpen.hits.hits.length).equal(10); }); - it('should be have set the signals in an open state initially', async () => { + it('should be have set the alerts in an open state initially', async () => { const rule = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: 'process.executable: "/usr/bin/sudo"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 10, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - const everySignalOpen = signalsOpen.hits.hits.every( + await waitForAlertsToBePresent(supertest, log, 10, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + const everyAlertOpen = alertsOpen.hits.hits.every( (hit) => hit._source?.[ALERT_WORKFLOW_STATUS] === 'open' ); - expect(everySignalOpen).to.eql(true); + expect(everyAlertOpen).to.eql(true); }); - it('should be able to get a count of 10 closed signals when closing 10', async () => { + it('should be able to get a count of 10 closed alerts when closing 10', async () => { const rule = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: 'process.executable: "/usr/bin/sudo"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 10, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - const signalIds = signalsOpen.hits.hits.map((signal) => signal._id); + await waitForAlertsToBePresent(supertest, log, 10, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + const alertIds = alertsOpen.hits.hits.map((alert) => alert._id); - // set all of the signals to the state of closed. There is no reason to use a waitUntil here + // set all of the alerts to the state of closed. There is no reason to use a waitUntil here // as this route intentionally has a waitFor within it and should only return when the query has // the data. await supertest .post(DETECTION_ENGINE_SIGNALS_STATUS_URL) .set('kbn-xsrf', 'true') - .send(setSignalStatus({ signalIds, status: 'closed' })) + .send(setAlertStatus({ alertIds, status: 'closed' })) .expect(200); - const { body: signalsClosed }: { body: estypes.SearchResponse } = + const { body: alertsClosed }: { body: estypes.SearchResponse } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getQuerySignalIds(signalIds)) + .send(getQueryAlertIds(alertIds)) .expect(200); - expect(signalsClosed.hits.hits.length).to.equal(10); + expect(alertsClosed.hits.hits.length).to.equal(10); }); // Test is failing after changing refresh to false - it.skip('should be able close 10 signals immediately and they all should be closed', async () => { + it.skip('should be able close 10 alerts immediately and they all should be closed', async () => { const rule = { - ...getRuleForSignalTesting(['auditbeat-*']), + ...getRuleForAlertTesting(['auditbeat-*']), query: 'process.executable: "/usr/bin/sudo"', }; const { id } = await createRule(supertest, log, rule); await waitForRuleSuccess({ supertest, log, id }); - await waitForSignalsToBePresent(supertest, log, 10, [id]); - const signalsOpen = await getSignalsByIds(supertest, log, [id]); - const signalIds = signalsOpen.hits.hits.map((signal) => signal._id); + await waitForAlertsToBePresent(supertest, log, 10, [id]); + const alertsOpen = await getAlertsByIds(supertest, log, [id]); + const alertIds = alertsOpen.hits.hits.map((alert) => alert._id); - // set all of the signals to the state of closed. There is no reason to use a waitUntil here + // set all of the alerts to the state of closed. There is no reason to use a waitUntil here // as this route intentionally has a waitFor within it and should only return when the query has // the data. await supertest .post(DETECTION_ENGINE_SIGNALS_STATUS_URL) .set('kbn-xsrf', 'true') - .send(setSignalStatus({ signalIds, status: 'closed' })) + .send(setAlertStatus({ alertIds, status: 'closed' })) .expect(200); - const { body: signalsClosed }: { body: estypes.SearchResponse } = + const { body: alertsClosed }: { body: estypes.SearchResponse } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getQuerySignalIds(signalIds)) + .send(getQueryAlertIds(alertIds)) .expect(200); - const everySignalClosed = signalsClosed.hits.hits.every( + const everyAlertClosed = alertsClosed.hits.hits.every( (hit) => hit._source?.[ALERT_WORKFLOW_STATUS] === 'closed' ); - expect(everySignalClosed).to.eql(true); + expect(everyAlertClosed).to.eql(true); }); }); }); diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/query_signals.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/query_alerts.ts similarity index 68% rename from x-pack/test/detection_engine_api_integration/basic/tests/query_signals.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/query_alerts.ts index 2acd4ffab10bc..3b372597cffd3 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/query_signals.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/query_alerts.ts @@ -11,25 +11,25 @@ import { DETECTION_ENGINE_QUERY_SIGNALS_URL, ALERTS_AS_DATA_FIND_URL, } from '@kbn/security-solution-plugin/common/constants'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { getSignalStatus, createSignalsIndex, deleteAllAlerts } from '../../utils'; +import { X_ELASTIC_INTERNAL_ORIGIN_REQUEST } from '@kbn/core-http-common'; +import { getAlertStatus, createAlertsIndex, deleteAllAlerts } from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const log = getService('log'); const es = getService('es'); - describe('query_signals_route and find_alerts_route', () => { + describe('@ess @serverless query_signals_route and find_alerts_route', () => { describe('validation checks', () => { // This fails and should be investigated or removed if it no longer applies - it.skip('should not give errors when querying and the signals index does exist and is empty', async () => { - await createSignalsIndex(supertest, log); + it.skip('should not give errors when querying and the alerts index does exist and is empty', async () => { + await createAlertsIndex(supertest, log); const { body } = await supertest .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) .set('kbn-xsrf', 'true') - .send(getSignalStatus()) + .send(getAlertStatus()) .expect(200); // remove any server generated items that are indeterministic @@ -48,56 +48,19 @@ export default ({ getService }: FtrProviderContext) => { }); }); - describe('backwards compatibility', () => { - before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/signals'); - await createSignalsIndex(supertest, log); - }); - after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/endpoint/resolver/signals'); - await deleteAllAlerts(supertest, log, es); - }); - - it('should be able to filter old signals on host.os.name.caseless using runtime field', async () => { - const query = { - query: { - bool: { - should: [{ match_phrase: { 'host.os.name.caseless': 'windows' } }], - }, - }, - }; - const { body } = await supertest - .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) - .set('kbn-xsrf', 'true') - .send(query) - .expect(200); - expect(body.hits.total.value).to.eql(3); - }); - - it('should be able to filter old signals using field aliases', async () => { - const query = { - query: { - bool: { - should: [{ match_phrase: { 'kibana.alert.workflow_status': 'open' } }], - }, - }, - }; - const { body } = await supertest - .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) - .set('kbn-xsrf', 'true') - .send(query) - .expect(200); - expect(body.hits.total.value).to.eql(3); - }); - }); - describe('runtime fields', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/signals'); - await createSignalsIndex(supertest, log); + await esArchiver.load( + 'x-pack/test/functional/es_archives/security_solution/alerts/8.8.0_multiple_docs', + { + useCreate: true, + docsOnly: true, + } + ); + await createAlertsIndex(supertest, log); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/endpoint/resolver/signals'); + // await esArchiver.unload('x-pack/test/functional/es_archives/endpoint/resolver/signals'); await deleteAllAlerts(supertest, log, es); }); @@ -129,12 +92,12 @@ export default ({ getService }: FtrProviderContext) => { describe('find_alerts_route', () => { describe('validation checks', () => { // This fails and should be investigated or removed if it no longer applies - it.skip('should not give errors when querying and the signals index does exist and is empty', async () => { - await createSignalsIndex(supertest, log); + it.skip('should not give errors when querying and the alerts index does exist and is empty', async () => { + await createAlertsIndex(supertest, log); const { body } = await supertest .post(ALERTS_AS_DATA_FIND_URL) .set('kbn-xsrf', 'true') - .send({ ...getSignalStatus(), index: '.siem-signals-default' }) + .send({ ...getAlertStatus(), index: '.siem-signals-default' }) .expect(200); // remove any server generated items that are indeterministic @@ -153,10 +116,11 @@ export default ({ getService }: FtrProviderContext) => { }); it('should not give errors when executing security solution histogram aggs', async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); await supertest .post(ALERTS_AS_DATA_FIND_URL) .set('kbn-xsrf', 'true') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ index: '.siem-signals-default', aggs: { diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/query_alerts_backword_compatibility.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/query_alerts_backword_compatibility.ts new file mode 100644 index 0000000000000..76f85dd323976 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/alerts/query_alerts_backword_compatibility.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '@kbn/security-solution-plugin/common/constants'; +import { createAlertsIndex, deleteAllAlerts } from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; + +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + const log = getService('log'); + const es = getService('es'); + + describe('@ess query_alerts_backword_compatibility', () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/endpoint/resolver/signals'); + await createAlertsIndex(supertest, log); + }); + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/endpoint/resolver/signals'); + await deleteAllAlerts(supertest, log, es); + }); + + it('should be able to filter old alerts on host.os.name.caseless using runtime field', async () => { + const query = { + query: { + bool: { + should: [{ match_phrase: { 'host.os.name.caseless': 'windows' } }], + }, + }, + }; + const { body } = await supertest + .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) + .set('kbn-xsrf', 'true') + .send(query) + .expect(200); + expect(body.hits.total.value).to.eql(3); + }); + + it('should be able to filter old alerts using field aliases', async () => { + const query = { + query: { + bool: { + should: [{ match_phrase: { 'kibana.alert.workflow_status': 'open' } }], + }, + }, + }; + const { body } = await supertest + .post(DETECTION_ENGINE_QUERY_SIGNALS_URL) + .set('kbn-xsrf', 'true') + .send(query) + .expect(200); + expect(body.hits.total.value).to.eql(3); + }); + }); +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/ess.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/ess.config.ts new file mode 100644 index 0000000000000..b980aef5f783a --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/ess.config.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile( + require.resolve('../../../../../config/ess/config.base.basic') + ); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine ESS - Basic Integration Tests', + }, + }; +} diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/serverless.config.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/serverless.config.ts new file mode 100644 index 0000000000000..8a4199ccfb44d --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/configs/serverless.config.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createTestConfig } from '../../../../../config/serverless/config.base.essentials'; + +export default createTestConfig({ + testFiles: [require.resolve('..')], + junit: { + reportName: 'Detection Engine Serverless - Essentials Integration Tests', + }, +}); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/index.ts new file mode 100644 index 0000000000000..296cec0e06448 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Detection Engine Basic and Essentials API', function () { + loadTestFile(require.resolve('./rules/create_rules')); + loadTestFile(require.resolve('./rules/create_ml_rules_privileges')); + loadTestFile(require.resolve('./alerts/open_close_alerts')); + loadTestFile(require.resolve('./alerts/query_alerts')); + loadTestFile(require.resolve('./alerts/query_alerts_backword_compatibility')); + }); +} diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/rules/create_ml_rules_privileges.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/rules/create_ml_rules_privileges.ts new file mode 100644 index 0000000000000..0b4bcea421c70 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/rules/create_ml_rules_privileges.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from 'expect'; +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; + +import { + createAlertsIndex, + deleteAllRules, + removeServerGeneratedProperties, + getSimpleMlRule, + deleteAllAlerts, + updateUsername, +} from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertest'); + const log = getService('log'); + const es = getService('es'); + // TODO: add a new service + const config = getService('config'); + const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const auditbeatPath = dataPathBuilder.getPath('auditbeat/hosts'); + + describe('create_ml_rules', () => { + describe('Creating Machine Learning rules', () => { + before(async () => { + await esArchiver.load(auditbeatPath); + }); + + after(async () => { + await esArchiver.unload(auditbeatPath); + }); + + beforeEach(async () => { + await createAlertsIndex(supertest, log); + }); + + afterEach(async () => { + await deleteAllAlerts(supertest, log, es); + await deleteAllRules(supertest, log); + }); + + it('@ess should give a 403 when trying to create a single Machine Learning rule since the license is basic', async () => { + const { body } = await supertest + .post(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .send(getSimpleMlRule()) + .expect(403); + + const bodyToCompare = removeServerGeneratedProperties(body); + expect(bodyToCompare).toEqual({ + message: 'Your license does not support machine learning. Please upgrade your license.', + status_code: 403, + }); + }); + it('@serverless should give a 200 when trying to create a single Machine Learning rule since the license is essentials', async () => { + const { body } = await supertest + .post(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .send(getSimpleMlRule()) + .expect(200); + + const bodyToCompare = removeServerGeneratedProperties(body); + const expectedRule = updateUsername(getSimpleMlRule(), ELASTICSEARCH_USERNAME); + expect(bodyToCompare).toEqual(expect.objectContaining(expectedRule)); + }); + }); + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/basic/tests/create_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/rules/create_rules.ts similarity index 55% rename from x-pack/test/detection_engine_api_integration/basic/tests/create_rules.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/rules/create_rules.ts index fbbef20984642..6a3fff87611da 100644 --- a/x-pack/test/detection_engine_api_integration/basic/tests/create_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/basic_essentials_license/detection_engine/rules/create_rules.ts @@ -6,42 +6,49 @@ */ import expect from '@kbn/expect'; +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { RuleCreateProps } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; + import { - createSignalsIndex, + createAlertsIndex, deleteAllRules, getSimpleRule, - getSimpleRuleOutput, getSimpleRuleOutputWithoutRuleId, getSimpleRuleWithoutRuleId, removeServerGeneratedProperties, removeServerGeneratedPropertiesIncludingRuleId, - getSimpleMlRule, deleteAllAlerts, -} from '../../utils'; + updateUsername, +} from '../../../utils'; +import { FtrProviderContext } from '../../../../../ftr_provider_context'; +import { EsArchivePathBuilder } from '../../../../../es_archive_path_builder'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); const log = getService('log'); const es = getService('es'); - - describe('create_rules', () => { + // TODO: add a new service + const config = getService('config'); + const ELASTICSEARCH_USERNAME = config.get('servers.kibana.username'); + const isServerless = config.get('serverless'); + const dataPathBuilder = new EsArchivePathBuilder(isServerless); + const auditbeatPath = dataPathBuilder.getPath('auditbeat/hosts'); + + describe('@ess @serverless create_rules', () => { describe('creating rules', () => { before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.load(auditbeatPath); }); after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + await esArchiver.unload(auditbeatPath); }); beforeEach(async () => { - await createSignalsIndex(supertest, log); + await createAlertsIndex(supertest, log); }); afterEach(async () => { @@ -53,12 +60,14 @@ export default ({ getService }: FtrProviderContext) => { const { body } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .send(getSimpleRule()) .expect(200); const bodyToCompare = removeServerGeneratedProperties(body); - expect(bodyToCompare).to.eql(getSimpleRuleOutput()); + const expectedRule = updateUsername(bodyToCompare, ELASTICSEARCH_USERNAME); + + expect(bodyToCompare).to.eql(expectedRule); }); it('should create a single rule without an input index', async () => { @@ -72,90 +81,49 @@ export default ({ getService }: FtrProviderContext) => { type: 'query', query: 'user.name: root or user.name: admin', }; - const expected = { - actions: [], - author: [], - created_by: 'elastic', - description: 'Simple Rule Query', - enabled: true, - false_positives: [], - from: 'now-6m', - immutable: false, - interval: '5m', - rule_id: 'rule-1', - language: 'kuery', - output_index: '', - max_signals: 100, - risk_score: 1, - risk_score_mapping: [], - name: 'Simple Rule Query', - query: 'user.name: root or user.name: admin', - references: [], - related_integrations: [], - required_fields: [], - setup: '', - severity: 'high', - severity_mapping: [], - updated_by: 'elastic', - tags: [], - to: 'now', - type: 'query', - threat: [], - exceptions_list: [], - version: 1, - revision: 0, - }; const { body } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .send(rule) .expect(200); const bodyToCompare = removeServerGeneratedProperties(body); - expect(bodyToCompare).to.eql(expected); + const expectedRule = updateUsername(bodyToCompare, ELASTICSEARCH_USERNAME); + + expect(bodyToCompare).to.eql(expectedRule); }); it('should create a single rule without a rule_id', async () => { const { body } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .send(getSimpleRuleWithoutRuleId()) .expect(200); const bodyToCompare = removeServerGeneratedPropertiesIncludingRuleId(body); - expect(bodyToCompare).to.eql(getSimpleRuleOutputWithoutRuleId()); - }); - - it('should give a 403 when trying to create a single Machine Learning rule since the license is basic', async () => { - const { body } = await supertest - .post(DETECTION_ENGINE_RULES_URL) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') - .send(getSimpleMlRule()) - .expect(403); + const expectedRule = updateUsername( + getSimpleRuleOutputWithoutRuleId(), + ELASTICSEARCH_USERNAME + ); - const bodyToCompare = removeServerGeneratedProperties(body); - expect(bodyToCompare).to.eql({ - message: 'Your license does not support machine learning. Please upgrade your license.', - status_code: 403, - }); + expect(bodyToCompare).to.eql(expectedRule); }); it('should cause a 409 conflict if we attempt to create the same rule_id twice', async () => { await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .send(getSimpleRule()) .expect(200); const { body } = await supertest .post(DETECTION_ENGINE_RULES_URL) .set('kbn-xsrf', 'true') - .set('elastic-api-version', '2023-10-31') + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') .send(getSimpleRule()) .expect(409); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts index 556e689514d7f..60e0399df53fd 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/prebuilt_rules/bundled_prebuilt_rules_package/install_latest_bundled_prebuilt_rules.ts @@ -23,12 +23,13 @@ export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); const log = getService('log'); + // FLAKY: https://github.com/elastic/kibana/issues/171380 /* This test simulates an air-gapped environment in which the user doesn't have access to EPR. /* We first download the package from the registry as done during build time, and then /* attempt to install it from the local file system. The API response from EPM provides /* us with the information of whether the package was installed from the registry or /* from a package that was bundled with Kibana */ - describe('@ess @serverless @skipInQA install_bundled_prebuilt_rules', () => { + describe.skip('@ess @serverless @skipInQA install_bundled_prebuilt_rules', () => { beforeEach(async () => { await deleteAllRules(supertest, log); await deleteAllPrebuiltRuleAssets(es); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts index 3fd33d4ee8c90..81523755f4eea 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/rule_execution_logic/execution_logic/machine_learning.ts @@ -71,7 +71,8 @@ export default ({ getService }: FtrProviderContext) => { rule_id: 'ml-rule-id', }; - describe('@ess @serverless Machine learning type rules', () => { + // FLAKY: https://github.com/elastic/kibana/issues/171426 + describe.skip('@ess @serverless Machine learning type rules', () => { before(async () => { // Order is critical here: auditbeat data must be loaded before attempting to start the ML job, // as the job looks for certain indices on start diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rule_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rule_status.ts index fc99c5f73ee5f..6007c3d37c6dc 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rule_status.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/default_license/telemetry/usage_collector/detection_rule_status.ts @@ -45,7 +45,8 @@ export default ({ getService }: FtrProviderContext) => { // Note: We don't actually find signals well with ML tests at the moment so there are not tests for ML rule type for telemetry // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/132856 - describe('@ess @serverless Detection rule status telemetry', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/171442 + describe.skip('@ess @serverless Detection rule status telemetry', async () => { before(async () => { // Just in case other tests do not clean up the event logs, let us clear them now and here only once. await deleteAllEventLogExecutionEvents(es, log); diff --git a/x-pack/test/detection_engine_api_integration/utils/get_signal_status.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/get_alert_status.ts similarity index 89% rename from x-pack/test/detection_engine_api_integration/utils/get_signal_status.ts rename to x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/get_alert_status.ts index d3c922c30ccc6..212aefd4593f4 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_signal_status.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/get_alert_status.ts @@ -5,6 +5,6 @@ * 2.0. */ -export const getSignalStatus = () => ({ +export const getAlertStatus = () => ({ aggs: { statuses: { terms: { field: 'kibana.alert.workflow_status', size: 10 } } }, }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/index.ts index 975c6ffa509cc..e78bfa1922d36 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/alerts/index.ts @@ -20,4 +20,5 @@ export * from './get_alert_status_empty_response'; export * from './get_query_alert_ids'; export * from './set_alert_tags'; export * from './get_preview_alerts'; +export * from './get_alert_status'; export * from './migrations'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_output_without_rule_id.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_output_without_rule_id.ts new file mode 100644 index 0000000000000..56b5ab66773bb --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_output_without_rule_id.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getSimpleRuleOutput } from './get_simple_rule_output'; +import { RuleWithoutServerGeneratedProperties } from './remove_server_generated_properties'; + +/** + * This is the typical output of a simple rule that Kibana will output with all the defaults except + * for all the server generated properties such as created_by. Useful for testing end to end tests. + */ +export const getSimpleRuleOutputWithoutRuleId = ( + ruleId = 'rule-1' +): Omit => { + const rule = getSimpleRuleOutput(ruleId); + const { rule_id: rId, ...ruleWithoutRuleId } = rule; + return ruleWithoutRuleId; +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_without_rule_id.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_without_rule_id.ts new file mode 100644 index 0000000000000..ad6ab7803ec21 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/get_simple_rule_without_rule_id.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 { RuleCreateProps } from '@kbn/security-solution-plugin/common/api/detection_engine'; +import { getSimpleRule } from './get_simple_rule'; + +/** + * This is a typical simple rule for testing that is easy for most basic testing + */ +export const getSimpleRuleWithoutRuleId = (): RuleCreateProps => { + const simpleRule = getSimpleRule(); + // eslint-disable-next-line @typescript-eslint/naming-convention + const { rule_id, ...ruleWithoutId } = simpleRule; + return ruleWithoutId; +}; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/index.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/index.ts index db5ccb307395e..04c4cb778ef4a 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/index.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/index.ts @@ -39,5 +39,8 @@ export * from './generate_event'; export * from './create_legacy_rule_action'; export * from './get_simple_threat_match'; export * from './get_simple_ml_rule'; +export * from './remove_server_generated_properties_including_rule_id'; +export * from './get_simple_rule_output_without_rule_id'; +export * from './get_simple_rule_without_rule_id'; export * from './prebuilt_rules'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/remove_server_generated_properties_including_rule_id.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/remove_server_generated_properties_including_rule_id.ts new file mode 100644 index 0000000000000..1b57b5663ec23 --- /dev/null +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/rules/remove_server_generated_properties_including_rule_id.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 { RuleResponse } from '@kbn/security-solution-plugin/common/api/detection_engine'; + +import { removeServerGeneratedProperties } from './remove_server_generated_properties'; + +/** + * This will remove server generated properties such as date times, etc... including the rule_id + * @param rule Rule to pass in to remove typical server generated properties + */ +export const removeServerGeneratedPropertiesIncludingRuleId = ( + rule: RuleResponse +): Partial => { + const ruleWithRemovedProperties = removeServerGeneratedProperties(rule); + // eslint-disable-next-line @typescript-eslint/naming-convention + const { rule_id, ...additionalRuledIdRemoved } = ruleWithRemovedProperties; + return additionalRuledIdRemoved; +}; diff --git a/x-pack/test/security_solution_cypress/config.ts b/x-pack/test/security_solution_cypress/config.ts index 99390aa5142a2..fb34362f7fb9b 100644 --- a/x-pack/test/security_solution_cypress/config.ts +++ b/x-pack/test/security_solution_cypress/config.ts @@ -46,7 +46,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { '--xpack.ruleRegistry.unsafe.legacyMultiTenancy.enabled=true', `--xpack.securitySolution.enableExperimental=${JSON.stringify([ 'chartEmbeddablesEnabled', - 'disableTimelineSaveTour', ])}`, // mock cloud to enable the guided onboarding tour in e2e tests '--xpack.cloud.id=test', diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_status.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_status.cy.ts index e7f17ddcc8cb2..927e1f58a1be3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_status.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_status.cy.ts @@ -30,7 +30,7 @@ import { openFirstAlert, } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_tags.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_tags.cy.ts index 162c63ad3ce48..4fb4d50e7c6d9 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_tags.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_alerts/alert_tags.cy.ts @@ -13,7 +13,7 @@ import { updateAlertTags, } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { ALERTS_URL } from '../../../urls/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_via_fleet.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_via_fleet.cy.ts index 630bd099a1d0c..6da3d58c0530d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_via_fleet.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_via_fleet.cy.ts @@ -8,12 +8,13 @@ import type { BulkInstallPackageInfo } from '@kbn/fleet-plugin/common'; import type { Rule } from '@kbn/security-solution-plugin/public/detection_engine/rule_management/logic/types'; -import { resetRulesTableState, deleteAlertsAndRules } from '../../../tasks/common'; +import { resetRulesTableState } from '../../../tasks/common'; import { INSTALL_ALL_RULES_BUTTON, TOASTER } from '../../../screens/alerts_detection_rules'; import { getRuleAssets } from '../../../tasks/api_calls/prebuilt_rules'; import { login } from '../../../tasks/login'; import { clickAddElasticRulesButton } from '../../../tasks/prebuilt_rules'; import { visitRulesManagementTable } from '../../../tasks/rules_management'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; describe( 'Detection rules, Prebuilt Rules Installation and Update workflow', diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_workflow.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_workflow.cy.ts index 15e77fad28d03..ec4615bcf59e4 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_workflow.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/install_workflow.cy.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { resetRulesTableState, deleteAlertsAndRules } from '../../../tasks/common'; +import { resetRulesTableState } from '../../../tasks/common'; import { createRuleAssetSavedObject } from '../../../helpers/rules'; import { getInstallSingleRuleButtonByRuleId, @@ -28,6 +28,7 @@ import { clickAddElasticRulesButton, } from '../../../tasks/prebuilt_rules'; import { visitRulesManagementTable } from '../../../tasks/rules_management'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; describe( 'Detection rules, Prebuilt Rules Installation and Update workflow', diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/management.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/management.cy.ts index d5a3f3bb85326..f3101f513915f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/management.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/management.cy.ts @@ -35,7 +35,7 @@ import { getAvailablePrebuiltRulesCount, preventPrebuiltRulesPackageInstallation, } from '../../../tasks/api_calls/prebuilt_rules'; -import { deleteAlertsAndRules, deletePrebuiltRulesAssets } from '../../../tasks/common'; +import { deleteAlertsAndRules, deletePrebuiltRulesAssets } from '../../../tasks/api_calls/common'; import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/notifications.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/notifications.cy.ts index 180c435c10213..92bf9e7f1471c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/notifications.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/notifications.cy.ts @@ -12,16 +12,13 @@ import { RULES_UPDATES_TAB, } from '../../../screens/alerts_detection_rules'; import { deleteFirstRule } from '../../../tasks/alerts_detection_rules'; +import { deleteAlertsAndRules, deletePrebuiltRulesAssets } from '../../../tasks/api_calls/common'; import { installAllPrebuiltRulesRequest, installPrebuiltRuleAssets, createAndInstallMockedPrebuiltRules, } from '../../../tasks/api_calls/prebuilt_rules'; -import { - resetRulesTableState, - deleteAlertsAndRules, - deletePrebuiltRulesAssets, -} from '../../../tasks/common'; +import { resetRulesTableState } from '../../../tasks/common'; import { login } from '../../../tasks/login'; import { visitRulesManagementTable } from '../../../tasks/rules_management'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/prebuilt_rules_preview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/prebuilt_rules_preview.cy.ts index 0b49fe4bb1dec..6deeb6f5202c0 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/prebuilt_rules_preview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/prebuilt_rules_preview.cy.ts @@ -26,12 +26,7 @@ import { } from '../../../tasks/api_calls/prebuilt_rules'; import { createSavedQuery, deleteSavedQueries } from '../../../tasks/api_calls/saved_queries'; import { fetchMachineLearningModules } from '../../../tasks/api_calls/machine_learning'; -import { - resetRulesTableState, - deleteAlertsAndRules, - postDataView, - deleteDataView, -} from '../../../tasks/common'; +import { resetRulesTableState } from '../../../tasks/common'; import { login } from '../../../tasks/login'; import { assertRuleInstallationSuccessToastShown, @@ -62,6 +57,11 @@ import { openRuleUpdatePreview, } from '../../../tasks/prebuilt_rules_preview'; import { visitRulesManagementTable } from '../../../tasks/rules_management'; +import { + deleteAlertsAndRules, + deleteDataView, + postDataView, +} from '../../../tasks/api_calls/common'; const TEST_ENV_TAGS = ['@ess', '@serverless']; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/update_workflow.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/update_workflow.ts index 2e38b4782b433..edeb8ac98623b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/update_workflow.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/prebuilt_rules/update_workflow.ts @@ -15,11 +15,12 @@ import { UPGRADE_SELECTED_RULES_BUTTON, } from '../../../screens/alerts_detection_rules'; import { selectRulesByName } from '../../../tasks/alerts_detection_rules'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { installPrebuiltRuleAssets, createAndInstallMockedPrebuiltRules, } from '../../../tasks/api_calls/prebuilt_rules'; -import { resetRulesTableState, deleteAlertsAndRules } from '../../../tasks/common'; +import { resetRulesTableState } from '../../../tasks/common'; import { login } from '../../../tasks/login'; import { assertRulesNotPresentInRuleUpdatesTable, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions.cy.ts index 98080cb3b47e8..3053f8e5c5698 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions.cy.ts @@ -10,7 +10,11 @@ import { getSimpleCustomQueryRule } from '../../../objects/rule'; import { goToRuleDetailsOf } from '../../../tasks/alerts_detection_rules'; import { deleteIndex, waitForNewDocumentToBeIndexed } from '../../../tasks/api_calls/elasticsearch'; -import { deleteAlertsAndRules, deleteConnectors, deleteDataView } from '../../../tasks/common'; +import { + deleteAlertsAndRules, + deleteConnectors, + deleteDataView, +} from '../../../tasks/api_calls/common'; import { createAndEnableRule, fillAboutRuleAndContinue, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_complete.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_complete.cy.ts index 23421b218bcb6..13c35a3cce6c4 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_complete.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_complete.cy.ts @@ -18,7 +18,7 @@ import { import { createRule } from '../../../tasks/api_calls/rules'; import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { goToActionsStepTab } from '../../../tasks/create_new_rule'; import { login } from '../../../tasks/login'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_essentials.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_essentials.cy.ts index 83503ea98738d..d36cdc7137de6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_essentials.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_actions/rule_actions_pli_essentials.cy.ts @@ -18,7 +18,7 @@ import { import { createRule } from '../../../tasks/api_calls/rules'; import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { goToActionsStepTab } from '../../../tasks/create_new_rule'; import { login } from '../../../tasks/login'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/common_flows.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/common_flows.cy.ts index e8780d8696d29..9628f03f2d102 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/common_flows.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/common_flows.cy.ts @@ -19,7 +19,7 @@ import { } from '../../../screens/create_new_rule'; import { RULE_NAME_HEADER } from '../../../screens/rule_details'; import { createTimeline } from '../../../tasks/api_calls/timelines'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { createAndEnableRule, expandAdvancedSettings, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule.cy.ts index e4bb4b2bfba83..5e41440f48f4e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule.cy.ts @@ -8,7 +8,7 @@ import { getNewRule } from '../../../objects/rule'; import { RULE_NAME_HEADER } from '../../../screens/rule_details'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { fillScheduleRuleAndContinue, fillAboutRuleMinimumAndContinue, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts index d13a676e84253..7a6d1fa889e58 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_query_rule_data_view.cy.ts @@ -52,7 +52,11 @@ import { getRulesManagementTableRows, goToRuleDetailsOf, } from '../../../tasks/alerts_detection_rules'; -import { deleteAlertsAndRules, deleteDataView, postDataView } from '../../../tasks/common'; +import { + deleteAlertsAndRules, + deleteDataView, + postDataView, +} from '../../../tasks/api_calls/common'; import { createAndEnableRule, createRuleWithoutEnabling, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_saved_query_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_saved_query_rule.cy.ts index 03ba3db7f25ff..f55a51d8e4f64 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_saved_query_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/custom_saved_query_rule.cy.ts @@ -24,7 +24,7 @@ import { import { editFirstRule, goToRuleDetailsOf } from '../../../tasks/alerts_detection_rules'; import { createSavedQuery, deleteSavedQueries } from '../../../tasks/api_calls/saved_queries'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { createAndEnableRule, fillAboutRuleAndContinue, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/esql_rule_ess.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/esql_rule_ess.cy.ts index 2fa97e4f76e40..e543589bb44ce 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/esql_rule_ess.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/esql_rule_ess.cy.ts @@ -18,7 +18,7 @@ import { ESQL_TYPE, ESQL_QUERY_BAR } from '../../../screens/create_new_rule'; import { getDetails, goBackToRulesTable } from '../../../tasks/rule_details'; import { expectNumberOfRules } from '../../../tasks/alerts_detection_rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { fillAboutRuleAndContinue, fillDefineEsqlRuleAndContinue, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts index b895460661858..0966ae2709113 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/event_correlation_rule.cy.ts @@ -43,7 +43,7 @@ import { import { getDetails, waitForTheRuleToBeExecuted } from '../../../tasks/rule_details'; import { expectNumberOfRules, goToRuleDetailsOf } from '../../../tasks/alerts_detection_rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { createAndEnableRule, fillAboutRuleAndContinue, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/indicator_match_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/indicator_match_rule.cy.ts index 6dbe81076c91e..2b83c938b9473 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/indicator_match_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/indicator_match_rule.cy.ts @@ -111,7 +111,7 @@ import { import { CREATE_RULE_URL } from '../../../urls/navigation'; import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; import { openRuleManagementPageViaBreadcrumbs } from '../../../tasks/rules_management'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; const DEFAULT_THREAT_MATCH_QUERY = '@timestamp >= "now-30d/d"'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts index 8b8c6fe4e1457..570f19f3f72e1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/new_terms_rule.cy.ts @@ -45,7 +45,7 @@ import { import { getDetails, waitForTheRuleToBeExecuted } from '../../../tasks/rule_details'; import { expectNumberOfRules, goToRuleDetailsOf } from '../../../tasks/alerts_detection_rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { createAndEnableRule, fillAboutRuleAndContinue, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts index 585cd9187f3e0..9bb9f569c4dd1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/override.cy.ts @@ -47,7 +47,7 @@ import { TIMESTAMP_OVERRIDE_DETAILS, } from '../../../screens/rule_details'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { expectNumberOfRules, goToRuleDetailsOf } from '../../../tasks/alerts_detection_rules'; import { createAndEnableRule, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/threshold_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/threshold_rule.cy.ts index 503b40f568303..62fdb9121c9c5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/threshold_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_creation/threshold_rule.cy.ts @@ -45,7 +45,7 @@ import { import { getDetails, waitForTheRuleToBeExecuted } from '../../../tasks/rule_details'; import { expectNumberOfRules, goToRuleDetailsOf } from '../../../tasks/alerts_detection_rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { createAndEnableRule, fillAboutRuleAndContinue, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/common_flows.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/common_flows.cy.ts index 5e5af0e6ad4a7..f5704122d9e33 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/common_flows.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/common_flows.cy.ts @@ -45,7 +45,7 @@ import { } from '../../../screens/rule_details'; import { createTimeline } from '../../../tasks/api_calls/timelines'; -import { deleteAlertsAndRules, deleteConnectors } from '../../../tasks/common'; +import { deleteAlertsAndRules, deleteConnectors } from '../../../tasks/api_calls/common'; import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; import { ruleDetailsUrl } from '../../../urls/rule_details'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/esql_rule.cy.ts index 93100216692a4..7d1419e911e33 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_details/esql_rule.cy.ts @@ -17,7 +17,7 @@ import { import { createRule } from '../../../tasks/api_calls/rules'; import { getDetails } from '../../../tasks/rule_details'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/custom_query_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/custom_query_rule.cy.ts index ca6d6c56adcf7..e9497851d4cb0 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/custom_query_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/custom_query_rule.cy.ts @@ -42,7 +42,7 @@ import { } from '../../../screens/rule_details'; import { createRule } from '../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules, deleteConnectors } from '../../../tasks/common'; +import { deleteAlertsAndRules, deleteConnectors } from '../../../tasks/api_calls/common'; import { addEmailConnectorAndRuleAction } from '../../../tasks/common/rule_actions'; import { fillAboutRule, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/esql_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/esql_rule.cy.ts index eb16d89a6af8c..20d48b211995e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/esql_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_edit/esql_rule.cy.ts @@ -15,7 +15,7 @@ import { createRule } from '../../../tasks/api_calls/rules'; import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; import { getDetails } from '../../../tasks/rule_details'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { clearEsqlQueryBar, fillEsqlQueryBar, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts index 1376e486790b7..51aa3f406b8ed 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts @@ -26,14 +26,14 @@ import { disableRelatedIntegrations, enableRelatedIntegrations, } from '../../../../tasks/api_calls/kibana_advanced_settings'; -import { deleteAlertsAndRules } from '../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { login } from '../../../../tasks/login'; import { visitRulesManagementTable } from '../../../../tasks/rules_management'; import { waitForAlertsToPopulate } from '../../../../tasks/create_new_rule'; import { installIntegrations, PackagePolicyWithoutAgentPolicyId, -} from '../../../../tasks/integrations'; +} from '../../../../tasks/api_calls/integrations'; import { disableAutoRefresh, openIntegrationsPopover, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts index fd6b28fbe57ec..dd053ab958aab 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_duplicate_rules.cy.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { deleteAlertsAndRules } from '../../../../../tasks/api_calls/common'; import { goToRuleDetailsOf, expectManagementTableRules, @@ -21,7 +22,7 @@ import { login } from '../../../../../tasks/login'; import { visitRulesManagementTable } from '../../../../../tasks/rules_management'; import { createRule } from '../../../../../tasks/api_calls/rules'; -import { resetRulesTableState, deleteAlertsAndRules } from '../../../../../tasks/common'; +import { resetRulesTableState } from '../../../../../tasks/common'; import { getNewRule } from '../../../../../objects/rule'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts index 920c03529c112..94b6804b31193 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { deleteAlertsAndRules } from '../../../../../tasks/api_calls/common'; import { MODAL_CONFIRMATION_BTN, MODAL_CONFIRMATION_BODY, @@ -79,7 +80,7 @@ import { login } from '../../../../../tasks/login'; import { visitRulesManagementTable } from '../../../../../tasks/rules_management'; import { createRule } from '../../../../../tasks/api_calls/rules'; import { loadPrepackagedTimelineTemplates } from '../../../../../tasks/api_calls/timelines'; -import { resetRulesTableState, deleteAlertsAndRules } from '../../../../../tasks/common'; +import { resetRulesTableState } from '../../../../../tasks/common'; import { getEqlRule, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts index ac6c723dbc0c6..62acef933f032 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts @@ -20,7 +20,7 @@ import { } from '../../../../../screens/rules_bulk_actions'; import { actionFormSelector } from '../../../../../screens/common/rule_actions'; -import { deleteAlertsAndRules, deleteConnectors } from '../../../../../tasks/common'; +import { deleteAlertsAndRules, deleteConnectors } from '../../../../../tasks/api_calls/common'; import type { RuleActionCustomFrequency } from '../../../../../tasks/common/rule_actions'; import { addSlackRuleAction, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_data_view.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_data_view.cy.ts index 21adb447d2ce3..3b9ddf73ad3c7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_data_view.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_data_view.cy.ts @@ -39,7 +39,11 @@ import { login } from '../../../../../tasks/login'; import { visitRulesManagementTable } from '../../../../../tasks/rules_management'; import { createRule } from '../../../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules, deleteDataView, postDataView } from '../../../../../tasks/common'; +import { + deleteAlertsAndRules, + deleteDataView, + postDataView, +} from '../../../../../tasks/api_calls/common'; import { getEqlRule, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts index 0896438e275e3..4c9168744920d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/deletion/rule_delete.cy.ts @@ -18,7 +18,7 @@ import { } from '../../../../../tasks/alerts_detection_rules'; import { deleteSelectedRules } from '../../../../../tasks/rules_bulk_actions'; import { createRule, findAllRules } from '../../../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../../tasks/api_calls/common'; import { login } from '../../../../../tasks/login'; describe('Rule deletion', { tags: ['@ess', '@serverless'] }, () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts index 0fb3d6f08613f..0cfcc43714497 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts @@ -7,6 +7,7 @@ import path from 'path'; +import { deleteAlertsAndRules } from '../../../../../tasks/api_calls/common'; import { expectedExportedRule, getNewRule } from '../../../../../objects/rule'; import { TOASTER_BODY, @@ -29,7 +30,7 @@ import { } from '../../../../../tasks/api_calls/exceptions'; import { getExceptionList } from '../../../../../objects/exception'; import { createRule } from '../../../../../tasks/api_calls/rules'; -import { resetRulesTableState, deleteAlertsAndRules } from '../../../../../tasks/common'; +import { resetRulesTableState } from '../../../../../tasks/common'; import { login } from '../../../../../tasks/login'; import { visit } from '../../../../../tasks/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/import_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/import_rules.cy.ts index 197ad5a9a82f5..4b8fe5b5312b0 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/import_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/import_rules.cy.ts @@ -11,7 +11,7 @@ import { importRules, importRulesWithOverwriteAll, } from '../../../../../tasks/alerts_detection_rules'; -import { deleteAlertsAndRules } from '../../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../../tasks/api_calls/common'; import { deleteExceptionList } from '../../../../../tasks/api_calls/exceptions'; import { login } from '../../../../../tasks/login'; import { visit } from '../../../../../tasks/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts index 025aff9510d9d..7e753d42b6b6d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts @@ -9,7 +9,7 @@ import { INTERNAL_ALERTING_API_FIND_RULES_PATH } from '@kbn/alerting-plugin/comm import type { RuleResponse } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { createRule, snoozeRule as snoozeRuleViaAPI } from '../../../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules, deleteConnectors } from '../../../../../tasks/common'; +import { deleteAlertsAndRules, deleteConnectors } from '../../../../../tasks/api_calls/common'; import { login } from '../../../../../tasks/login'; import { visitRulesManagementTable } from '../../../../../tasks/rules_management'; import { getNewRule } from '../../../../../objects/rule'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_filtering.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_filtering.cy.ts index b76b862c70d02..117fc0eee632b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_filtering.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_filtering.cy.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { resetRulesTableState, deleteAlertsAndRules } from '../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; +import { resetRulesTableState } from '../../../../tasks/common'; import { login } from '../../../../tasks/login'; import { visitRulesManagementTable } from '../../../../tasks/rules_management'; import { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_links.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_links.cy.ts index cf81271c1ad33..ace4406b1c22a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_links.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_links.cy.ts @@ -8,7 +8,7 @@ import { getNewRule } from '../../../../objects/rule'; import { RULES_MONITORING_TAB, RULE_NAME } from '../../../../screens/alerts_detection_rules'; import { createRule } from '../../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { login } from '../../../../tasks/login'; import { visit } from '../../../../tasks/navigation'; import { RULES_MANAGEMENT_URL } from '../../../../urls/rules_management'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts index b31bd620400a0..6014f1c83b9af 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts @@ -12,6 +12,7 @@ import { SELECT_ALL_RULES_ON_PAGE_CHECKBOX, } from '../../../../screens/alerts_detection_rules'; import { + disableAutoRefresh, selectRulesByName, unselectRulesByName, waitForPrebuiltDetectionRulesToBeLoaded, @@ -43,6 +44,7 @@ describe( createAndInstallMockedPrebuiltRules([RULE_1, RULE_2]); visit(RULES_MANAGEMENT_URL); waitForPrebuiltDetectionRulesToBeLoaded(); + disableAutoRefresh(); }); it('should correctly update the selection label when rules are individually selected and unselected', () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/create_runtime_field.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/create_runtime_field.cy.ts index 2fd13f8b6696d..6838532d55938 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/create_runtime_field.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/create_runtime_field.cy.ts @@ -19,9 +19,9 @@ import { refreshPage } from '../../../tasks/security_header'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { createField } from '../../../tasks/create_runtime_field'; import { openAlertsFieldBrowser } from '../../../tasks/alerts'; -import { deleteRuntimeField } from '../../../tasks/sourcerer'; import { GET_DATA_GRID_HEADER } from '../../../screens/common/data_grid'; import { GET_TIMELINE_HEADER } from '../../../screens/timeline'; +import { deleteRuntimeField } from '../../../tasks/api_calls/sourcerer'; const alertRunTimeField = 'field.name.alert.page'; const timelineRuntimeField = 'field.name.timeline'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer.cy.ts index dbf5a5975f666..d27444e3d9a82 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer.cy.ts @@ -26,7 +26,7 @@ import { resetSourcerer, saveSourcerer, } from '../../../tasks/sourcerer'; -import { postDataView } from '../../../tasks/common'; +import { postDataView } from '../../../tasks/api_calls/common'; import { SOURCERER } from '../../../screens/sourcerer'; const siemDataViewTitle = 'Security Default Data View'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer_permissions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer_permissions.cy.ts index 52b8ccee82156..ce6b7e753d108 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer_permissions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/sourcerer/sourcerer_permissions.cy.ts @@ -9,7 +9,7 @@ import { loginWithUser } from '../../../tasks/login'; import { visitWithUser } from '../../../tasks/navigation'; import { hostsUrl } from '../../../urls/navigation'; -import { postDataView } from '../../../tasks/common'; +import { postDataView } from '../../../tasks/api_calls/common'; import { createUsersAndRoles, secReadCasesAll, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts index fe8d51cae795c..60b93650048d9 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/enrichments.cy.ts @@ -17,7 +17,7 @@ import { import { ENRICHED_DATA_ROW } from '../../screens/alerts_details'; import { createRule } from '../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../tasks/common'; +import { deleteAlertsAndRules } from '../../tasks/api_calls/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { expandFirstAlert, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/endpoint_exceptions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/endpoint_exceptions.cy.ts index 8914b0c98076b..c4b605b85dcb6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/endpoint_exceptions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/endpoint_exceptions.cy.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { expandFirstAlert, goToClosedAlertsOnRuleDetailsPage, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/auto_populate_with_alert_data.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/auto_populate_with_alert_data.cy.ts index ee10a2e702b0e..8dccaa04bdc87 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/auto_populate_with_alert_data.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/auto_populate_with_alert_data.cy.ts @@ -26,7 +26,7 @@ import { import { login } from '../../../../tasks/login'; import { goToExceptionsTab, visitRuleDetailsPage } from '../../../../tasks/rule_details'; -import { deleteAlertsAndRules } from '../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { ADD_AND_BTN, ENTRY_DELETE_BTN, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/closing_all_matching_alerts.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/closing_all_matching_alerts.cy.ts index 986bcb107124d..93e79ba9fa53e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/closing_all_matching_alerts.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/alerts_table_flow/rule_exceptions/closing_all_matching_alerts.cy.ts @@ -10,7 +10,7 @@ import { goToClosedAlertsOnRuleDetailsPage, waitForAlerts, } from '../../../../tasks/alerts'; -import { deleteAlertsAndRules, postDataView } from '../../../../tasks/common'; +import { deleteAlertsAndRules, postDataView } from '../../../../tasks/api_calls/common'; import { login } from '../../../../tasks/login'; import { visitRuleDetailsPage } from '../../../../tasks/rule_details'; import { createRule } from '../../../../tasks/api_calls/rules'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/flyout_validation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/flyout_validation.cy.ts index 3c613f32d2c73..72c18b27a9b2a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/flyout_validation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/flyout_validation.cy.ts @@ -47,7 +47,7 @@ import { FIELD_INPUT_PARENT, } from '../../../screens/exceptions'; -import { deleteAlertsAndRules, reload } from '../../../tasks/common'; +import { reload } from '../../../tasks/common'; import { createExceptionList, createExceptionListItem, @@ -55,6 +55,7 @@ import { deleteExceptionList, } from '../../../tasks/api_calls/exceptions'; import { getExceptionList } from '../../../objects/exception'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; // TODO: https://github.com/elastic/kibana/issues/161539 // Test Skipped until we fix the Flyout rerendering issue diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/match_any.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/match_any.cy.ts index f18b056c4e254..282e8d3c81223 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/match_any.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/match_any.cy.ts @@ -26,7 +26,7 @@ import { submitNewExceptionItem, } from '../../../tasks/exceptions'; import { CONFIRM_BTN } from '../../../screens/exceptions'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { ALERTS_COUNT } from '../../../screens/alerts'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts index 136038f641ec9..511343abc8a76 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/entry/multiple_conditions.cy.ts @@ -25,7 +25,7 @@ import { EXCEPTION_ITEM_VIEWER_CONTAINER, } from '../../../screens/exceptions'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; describe( 'Add multiple conditions and validate the generated exceptions', diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts index 8ec40a0e36436..e75c0eb8d81b0 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_endpoint_exception.cy.ts @@ -30,7 +30,7 @@ import { deleteAlertsAndRules, deleteEndpointExceptionList, deleteExceptionLists, -} from '../../../tasks/common'; +} from '../../../tasks/api_calls/common'; import { NO_EXCEPTIONS_EXIST_PROMPT, EXCEPTION_ITEM_VIEWER_CONTAINER, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception.cy.ts index 6cc022873aea5..a06b76455dfbc 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception.cy.ts @@ -37,7 +37,7 @@ import { submitEditedExceptionItem, submitNewExceptionItem, } from '../../../tasks/exceptions'; -import { deleteAlertsAndRules, deleteExceptionLists } from '../../../tasks/common'; +import { deleteAlertsAndRules, deleteExceptionLists } from '../../../tasks/api_calls/common'; import { NO_EXCEPTIONS_EXIST_PROMPT, EXCEPTION_ITEM_VIEWER_CONTAINER, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception_data_view.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception_data_view.cy.ts index 79f6638e6c0f7..a4f0daa190e49 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception_data_view.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/add_edit_exception_data_view.cy.ts @@ -28,7 +28,7 @@ import { waitForTheRuleToBeExecuted, } from '../../../tasks/rule_details'; -import { postDataView, deleteAlertsAndRules } from '../../../tasks/common'; +import { postDataView, deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { NO_EXCEPTIONS_EXIST_PROMPT, EXCEPTION_ITEM_VIEWER_CONTAINER, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/read_only_view.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/read_only_view.cy.ts index 935668db1a5a6..9002e9569b4fd 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/read_only_view.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/rule_details_flow/read_only_view.cy.ts @@ -13,7 +13,7 @@ import { login } from '../../../tasks/login'; import { visitRulesManagementTable } from '../../../tasks/rules_management'; import { goToExceptionsTab, goToAlertsTab } from '../../../tasks/rule_details'; import { goToRuleDetailsOf } from '../../../tasks/alerts_detection_rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { NO_EXCEPTIONS_EXIST_PROMPT, EXCEPTION_ITEM_VIEWER_CONTAINER, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts index 9f64fac5f1512..2b9b200ae6c26 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts @@ -40,7 +40,7 @@ import { findSharedExceptionListItemsByName, } from '../../../tasks/exceptions_table'; import { visitRuleDetailsPage } from '../../../tasks/rule_details'; -import { deleteEndpointExceptionList, deleteExceptionLists } from '../../../tasks/common'; +import { deleteEndpointExceptionList, deleteExceptionLists } from '../../../tasks/api_calls/common'; // https://github.com/elastic/kibana/issues/171235 // FLAKY: https://github.com/elastic/kibana/issues/171242 diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/duplicate_lists.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/duplicate_lists.cy.ts index af8edaa017b81..a4c251617b5f8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/duplicate_lists.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/duplicate_lists.cy.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { deleteAlertsAndRules, deleteExceptionLists } from '../../../../tasks/common'; +import { deleteAlertsAndRules, deleteExceptionLists } from '../../../../tasks/api_calls/common'; import { createRule } from '../../../../tasks/api_calls/rules'; import { getExceptionList } from '../../../../objects/exception'; import { assertNumberOfExceptionItemsExists } from '../../../../tasks/exceptions'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts index e040c98730986..c0a2295887a1f 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/attach_timeline.cy.ts @@ -17,7 +17,7 @@ import { DESCRIPTION_INPUT, ADD_COMMENT_INPUT } from '../../../screens/create_ne import { getCase1 } from '../../../objects/case'; import { getTimeline } from '../../../objects/timeline'; import { createTimeline } from '../../../tasks/api_calls/timelines'; -import { deleteTimelines } from '../../../tasks/common'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; import { createCase } from '../../../tasks/api_calls/cases'; describe('attach timeline to case', { tags: ['@ess', '@serverless'] }, () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connectors.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connectors.cy.ts index aaa785cc8f392..31c2068b49db0 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connectors.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/connectors.cy.ts @@ -10,7 +10,7 @@ import { getServiceNowConnector, getServiceNowITSMHealthResponse } from '../../. import { SERVICE_NOW_MAPPING } from '../../../screens/configure_cases'; import { goToEditExternalConnection } from '../../../tasks/all_cases'; -import { deleteAllCasesItems, deleteConnectors } from '../../../tasks/common'; +import { deleteAllCasesItems, deleteConnectors } from '../../../tasks/api_calls/common'; import { addServiceNowConnector, openAddNewConnectorOption, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/privileges.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/privileges.cy.ts index f1cdbc0d7af90..341a75fe4b6f1 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/privileges.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/cases/privileges.cy.ts @@ -9,7 +9,7 @@ import type { TestCaseWithoutTimeline } from '../../../objects/case'; import { ALL_CASES_CREATE_NEW_CASE_BTN, ALL_CASES_NAME } from '../../../screens/all_cases'; import { goToCreateNewCase } from '../../../tasks/all_cases'; -import { deleteAllCasesItems } from '../../../tasks/common'; +import { deleteAllCasesItems } from '../../../tasks/api_calls/common'; import { backToCases, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics.cy.ts index 7bb492d51d25c..e849e0408c073 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/dashboards/entity_analytics.cy.ts @@ -11,7 +11,7 @@ import { visitWithTimeRange } from '../../../tasks/navigation'; import { ALERTS_URL, ENTITY_ANALYTICS_URL } from '../../../urls/navigation'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { ANOMALIES_TABLE, @@ -169,8 +169,7 @@ describe('Entity Analytics Dashboard', { tags: ['@ess', '@serverless'] }, () => cy.get(HOSTS_TABLE_ALERT_CELL).should('have.length', 5); }); - // FLAKY: https://github.com/elastic/kibana/issues/168490 - it.skip('filters by risk level', () => { + it('filters by risk level', () => { openRiskTableFilterAndSelectTheLowOption(); cy.get(HOSTS_DONUT_CHART).should('include.text', '1Total'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts index a9615f27984ea..516b776a86e3d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/filters/pinned_filters.cy.ts @@ -21,7 +21,7 @@ import { openKibanaNavigation, } from '../../../tasks/kibana_navigation'; import { ALERTS_PAGE } from '../../../screens/kibana_navigation'; -import { postDataView } from '../../../tasks/common'; +import { postDataView } from '../../../tasks/api_calls/common'; import { navigateToAlertsPageInServerless } from '../../../tasks/serverless/navigation'; describe('ESS - pinned filters', { tags: ['@ess'] }, () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/explore/hosts/events_viewer.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/hosts/events_viewer.cy.ts index 0a211a58feba3..f61cf9943f5ee 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/explore/hosts/events_viewer.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/hosts/events_viewer.cy.ts @@ -35,6 +35,7 @@ import { kqlSearch } from '../../../tasks/security_header'; import { hostsUrl } from '../../../urls/navigation'; import { resetFields } from '../../../tasks/timeline'; +import { DATA_GRID_EMPTY_STATE } from '../../../screens/events_viewer'; const defaultHeadersInDefaultEcsCategory = [ { id: '@timestamp' }, @@ -118,12 +119,10 @@ describe('Events Viewer', { tags: ['@ess', '@serverless'] }, () => { it('filters the events by applying filter criteria from the search bar at the top of the page', () => { const filterInput = 'aa7ca589f1b8220002f2fc61c64cfbf1'; // this will never match real data - cy.get(SERVER_SIDE_EVENT_COUNT) - .invoke('text') - .then((initialNumberOfEvents) => { - kqlSearch(`${filterInput}{enter}`); - cy.get(SERVER_SIDE_EVENT_COUNT).should('not.have.text', initialNumberOfEvents); - }); + cy.get(SERVER_SIDE_EVENT_COUNT).should('exist'); + kqlSearch(`${filterInput}{enter}`); + cy.get(SERVER_SIDE_EVENT_COUNT).should('not.exist'); + cy.get(DATA_GRID_EMPTY_STATE).should('exist'); }); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/inspect/inspect_button.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts similarity index 85% rename from x-pack/test/security_solution_cypress/cypress/e2e/inspect/inspect_button.cy.ts rename to x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts index 30a3704879f36..86309e80fd7e9 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/inspect/inspect_button.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/inspect/inspect_button.cy.ts @@ -9,17 +9,18 @@ import { INSPECT_BUTTONS_IN_SECURITY, INSPECT_MODAL, INSPECT_MODAL_INDEX_PATTERN, -} from '../../screens/inspect'; +} from '../../../screens/inspect'; import { closesModal, openLensVisualizationsInspectModal, openTab, openTableInspectModal, -} from '../../tasks/inspect'; -import { login } from '../../tasks/login'; -import { visitWithTimeRange } from '../../tasks/navigation'; -import { postDataView, waitForWelcomePanelToBeLoaded } from '../../tasks/common'; -import { selectDataView } from '../../tasks/sourcerer'; +} from '../../../tasks/inspect'; +import { login } from '../../../tasks/login'; +import { visitWithTimeRange } from '../../../tasks/navigation'; +import { waitForWelcomePanelToBeLoaded } from '../../../tasks/common'; +import { selectDataView } from '../../../tasks/sourcerer'; +import { postDataView } from '../../../tasks/api_calls/common'; const DATA_VIEW = 'auditbeat-*'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/ml/ml_conditional_links.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts similarity index 98% rename from x-pack/test/security_solution_cypress/cypress/e2e/ml/ml_conditional_links.cy.ts rename to x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts index 061f17032c54a..c90f8bea96fd7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/ml/ml_conditional_links.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/ml/ml_conditional_links.cy.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { KQL_INPUT } from '../../screens/security_header'; +import { KQL_INPUT } from '../../../screens/security_header'; -import { login } from '../../tasks/login'; -import { visit } from '../../tasks/navigation'; +import { login } from '../../../tasks/login'; +import { visit } from '../../../tasks/navigation'; import { mlHostMultiHostKqlQuery, @@ -24,7 +24,7 @@ import { mlNetworkNullKqlQuery, mlNetworkSingleIpKqlQuery, mlNetworkSingleIpNullKqlQuery, -} from '../../urls/ml_conditional_links'; +} from '../../../urls/ml_conditional_links'; describe('ml conditional links', { tags: ['@ess', '@brokenInServerless'] }, () => { beforeEach(() => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/navigation/navigation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts similarity index 96% rename from x-pack/test/security_solution_cypress/cypress/e2e/navigation/navigation.cy.ts rename to x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts index 788ff1d9eac0f..906dcd0548b32 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/navigation/navigation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts @@ -30,12 +30,12 @@ import { EXPLORE, SETTINGS, ENTITY_ANALYTICS, -} from '../../screens/security_header'; -import * as ServerlessHeaders from '../../screens/serverless_security_header'; +} from '../../../screens/security_header'; +import * as ServerlessHeaders from '../../../screens/serverless_security_header'; -import { login } from '../../tasks/login'; -import { visit, visitGetStartedPage, visitWithTimeRange } from '../../tasks/navigation'; -import { navigateFromHeaderTo } from '../../tasks/security_header'; +import { login } from '../../../tasks/login'; +import { visit, visitGetStartedPage, visitWithTimeRange } from '../../../tasks/navigation'; +import { navigateFromHeaderTo } from '../../../tasks/security_header'; import { ALERTS_URL, @@ -71,12 +71,12 @@ import { ASSETS_URL, FLEET_URL, CLOUD_DEFEND_URL, -} from '../../urls/navigation'; -import { RULES_MANAGEMENT_URL } from '../../urls/rules_management'; +} from '../../../urls/navigation'; +import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; import { openKibanaNavigation, navigateFromKibanaCollapsibleTo, -} from '../../tasks/kibana_navigation'; +} from '../../../tasks/kibana_navigation'; import { CASES_PAGE, ALERTS_PAGE, @@ -86,7 +86,7 @@ import { TIMELINES_PAGE, FINDINGS_PAGE, THREAT_INTELLIGENCE_PAGE, -} from '../../screens/kibana_navigation'; +} from '../../../screens/kibana_navigation'; describe('top-level navigation common to all pages in the Security app', { tags: '@ess' }, () => { beforeEach(() => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/navigation/search_bar.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/search_bar.cy.ts similarity index 76% rename from x-pack/test/security_solution_cypress/cypress/e2e/navigation/search_bar.cy.ts rename to x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/search_bar.cy.ts index a92e5aa1d93d5..14afab3600f54 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/navigation/search_bar.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/navigation/search_bar.cy.ts @@ -5,23 +5,23 @@ * 2.0. */ -import { login } from '../../tasks/login'; -import { visitWithTimeRange } from '../../tasks/navigation'; +import { login } from '../../../tasks/login'; +import { visitWithTimeRange } from '../../../tasks/navigation'; import { openAddFilterPopover, fillAddFilterForm, openKqlQueryBar, fillKqlQueryBar, -} from '../../tasks/search_bar'; +} from '../../../tasks/search_bar'; import { AUTO_SUGGEST_AGENT_NAME, AUTO_SUGGEST_HOST_NAME_VALUE, GLOBAL_SEARCH_BAR_FILTER_ITEM, -} from '../../screens/search_bar'; -import { getHostIpFilter } from '../../objects/filter'; +} from '../../../screens/search_bar'; +import { getHostIpFilter } from '../../../objects/filter'; -import { hostsUrl } from '../../urls/navigation'; -import { waitForAllHostsToBeLoaded } from '../../tasks/hosts/all_hosts'; +import { hostsUrl } from '../../../urls/navigation'; +import { waitForAllHostsToBeLoaded } from '../../../tasks/hosts/all_hosts'; describe('SearchBar', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/urls/compatibility.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/compatibility.cy.ts similarity index 85% rename from x-pack/test/security_solution_cypress/cypress/e2e/urls/compatibility.cy.ts rename to x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/compatibility.cy.ts index 856f112272754..fa11642abc172 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/urls/compatibility.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/compatibility.cy.ts @@ -5,18 +5,18 @@ * 2.0. */ -import { login } from '../../tasks/login'; -import { visit } from '../../tasks/navigation'; +import { login } from '../../../tasks/login'; +import { visit } from '../../../tasks/navigation'; -import { ALERTS_URL, CREATE_RULE_URL } from '../../urls/navigation'; -import { RULES_MANAGEMENT_URL } from '../../urls/rules_management'; -import { ABSOLUTE_DATE_RANGE } from '../../urls/state'; +import { ALERTS_URL, CREATE_RULE_URL } from '../../../urls/navigation'; +import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; +import { ABSOLUTE_DATE_RANGE } from '../../../urls/state'; import { DATE_PICKER_START_DATE_POPOVER_BUTTON, GET_DATE_PICKER_END_DATE_POPOVER_BUTTON, -} from '../../screens/date_picker'; -import { ruleDetailsUrl } from '../../urls/rule_details'; -import { editRuleUrl } from '../../urls/edit_rule'; +} from '../../../screens/date_picker'; +import { ruleDetailsUrl } from '../../../urls/rule_details'; +import { editRuleUrl } from '../../../urls/edit_rule'; const LEGACY_DETECTIONS_URL_1 = '/app/siem#/detections'; const LEGACY_DETECTIONS_URL_2 = '/app/security/detections'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/urls/not_found.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/not_found.cy.ts similarity index 85% rename from x-pack/test/security_solution_cypress/cypress/e2e/urls/not_found.cy.ts rename to x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/not_found.cy.ts index 329e0b33144bf..9c27440a97864 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/urls/not_found.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/not_found.cy.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { login } from '../../tasks/login'; -import { visitWithTimeRange } from '../../tasks/navigation'; +import { login } from '../../../tasks/login'; +import { visitWithTimeRange } from '../../../tasks/navigation'; import { ALERTS_URL, @@ -16,12 +16,12 @@ import { TIMELINES_URL, EXCEPTIONS_URL, CREATE_RULE_URL, -} from '../../urls/navigation'; -import { RULES_MANAGEMENT_URL } from '../../urls/rules_management'; +} from '../../../urls/navigation'; +import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; -import { NOT_FOUND } from '../../screens/common/page'; -import { ruleDetailsUrl } from '../../urls/rule_details'; -import { editRuleUrl } from '../../urls/edit_rule'; +import { NOT_FOUND } from '../../../screens/common/page'; +import { ruleDetailsUrl } from '../../../urls/rule_details'; +import { editRuleUrl } from '../../../urls/edit_rule'; const mockRuleId = '5a4a0460-d822-11eb-8962-bfd4aff0a9b3'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/urls/state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts similarity index 92% rename from x-pack/test/security_solution_cypress/cypress/e2e/urls/state.cy.ts rename to x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts index 9e2e09ec79087..e24998fd9f304 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/urls/state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/explore/urls/state.cy.ts @@ -11,9 +11,9 @@ import { GET_LOCAL_DATE_PICKER_END_DATE_POPOVER_BUTTON, DATE_PICKER_START_DATE_POPOVER_BUTTON, GET_LOCAL_DATE_PICKER_START_DATE_POPOVER_BUTTON, -} from '../../screens/date_picker'; -import { HOSTS_NAMES } from '../../screens/hosts/all_hosts'; -import { ANOMALIES_TAB } from '../../screens/hosts/main'; +} from '../../../screens/date_picker'; +import { HOSTS_NAMES } from '../../../screens/hosts/all_hosts'; +import { ANOMALIES_TAB } from '../../../screens/hosts/main'; import { BREADCRUMBS, EXPLORE_PANEL_BTN, @@ -22,39 +22,38 @@ import { NETWORK, LOADING_INDICATOR, openNavigationPanel, -} from '../../screens/security_header'; -import { TIMELINE_DATE_PICKER_CONTAINER, TIMELINE_TITLE } from '../../screens/timeline'; +} from '../../../screens/security_header'; +import { TIMELINE_DATE_PICKER_CONTAINER, TIMELINE_TITLE } from '../../../screens/timeline'; -import { login } from '../../tasks/login'; -import { visit, visitWithTimeRange } from '../../tasks/navigation'; +import { login } from '../../../tasks/login'; +import { visit, visitWithTimeRange } from '../../../tasks/navigation'; import { updateDates, setStartDate, setEndDate, updateTimelineDates, -} from '../../tasks/date_picker'; -import { openFirstHostDetails, waitForAllHostsToBeLoaded } from '../../tasks/hosts/all_hosts'; -import { openAllHosts } from '../../tasks/hosts/main'; +} from '../../../tasks/date_picker'; +import { openFirstHostDetails, waitForAllHostsToBeLoaded } from '../../../tasks/hosts/all_hosts'; +import { openAllHosts } from '../../../tasks/hosts/main'; -import { waitForIpsTableToBeLoaded } from '../../tasks/network/flows'; +import { waitForIpsTableToBeLoaded } from '../../../tasks/network/flows'; import { clearSearchBar, kqlSearch, navigateFromHeaderTo, saveQuery, -} from '../../tasks/security_header'; -import { openTimelineUsingToggle } from '../../tasks/security_main'; -import { addNameToTimelineAndSave, closeTimeline, populateTimeline } from '../../tasks/timeline'; +} from '../../../tasks/security_header'; +import { openTimelineUsingToggle } from '../../../tasks/security_main'; +import { addNameToTimelineAndSave, closeTimeline, populateTimeline } from '../../../tasks/timeline'; -import { hostsUrl } from '../../urls/navigation'; -import { ABSOLUTE_DATE_RANGE } from '../../urls/state'; +import { hostsUrl } from '../../../urls/navigation'; +import { ABSOLUTE_DATE_RANGE } from '../../../urls/state'; -import { getTimeline } from '../../objects/timeline'; -import { TIMELINE } from '../../screens/create_new_case'; +import { getTimeline } from '../../../objects/timeline'; import { GLOBAL_SEARCH_BAR_FILTER_ITEM_AT, GLOBAL_SEARCH_BAR_PINNED_FILTER, -} from '../../screens/search_bar'; +} from '../../../screens/search_bar'; const ABSOLUTE_DATE = { endTime: 'Aug 1, 2019 @ 20:33:29.186', @@ -308,7 +307,6 @@ describe('url state', { tags: ['@ess', '@brokenInServerless'] }, () => { visitWithTimeRange(`/app/security/timelines?timeline=(id:'${timelineId}',isOpen:!t)`); cy.get(DATE_PICKER_APPLY_BUTTON_TIMELINE).should('exist'); cy.get(DATE_PICKER_APPLY_BUTTON_TIMELINE).should('not.have.text', 'Updating'); - cy.get(TIMELINE).should('be.visible'); cy.get(TIMELINE_TITLE).should('be.visible'); cy.get(TIMELINE_TITLE).should('have.text', getTimeline().title); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts index 9ab0d07569421..7e5e19b464c4a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts @@ -25,7 +25,7 @@ import { openTable, } from '../../../tasks/alerts_details'; import { createRule } from '../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { login } from '../../../tasks/login'; import { visit, visitWithTimeRange } from '../../../tasks/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_table_api_calls.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_table_api_calls.cy.ts new file mode 100644 index 0000000000000..3ef2c0dd21b64 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_table_api_calls.cy.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getNewRule } from '../../../objects/rule'; +import { createRule } from '../../../tasks/api_calls/rules'; +import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; +import { login } from '../../../tasks/login'; +import { visit } from '../../../tasks/navigation'; +import { ALERTS_URL } from '../../../urls/navigation'; + +/* + * + * Alert table is third party component which cannot be easily tested by jest. + * This test main checks if Alert Table does not call api/lists/index more than once. + * + * */ + +describe('Alert Table API calls', { tags: ['@ess', '@serverless'] }, () => { + let callCount: number = 0; + + beforeEach(() => { + callCount = 0; + login(); + createRule(getNewRule()); + // intercept all calls to `api/lists/index` + // and count how many times it was called + cy.intercept('GET', '/api/lists/index', (req) => { + req.on('response', (res) => { + if (res.statusCode === 200) { + callCount += 1; + } + }); + }); + + visit(ALERTS_URL); + waitForAlertsToPopulate(); + }); + + it('should call `api/lists/index` only once', () => { + cy.get('[data-test-subj="alertsTable"]').then(() => { + expect(callCount, 'number of times lists index api is called').to.equal(1); + }); + }); +}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts index f06fad0cd43ee..2dc4a360134b2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/changing_alert_status.cy.ts @@ -32,7 +32,7 @@ import { parseAlertsCountToInt, } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts index dd29284f6c0ce..1097a8357167b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts @@ -51,7 +51,7 @@ import { import { TOASTER } from '../../../screens/alerts_detection_rules'; import { setEndDate, setStartDate } from '../../../tasks/date_picker'; import { fillAddFilterForm, openAddFilterPopover } from '../../../tasks/search_bar'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; const customFilters = [ { @@ -107,7 +107,8 @@ const assertFilterControlsWithFilterObject = ( }); }; -describe(`Detections : Page Filters`, { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/171890 +describe.skip(`Detections : Page Filters`, { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { deleteAlertsAndRules(); createRule(getNewRule({ rule_id: 'custom_rule_filters' })); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.cy.ts index 9e1ace19972a8..3868625e9b339 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_analyzer_graph_tab.cy.ts @@ -9,10 +9,7 @@ import { DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON, DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_GRAPH_ANALYZER_CONTENT, } from '../../../../screens/expandable_flyout/alert_details_left_panel_analyzer_graph_tab'; -import { - DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB, - DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_BUTTON_GROUP, -} from '../../../../screens/expandable_flyout/alert_details_left_panel'; +import { DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB } from '../../../../screens/expandable_flyout/alert_details_left_panel'; import { openGraphAnalyzerTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel_analyzer_graph_tab'; import { expandDocumentDetailsExpandableFlyoutLeftSection } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; @@ -41,17 +38,15 @@ describe.skip( it('should display analyzer graph and node list under visualize', () => { cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB) - .should('be.visible') - .and('have.text', 'Visualize'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_BUTTON_GROUP).should('be.visible'); + .should('have.text', 'Visualize') + .and('have.class', 'euiTab-isSelected'); cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_GRAPH_ANALYZER_BUTTON) - .should('be.visible') - .and('have.text', 'Analyzer Graph'); + .should('have.text', 'Analyzer Graph') + .and('have.class', 'euiButtonGroupButton-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_GRAPH_ANALYZER_CONTENT).should('be.visible'); - cy.get(ANALYZER_NODE).first().should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_GRAPH_ANALYZER_CONTENT).should('exist'); + cy.get(ANALYZER_NODE).first().should('exist'); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_correlations_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_correlations_tab.cy.ts index a0e080e71ce12..fe89d50dd520d 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_correlations_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_correlations_tab.cy.ts @@ -20,10 +20,7 @@ import { CORRELATIONS_SOURCE_SECTION_TITLE, DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON, } from '../../../../screens/expandable_flyout/alert_details_left_panel_correlations_tab'; -import { - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB, - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP, -} from '../../../../screens/expandable_flyout/alert_details_left_panel'; +import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB } from '../../../../screens/expandable_flyout/alert_details_left_panel'; import { openCorrelationsTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel_correlations_tab'; import { openInsightsTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel'; import { expandDocumentDetailsExpandableFlyoutLeftSection } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; @@ -50,24 +47,15 @@ describe('Expandable flyout left panel correlations', { tags: ['@ess', '@serverl }); it('should render correlations details correctly', () => { - cy.log('link the alert to a new case'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB).scrollIntoView(); - - cy.log('should render the Insights header'); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB).should('be.visible').and('have.text', 'Insights'); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB) + .should('have.text', 'Insights') + .and('have.class', 'euiTab-isSelected'); - cy.log('should render the inner tab switch'); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP).should('be.visible'); - - cy.log('should render correlations tab activator / button'); cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON) - .should('be.visible') - .and('have.text', 'Correlations'); - - cy.log('should render all the correlations sections'); + .should('have.text', 'Correlations') + .and('have.class', 'euiButtonGroupButton-isSelected'); - cy.log('suppressed alerts'); + // cy.log('suppressed alerts'); // TODO get proper data to test suppressed alerts // cy.get(CORRELATIONS_SUPPRESSED_ALERTS_TITLE).scrollIntoView(); @@ -78,38 +66,42 @@ describe('Expandable flyout left panel correlations', { tags: ['@ess', '@serverl cy.log('related cases'); - cy.get(CORRELATIONS_CASES_SECTION_TITLE).scrollIntoView(); - cy.get(CORRELATIONS_CASES_SECTION_TITLE) - .should('be.visible') - .and('contain.text', '1 related case'); - cy.get(CORRELATIONS_CASES_SECTION_TABLE).should('be.visible'); + cy.get(CORRELATIONS_CASES_SECTION_TITLE).should('contain.text', '1 related case'); + cy.get(CORRELATIONS_CASES_SECTION_TABLE) + .should('contain.text', 'case') + .and('contain.text', 'open'); cy.log('related alerts by source event'); - cy.get(CORRELATIONS_SOURCE_SECTION_TITLE).scrollIntoView(); - cy.get(CORRELATIONS_SOURCE_SECTION_TITLE) - .should('be.visible') - .and('contain.text', '1 alert related by source event'); - cy.get(CORRELATIONS_SOURCE_SECTION_TABLE).should('be.visible'); - cy.get(CORRELATIONS_SOURCE_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).should('be.visible'); + cy.get(CORRELATIONS_SOURCE_SECTION_TITLE).should( + 'contain.text', + '1 alert related by source event' + ); + cy.get(CORRELATIONS_SOURCE_SECTION_TABLE).should('exist'); + cy.get(CORRELATIONS_SOURCE_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).should( + 'contain.text', + 'Investigate in timeline' + ); cy.log('related alerts by session'); - cy.get(CORRELATIONS_SESSION_SECTION_TITLE).scrollIntoView(); - cy.get(CORRELATIONS_SESSION_SECTION_TITLE) - .should('be.visible') - .and('contain.text', '1 alert related by session'); - cy.get(CORRELATIONS_SESSION_SECTION_TABLE).should('be.visible'); - cy.get(CORRELATIONS_SESSION_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).should('be.visible'); + cy.get(CORRELATIONS_SESSION_SECTION_TITLE).should('contain.text', '1 alert related by session'); + cy.get(CORRELATIONS_SESSION_SECTION_TABLE).should('exist'); + cy.get(CORRELATIONS_SESSION_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).should( + 'contain.text', + 'Investigate in timeline' + ); cy.log('related alerts by ancestry'); - cy.get(CORRELATIONS_ANCESTRY_SECTION_TITLE).scrollIntoView(); - cy.get(CORRELATIONS_ANCESTRY_SECTION_TITLE) - .should('be.visible') - .and('contain.text', '1 alert related by ancestry'); - cy.get(CORRELATIONS_ANCESTRY_SECTION_TABLE).scrollIntoView(); - cy.get(CORRELATIONS_ANCESTRY_SECTION_TABLE).should('be.visible'); - cy.get(CORRELATIONS_ANCESTRY_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).should('be.visible'); + cy.get(CORRELATIONS_ANCESTRY_SECTION_TITLE).should( + 'contain.text', + '1 alert related by ancestry' + ); + cy.get(CORRELATIONS_ANCESTRY_SECTION_TABLE).should('exist'); + cy.get(CORRELATIONS_ANCESTRY_SECTION_INVESTIGATE_IN_TIMELINE_BUTTON).should( + 'contain.text', + 'Investigate in timeline' + ); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_entities_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_entities_tab.cy.ts index 06bba72700c2b..567a60752398c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_entities_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_entities_tab.cy.ts @@ -8,12 +8,13 @@ import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_ENTITIES_BUTTON, DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS, + DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_RIGHT_SECTION, + DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_TITLE, DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS, + DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_RIGHT_SECTION, + DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_TITLE, } from '../../../../screens/expandable_flyout/alert_details_left_panel_entities_tab'; -import { - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB, - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP, -} from '../../../../screens/expandable_flyout/alert_details_left_panel'; +import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB } from '../../../../screens/expandable_flyout/alert_details_left_panel'; import { openEntitiesTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel_entities_tab'; import { openInsightsTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel'; import { expandDocumentDetailsExpandableFlyoutLeftSection } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; @@ -42,20 +43,32 @@ describe( it('should display host details and user details under Insights Entities', () => { cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB) - .should('be.visible') - .and('have.text', 'Insights'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP).should('be.visible'); + .should('have.text', 'Insights') + .and('have.class', 'euiTab-isSelected'); cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_ENTITIES_BUTTON) - .should('be.visible') - .and('have.text', 'Entities'); + .should('have.text', 'Entities') + .and('have.class', 'euiButtonGroupButton-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS).scrollIntoView(); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_TITLE).should( + 'contain.text', + 'test' + ); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_RIGHT_SECTION).should( + 'contain.text', + 'Related hosts: 0' + ); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS).should('exist'); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS).scrollIntoView(); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_TITLE).should( + 'contain.text', + 'siem-kibana' + ); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_RIGHT_SECTION).should( + 'contain.text', + 'Related users: 0' + ); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS).should('exist'); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_investigation_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_investigation_tab.cy.ts index 36bd13e5c103d..c4e4cf5535352 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_investigation_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_investigation_tab.cy.ts @@ -35,10 +35,13 @@ describe( it('should display investigation guide', () => { cy.get(DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB) - .should('be.visible') - .and('have.text', 'Investigation'); + .should('have.text', 'Investigation') + .and('have.class', 'euiTab-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB_CONTENT).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB_CONTENT).should( + 'contain.text', + 'test markdown' + ); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_prevalence_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_prevalence_tab.cy.ts index 38fd4ffb7496a..44f48f7f74d0c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_prevalence_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_prevalence_tab.cy.ts @@ -9,10 +9,7 @@ import { openPrevalenceTab } from '../../../../tasks/expandable_flyout/alert_det import { openInsightsTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel'; import { expandDocumentDetailsExpandableFlyoutLeftSection } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; -import { - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB, - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP, -} from '../../../../screens/expandable_flyout/alert_details_left_panel'; +import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB } from '../../../../screens/expandable_flyout/alert_details_left_panel'; import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_ALERT_COUNT_CELL, DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON, @@ -21,7 +18,6 @@ import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_DOC_COUNT_CELL, DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_HOST_PREVALENCE_CELL, DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_USER_PREVALENCE_CELL, - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE, DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_DATE_PICKER, } from '../../../../screens/expandable_flyout/alert_details_left_panel_prevalence_tab'; import { login } from '../../../../tasks/login'; @@ -48,18 +44,18 @@ describe( it('should display prevalence tab', () => { cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB) - .should('be.visible') - .and('have.text', 'Insights'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP).should('be.visible'); + .should('have.text', 'Insights') + .and('have.class', 'euiTab-isSelected'); cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON) - .should('be.visible') - .and('have.text', 'Prevalence'); + .should('have.text', 'Prevalence') + .and('have.class', 'euiButtonGroupButton-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_DATE_PICKER).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_DATE_PICKER).should( + 'contain.text', + 'Last 30 days' + ); - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE).should('be.visible'); cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_TYPE_CELL) .should('contain.text', 'host.os.name') .and('contain.text', 'host.name') diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_response_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_response_tab.cy.ts index 8948480911c96..e4c2baba4e87e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_response_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_response_tab.cy.ts @@ -5,7 +5,10 @@ * 2.0. */ -import { DOCUMENT_DETAILS_FLYOUT_RESPONSE_EMPTY } from '../../../../screens/expandable_flyout/alert_details_left_panel_response_tab'; +import { + DOCUMENT_DETAILS_FLYOUT_RESPONSE_DETAILS, + DOCUMENT_DETAILS_FLYOUT_RESPONSE_EMPTY, +} from '../../../../screens/expandable_flyout/alert_details_left_panel_response_tab'; import { openResponseTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel_response_tab'; import { expandDocumentDetailsExpandableFlyoutLeftSection } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; @@ -15,6 +18,7 @@ import { createRule } from '../../../../tasks/api_calls/rules'; import { getNewRule } from '../../../../objects/rule'; import { ALERTS_URL } from '../../../../urls/navigation'; import { waitForAlertsToPopulate } from '../../../../tasks/create_new_rule'; +import { DOCUMENT_DETAILS_FLYOUT_RESPONSE_TAB } from '../../../../screens/expandable_flyout/alert_details_left_panel'; describe( 'Alert details expandable flyout left panel investigation', @@ -31,7 +35,16 @@ describe( }); it('should display empty response message', () => { - cy.get(DOCUMENT_DETAILS_FLYOUT_RESPONSE_EMPTY).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_RESPONSE_TAB) + .should('have.text', 'Response') + .and('have.class', 'euiTab-isSelected'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_RESPONSE_DETAILS).should('contain.text', 'Responses'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_RESPONSE_EMPTY).and( + 'contain.text', + "There are no response actions defined for this event. To add some, edit the rule's settings and set up response actions(opens in a new tab or window)." + ); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_session_view_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_session_view_tab.cy.ts index cbe17d55271e2..0c37aa9b835bb 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_session_view_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_session_view_tab.cy.ts @@ -6,10 +6,7 @@ */ import { DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_SESSION_VIEW_BUTTON } from '../../../../screens/expandable_flyout/alert_details_left_panel_session_view_tab'; -import { - DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB, - DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_BUTTON_GROUP, -} from '../../../../screens/expandable_flyout/alert_details_left_panel'; +import { DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB } from '../../../../screens/expandable_flyout/alert_details_left_panel'; import { expandDocumentDetailsExpandableFlyoutLeftSection } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; import { login } from '../../../../tasks/login'; @@ -35,14 +32,12 @@ describe.skip( it('should display session view under visualize', () => { cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB) - .should('be.visible') - .and('have.text', 'Visualize'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_BUTTON_GROUP).should('be.visible'); + .and('have.text', 'Visualize') + .and('have.class', 'euiTab-isSelected'); cy.get(DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_SESSION_VIEW_BUTTON) - .should('be.visible') - .and('have.text', 'Session View'); + .should('have.text', 'Session View') + .and('have.class', 'euiButtonGroupButton-isSelected'); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.cy.ts index 85338d85ed732..17080cbd32ae8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_left_panel_threat_intelligence_tab.cy.ts @@ -16,10 +16,7 @@ import { visit } from '../../../../tasks/navigation'; import { ALERTS_URL } from '../../../../urls/navigation'; import { openInsightsTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel'; import { openThreatIntelligenceTab } from '../../../../tasks/expandable_flyout/alert_details_left_panel_threat_intelligence_tab'; -import { - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB, - DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP, -} from '../../../../screens/expandable_flyout/alert_details_left_panel'; +import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB } from '../../../../screens/expandable_flyout/alert_details_left_panel'; import { DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_THREAT_INTELLIGENCE_BUTTON } from '../../../../screens/expandable_flyout/alert_details_left_panel_threat_intelligence_tab'; describe( @@ -39,16 +36,14 @@ describe( it('should serialize its state to url', () => { cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB) - .should('be.visible') - .and('have.text', 'Insights'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP).should('be.visible'); + .should('have.text', 'Insights') + .and('have.class', 'euiTab-isSelected'); cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_THREAT_INTELLIGENCE_BUTTON) - .should('be.visible') - .and('have.text', 'Threat intelligence'); + .should('have.text', 'Threat intelligence') + .and('have.class', 'euiButtonGroupButton-isSelected'); - cy.get(INDICATOR_MATCH_ENRICHMENT_SECTION).should('be.visible'); + cy.get(INDICATOR_MATCH_ENRICHMENT_SECTION).should('exist'); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_alert_reason_preview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_alert_reason_preview.cy.ts index 09d90627d8b1b..89596877fb3e8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_alert_reason_preview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_alert_reason_preview.cy.ts @@ -32,8 +32,15 @@ describe( describe('alert reason preview', () => { it('should display alert reason preview', () => { - cy.get(DOCUMENT_DETAILS_FLYOUT_ALERT_REASON_PREVIEW_CONTAINER).scrollIntoView(); - cy.get(DOCUMENT_DETAILS_FLYOUT_ALERT_REASON_PREVIEW_CONTAINER).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_ALERT_REASON_PREVIEW_CONTAINER) + .should('contain.text', 'Alert reason') + .and('contain.text', 'process') + .and('contain.text', 'zsh') + .and('contain.text', '80') + .and('contain.text', 'test') + .and('contain.text', 'siem-kibana') + .and('contain.text', 'high') + .and('contain.text', rule.name); }); }); } diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_rule_preview.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_rule_preview.cy.ts index 13c98358ec3ee..82ce990292901 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_rule_preview.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_preview_panel_rule_preview.cy.ts @@ -7,12 +7,9 @@ import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; import { - DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SECTION, - DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_HEADER, DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_TITLE, DOCUMENT_DETAILS_FLYOUT_CREATED_BY, DOCUMENT_DETAILS_FLYOUT_UPDATED_BY, - DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_BODY, DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_HEADER, DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_CONTENT, DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_HEADER, @@ -20,6 +17,7 @@ import { DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_HEADER, DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_CONTENT, DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER, + DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER_LINK, } from '../../../../screens/expandable_flyout/alert_details_preview_panel_rule_preview'; import { toggleRulePreviewAboutSection, @@ -53,48 +51,75 @@ describe( it('should display rule preview and its sub sections', () => { cy.log('rule preview panel'); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SECTION).scrollIntoView(); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_HEADER).should('be.visible'); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_BODY).should('be.visible'); - cy.log('title'); cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_TITLE).scrollIntoView(); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_TITLE).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_TITLE).should('contain.text', rule.name); cy.get(DOCUMENT_DETAILS_FLYOUT_CREATED_BY).should('be.visible'); cy.get(DOCUMENT_DETAILS_FLYOUT_UPDATED_BY).should('be.visible'); cy.log('about'); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_HEADER) - .should('be.visible') - .and('contain.text', 'About'); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_CONTENT).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_HEADER).should( + 'contain.text', + 'About' + ); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_CONTENT) + .should('contain.text', 'Severity') + .and('contain.text', 'High') + .and('contain.text', 'Risk score') + .and('contain.text', '17'); + toggleRulePreviewAboutSection(); cy.log('definition'); toggleRulePreviewDefinitionSection(); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_HEADER) - .should('be.visible') - .and('contain.text', 'Definition'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_HEADER).should( + 'contain.text', + 'Definition' + ); cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_CONTENT).should( - 'be.visible' + 'contain.text', + 'Index patterns' + ); + // @ts-ignore + rule.index.forEach((index: string) => + cy + .get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_CONTENT) + .should('contain.text', index) ); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_CONTENT) + .should('contain.text', 'Custom query') + .and('contain.text', rule.query); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_CONTENT) + .should('contain.text', 'Rule type') + .and('contain.text', rule.type); + toggleRulePreviewDefinitionSection(); cy.log('schedule'); toggleRulePreviewScheduleSection(); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_HEADER) - .should('be.visible') - .and('contain.text', 'Schedule'); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_CONTENT).should('be.visible'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_HEADER).should( + 'contain.text', + 'Schedule' + ); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_CONTENT) + .should('contain.text', 'Runs every') + .and('contain.text', rule.interval); + toggleRulePreviewScheduleSection(); cy.log('footer'); - cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER).scrollIntoView(); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER_LINK).should( + 'contain.text', + 'Show rule details' + ); }); }); } diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts index d89cc4ad4eb50..aaa8806362d06 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel.cy.ts @@ -30,6 +30,8 @@ import { DOCUMENT_DETAILS_FLYOUT_FOOTER_MARK_AS_CLOSED, DOCUMENT_DETAILS_FLYOUT_FOOTER_RESPOND, DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON, + DOCUMENT_DETAILS_FLYOUT_HEADER_ICON, + DOCUMENT_DETAILS_FLYOUT_HEADER_LINK_ICON, DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE, DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE_VALUE, DOCUMENT_DETAILS_FLYOUT_HEADER_SEVERITY_VALUE, @@ -49,174 +51,165 @@ import { openTakeActionButtonAndSelectItem, selectTakeActionItem, } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; -import { deleteAlertsAndRules } from '../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { login } from '../../../../tasks/login'; import { visit } from '../../../../tasks/navigation'; import { createRule } from '../../../../tasks/api_calls/rules'; import { getNewRule } from '../../../../objects/rule'; import { ALERTS_URL } from '../../../../urls/navigation'; import { waitForAlertsToPopulate } from '../../../../tasks/create_new_rule'; +import { TOASTER } from '../../../../screens/alerts_detection_rules'; -// FLAKY: https://github.com/elastic/kibana/issues/171002 -describe.skip( - 'Alert details expandable flyout right panel', - { tags: ['@ess', '@serverless'] }, - () => { - const rule = getNewRule(); - - beforeEach(() => { - deleteAlertsAndRules(); - login(); - createRule(rule); - visit(ALERTS_URL); - waitForAlertsToPopulate(); - }); - - it('should display header and footer basics', () => { - expandFirstAlertExpandableFlyout(); - - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('have.text', rule.name); - - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_STATUS).should('have.text', 'open'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE).should('have.text', 'Risk score:'); - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE_VALUE) - .should('be.visible') - .and('have.text', rule.risk_score); - - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_SEVERITY_VALUE) - .should('be.visible') - .and('have.text', upperFirst(rule.severity)); - - cy.log('Verify all 3 tabs are visible'); - - cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB) - .should('have.text', 'Overview') - .and('have.class', 'euiTab-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB) - .should('have.text', 'Table') - .and('not.have.class', 'euiTab-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB) - .should('have.text', 'JSON') - .and('not.have.class', 'euiTab-isSelected'); - - cy.log('Verify the expand/collapse button is visible and functionality works'); - - expandDocumentDetailsExpandableFlyoutLeftSection(); - cy.get(DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON).should( - 'have.text', - 'Collapse details' - ); +describe('Alert details expandable flyout right panel', { tags: ['@ess', '@serverless'] }, () => { + const rule = getNewRule(); + + beforeEach(() => { + deleteAlertsAndRules(); + login(); + createRule(rule); + visit(ALERTS_URL); + waitForAlertsToPopulate(); + }); + + it('should display header and footer basics', () => { + expandFirstAlertExpandableFlyout(); + + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_ICON).should('exist'); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('have.text', rule.name); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_LINK_ICON).should('exist'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_STATUS).should('have.text', 'open'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE).should('have.text', 'Risk score:'); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_RISK_SCORE_VALUE) + .should('be.visible') + .and('have.text', rule.risk_score); + + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_SEVERITY_VALUE) + .should('be.visible') + .and('have.text', upperFirst(rule.severity)); + + cy.log('Verify all 3 tabs are visible'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_OVERVIEW_TAB) + .should('have.text', 'Overview') + .and('have.class', 'euiTab-isSelected'); + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB) + .should('have.text', 'Table') + .and('not.have.class', 'euiTab-isSelected'); + cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB) + .should('have.text', 'JSON') + .and('not.have.class', 'euiTab-isSelected'); + + cy.log('Verify the expand/collapse button is visible and functionality works'); + + expandDocumentDetailsExpandableFlyoutLeftSection(); + cy.get(DOCUMENT_DETAILS_FLYOUT_COLLAPSE_DETAILS_BUTTON).should('have.text', 'Collapse details'); + + collapseDocumentDetailsExpandableFlyoutLeftSection(); + cy.get(DOCUMENT_DETAILS_FLYOUT_EXPAND_DETAILS_BUTTON).should('have.text', 'Expand details'); + + cy.log('Verify the take action button is visible on all tabs'); + + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); + + openTableTab(); + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB).should('have.class', 'euiTab-isSelected'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); + + openJsonTab(); + cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB).should('have.class', 'euiTab-isSelected'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); + }); + + // TODO this will change when add to existing case is improved + // https://github.com/elastic/security-team/issues/6298 + it('should add to existing case', () => { + expandFirstAlertExpandableFlyout(); + openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE); + fillOutFormToCreateNewCase(); + openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_EXISTING_CASE); + + cy.get(EXISTING_CASE_SELECT_BUTTON).contains('Select').click(); - collapseDocumentDetailsExpandableFlyoutLeftSection(); - cy.get(DOCUMENT_DETAILS_FLYOUT_EXPAND_DETAILS_BUTTON).should('have.text', 'Expand details'); + cy.get(VIEW_CASE_TOASTER_LINK).should('contain.text', 'View case'); + }); - cy.log('Verify the take action button is visible on all tabs'); + // TODO this will change when add to new case is improved + // https://github.com/elastic/security-team/issues/6298 + it('should add to new case', () => { + expandFirstAlertExpandableFlyout(); + openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE); + fillOutFormToCreateNewCase(); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); + cy.get(VIEW_CASE_TOASTER_LINK).should('contain.text', 'View case'); + }); - openTableTab(); - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB).should('have.class', 'euiTab-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); - - openJsonTab(); - cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB).should('have.class', 'euiTab-isSelected'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER).should('be.visible'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_TAKE_ACTION_BUTTON).should('be.visible'); - }); - - // TODO this will change when add to existing case is improved - // https://github.com/elastic/security-team/issues/6298 - it('should add to existing case', () => { - expandFirstAlertExpandableFlyout(); - openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE); - fillOutFormToCreateNewCase(); - openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_EXISTING_CASE); - - cy.get(EXISTING_CASE_SELECT_BUTTON).should('be.visible').contains('Select').click(); - - cy.get(VIEW_CASE_TOASTER_LINK).should('be.visible').and('contain.text', 'View case'); - }); - - // TODO this will change when add to new case is improved - // https://github.com/elastic/security-team/issues/6298 - it('should add to new case', () => { - expandFirstAlertExpandableFlyout(); - openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_TO_NEW_CASE); - fillOutFormToCreateNewCase(); - - cy.get(VIEW_CASE_TOASTER_LINK).should('be.visible').and('contain.text', 'View case'); - }); - - it('should mark as acknowledged', () => { - cy.get(ALERT_CHECKBOX).should('have.length', 1); - - expandFirstAlertExpandableFlyout(); - openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_MARK_AS_ACKNOWLEDGED); - - // TODO figure out how to verify the toasts pops up - // cy.get(KIBANA_TOAST) - // .should('be.visible') - // .and('have.text', 'Successfully marked 1 alert as acknowledged.'); - cy.get(EMPTY_ALERT_TABLE).should('exist'); - }); - - it('should mark as closed', () => { - cy.get(ALERT_CHECKBOX).should('have.length', 1); - - expandFirstAlertExpandableFlyout(); - openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_MARK_AS_CLOSED); - - // TODO figure out how to verify the toasts pops up - // cy.get(KIBANA_TOAST).should('be.visible').and('have.text', 'Successfully closed 1 alert.'); - cy.get(EMPTY_ALERT_TABLE).should('exist'); - }); - - // these actions are now grouped together as we're not really testing their functionality but just the existence of the option in the dropdown - it('should test other action within take action dropdown', () => { - expandFirstAlertExpandableFlyout(); - - cy.log('should add endpoint exception'); - - // TODO figure out why this option is disabled in Cypress but not running the app locally - // https://github.com/elastic/security-team/issues/6300 - openTakeActionButton(); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_ENDPOINT_EXCEPTION).should('be.disabled'); - - cy.log('should add rule exception'); - - // TODO this isn't fully testing the add rule exception yet - // https://github.com/elastic/security-team/issues/6301 - selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_HEADER).should('exist'); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_CANCEL_BUTTON) - .should('be.visible') - .click(); - - // cy.log('should isolate host'); - - // TODO figure out why isolate host isn't showing up in the dropdown - // https://github.com/elastic/security-team/issues/6302 - // openTakeActionButton(); - // cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ISOLATE_HOST).should('be.visible'); - - cy.log('should respond'); - - // TODO this will change when respond is improved - // https://github.com/elastic/security-team/issues/6303 - openTakeActionButton(); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_RESPOND).should('be.disabled'); - - cy.log('should investigate in timeline'); - - selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE); - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_SECTION) - .first() - .within(() => - cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_ENTRY).should('exist') - ); - }); - } -); + it('should mark as acknowledged', () => { + cy.get(ALERT_CHECKBOX).should('have.length', 1); + + expandFirstAlertExpandableFlyout(); + openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_MARK_AS_ACKNOWLEDGED); + + cy.get(TOASTER).should('have.text', 'Successfully marked 1 alert as acknowledged.'); + cy.get(EMPTY_ALERT_TABLE).should('exist'); + }); + + it('should mark as closed', () => { + cy.get(ALERT_CHECKBOX).should('have.length', 1); + + expandFirstAlertExpandableFlyout(); + openTakeActionButtonAndSelectItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_MARK_AS_CLOSED); + + cy.get(TOASTER).should('have.text', 'Successfully closed 1 alert.'); + cy.get(EMPTY_ALERT_TABLE).should('exist'); + }); + + // these actions are now grouped together as we're not really testing their functionality but just the existence of the option in the dropdown + it('should test other action within take action dropdown', () => { + expandFirstAlertExpandableFlyout(); + + cy.log('should add endpoint exception'); + + // TODO figure out why this option is disabled in Cypress but not running the app locally + // https://github.com/elastic/security-team/issues/6300 + openTakeActionButton(); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_ENDPOINT_EXCEPTION).should('be.disabled'); + + cy.log('should add rule exception'); + + // TODO this isn't fully testing the add rule exception yet + // https://github.com/elastic/security-team/issues/6301 + selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_HEADER).should('exist'); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ADD_RULE_EXCEPTION_FLYOUT_CANCEL_BUTTON) + .should('be.visible') + .click(); + + // cy.log('should isolate host'); + + // TODO figure out why isolate host isn't showing up in the dropdown + // https://github.com/elastic/security-team/issues/6302 + // openTakeActionButton(); + // cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_ISOLATE_HOST).should('be.visible'); + + cy.log('should respond'); + + // TODO this will change when respond is improved + // https://github.com/elastic/security-team/issues/6303 + openTakeActionButton(); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_RESPOND).should('be.disabled'); + + cy.log('should investigate in timeline'); + + selectTakeActionItem(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE); + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_SECTION) + .first() + .within(() => + cy.get(DOCUMENT_DETAILS_FLYOUT_FOOTER_INVESTIGATE_IN_TIMELINE_ENTRY).should('exist') + ); + }); +}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_json_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_json_tab.cy.ts index a7bb39381ad9a..f41dba6dd1006 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_json_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_json_tab.cy.ts @@ -7,7 +7,10 @@ import { openJsonTab } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; import { expandFirstAlertExpandableFlyout } from '../../../../tasks/expandable_flyout/common'; -import { DOCUMENT_DETAILS_FLYOUT_JSON_TAB_CONTENT } from '../../../../screens/expandable_flyout/alert_details_right_panel_json_tab'; +import { + DOCUMENT_DETAILS_FLYOUT_JSON_TAB_CONTENT, + DOCUMENT_DETAILS_FLYOUT_JSON_TAB_COPY_TO_CLIPBOARD_BUTTON, +} from '../../../../screens/expandable_flyout/alert_details_right_panel_json_tab'; import { login } from '../../../../tasks/login'; import { visit } from '../../../../tasks/navigation'; import { createRule } from '../../../../tasks/api_calls/rules'; @@ -29,7 +32,13 @@ describe( }); it('should display the json component', () => { - cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB_CONTENT).should('exist'); + cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB_COPY_TO_CLIPBOARD_BUTTON).should( + 'have.text', + 'Copy to clipboard' + ); + cy.get(DOCUMENT_DETAILS_FLYOUT_JSON_TAB_CONTENT) + .should('contain.text', '_index') + .and('contain.text', '_id'); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts index 33bcb93caacf0..fb2af6a16b022 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_overview_tab.cy.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { deleteAlertsAndRules } from '../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { collapseDocumentDetailsExpandableFlyoutLeftSection } from '../../../../tasks/expandable_flyout/alert_details_right_panel'; import { createNewCaseFromExpandableFlyout, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_table_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_table_tab.cy.ts index 9f10b73065ba8..c855beca9fdb6 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_table_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_right_panel_table_tab.cy.ts @@ -12,6 +12,7 @@ import { PROVIDER_BADGE } from '../../../../screens/timeline'; import { removeKqlFilter } from '../../../../tasks/search_bar'; import { COLUMN_HEADER, FILTER_BADGE, TIMESTAMP_COLUMN } from '../../../../screens/alerts'; import { + DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_HOST_OS_BUILD_ROW, DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ID_ROW, DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_COPY_TO_CLIPBOARD, DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_CELL, @@ -19,13 +20,12 @@ import { } from '../../../../screens/expandable_flyout/alert_details_right_panel_table_tab'; import { addToTimelineTableTabTable, - clearFilterTableTabTable, filterInTableTabTable, filterOutTableTabTable, filterTableTabTable, toggleColumnTableTabTable, } from '../../../../tasks/expandable_flyout/alert_details_right_panel_table_tab'; -import { deleteAlertsAndRules } from '../../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../../tasks/api_calls/common'; import { login } from '../../../../tasks/login'; import { visit } from '../../../../tasks/navigation'; import { createRule } from '../../../../tasks/api_calls/rules'; @@ -48,11 +48,23 @@ describe( }); it('should display and filter the table', () => { - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_ROW).should('be.visible'); - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ID_ROW).should('be.visible'); + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_ROW) + .should('be.visible') + .and('contain.text', '@timestamp'); + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ID_ROW) + .should('be.visible') + .and('contain.text', '_id'); + + // this entry is the last one of the first page of the table and should not be visible + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_HOST_OS_BUILD_ROW) + .should('not.be.visible') + .and('contain.text', 'host.os.build'); + filterTableTabTable('timestamp'); - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_ROW).should('be.visible'); - clearFilterTableTabTable(); + + cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_ROW) + .should('be.visible') + .and('contain.text', '@timestamp'); }); it('should test cell actions', () => { diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_url_sync.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_url_sync.cy.ts index 5e46dea3ee245..fae802cbfc190 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_url_sync.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/expandable_flyout/alert_details_url_sync.cy.ts @@ -33,7 +33,7 @@ describe('Expandable flyout state sync', { tags: ['@ess', '@serverless'] }, () = cy.log('should serialize its state to url'); cy.url().should('include', 'eventFlyout'); - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('be.visible').and('have.text', rule.name); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('have.text', rule.name); cy.log('should reopen the flyout after browser refresh'); @@ -41,7 +41,7 @@ describe('Expandable flyout state sync', { tags: ['@ess', '@serverless'] }, () = waitForAlertsToPopulate(); cy.url().should('include', 'eventFlyout'); - cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('be.visible').and('have.text', rule.name); + cy.get(DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE).should('have.text', rule.name); cy.log('should clear the url state when flyout is closed'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts index 98d76d984512d..b90413cdfe751 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/ransomware_prevention.cy.ts @@ -12,7 +12,7 @@ import { ALERTS_URL } from '../../../urls/navigation'; import { ALERTS_HISTOGRAM_SERIES, ALERT_RULE_NAME, MESSAGE } from '../../../screens/alerts'; import { TIMELINE_VIEW_IN_ANALYZER } from '../../../screens/timeline'; import { selectAlertsHistogram } from '../../../tasks/alerts'; -import { deleteTimelines } from '../../../tasks/common'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; import { createTimeline } from '../../../tasks/api_calls/timelines'; import { getTimeline } from '../../../objects/timeline'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts index e19e4ca043b3c..eb3881f8123a5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/dasbhoards/detection_response.cy.ts @@ -31,7 +31,7 @@ import { import { QUERY_TAB_BUTTON, TIMELINE_DATA_PROVIDERS_CONTAINER } from '../../../screens/timeline'; import { waitForAlerts } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; -import { deleteAlertsAndRules } from '../../../tasks/common'; +import { deleteAlertsAndRules } from '../../../tasks/api_calls/common'; import { investigateDashboardItemInTimeline } from '../../../tasks/dashboards/common'; import { waitToNavigateAwayFrom } from '../../../tasks/kibana_navigation'; import { login } from '../../../tasks/login'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts index b3ed43ffe9d8a..bb1e0f372e33c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timeline_templates/creation.cy.ts @@ -26,7 +26,7 @@ import { TIMELINES_FAVORITE, } from '../../../screens/timelines'; import { createTimeline } from '../../../tasks/api_calls/timelines'; -import { deleteTimelines } from '../../../tasks/common'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; import { login } from '../../../tasks/login'; import { visit } from '../../../tasks/navigation'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts index a50dbe08b0637..96b30a29d23d2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/correlation_tab.cy.ts @@ -21,7 +21,7 @@ import { addEqlToTimeline, saveTimeline } from '../../../tasks/timeline'; import { TIMELINES_URL } from '../../../urls/navigation'; import { EQL_QUERY_VALIDATION_ERROR } from '../../../screens/create_new_rule'; -import { deleteTimelines } from '../../../tasks/common'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; describe('Correlation tab', { tags: ['@ess', '@serverless'] }, () => { const eql = 'any where process.name == "zsh"'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts index 1b69b314daf75..e324dede796f3 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts @@ -24,7 +24,7 @@ import { } from '../../../screens/timeline'; import { createTimelineTemplate } from '../../../tasks/api_calls/timelines'; -import { deleteTimelines } from '../../../tasks/common'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; import { login } from '../../../tasks/login'; import { visit, visitWithTimeRange } from '../../../tasks/navigation'; import { openTimelineUsingToggle } from '../../../tasks/security_main'; @@ -75,7 +75,8 @@ describe('Timelines', (): void => { deleteTimelines(); }); - describe('Toggle create timeline from plus icon', () => { + // FLAKY: https://github.com/elastic/kibana/issues/169866 + describe.skip('Toggle create timeline from plus icon', () => { context('Privileges: CRUD', { tags: '@ess' }, () => { beforeEach(() => { login(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts index ba20f89defef7..80d4a9780c6e7 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts @@ -16,7 +16,8 @@ import { TIMELINE_ROW_RENDERERS_SURICATA_LINK_TOOLTIP, TIMELINE_ROW_RENDERERS_MODAL_CLOSE_BUTTON, } from '../../../screens/timeline'; -import { deleteTimelines, waitForWelcomePanelToBeLoaded } from '../../../tasks/common'; +import { deleteTimelines } from '../../../tasks/api_calls/common'; +import { waitForWelcomePanelToBeLoaded } from '../../../tasks/common'; import { waitForAllHostsToBeLoaded } from '../../../tasks/hosts/all_hosts'; import { login } from '../../../tasks/login'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts index 5c7d1dafa6672..780beec43d838 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/unsaved_timeline.cy.ts @@ -21,16 +21,21 @@ import { import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { closeTimelineUsingToggle } from '../../../tasks/security_main'; +import { + navigateToHostsUsingBreadcrumb, + navigateToExploreUsingBreadcrumb, + navigateToAlertsPageInServerless, + navigateToDiscoverPageInServerless, + navigateToExplorePageInServerless, +} from '../../../tasks/serverless/navigation'; import { addNameToTimelineAndSave, createNewTimeline, populateTimeline, } from '../../../tasks/timeline'; -import { hostsUrl, MANAGE_URL } from '../../../urls/navigation'; - -// https://github.com/elastic/kibana/issues/169021 +import { EXPLORE_URL, hostsUrl, MANAGE_URL } from '../../../urls/navigation'; -describe('Save Timeline Prompts', { tags: ['@ess', '@serverless', '@brokenInServerless'] }, () => { +describe('Save Timeline Prompts', { tags: ['@ess'] }, () => { before(() => { login(); /* @@ -133,3 +138,90 @@ describe('Save Timeline Prompts', { tags: ['@ess', '@serverless', '@brokenInServ cy.url().should('not.contain', MANAGE_URL); }); }); + +// In serverless it is not possible to use the navigation menu without closing the timeline +describe('Save Timeline Prompts', { tags: ['@serverless'] }, () => { + before(() => { + login(); + /* + * When timeline changes are pending, chrome would popup with + * a confirm dialog stating that `you can lose unsaved changed. + * Below changes will disable that. + * + * */ + cy.window().then((win) => { + win.onbeforeunload = null; + }); + }); + + beforeEach(() => { + login(); + visitWithTimeRange(hostsUrl('allHosts')); + createNewTimeline(); + }); + + it('unchanged & unsaved timeline should NOT prompt when it is closed and navigate to any page', () => { + closeTimelineUsingToggle(); + + navigateToAlertsPageInServerless(); // security page with timelines enabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + navigateToExplorePageInServerless(); // security page with timelines disabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + navigateToDiscoverPageInServerless(); // external page + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + }); + + it('Changed & unsaved timeline should prompt when it is closed and navigate to Security page without timeline', () => { + populateTimeline(); + closeTimelineUsingToggle(); + + navigateToAlertsPageInServerless(); // security page with timelines enabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + navigateToExplorePageInServerless(); // security page with timelines disabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('be.visible'); + cy.get(MODAL_CONFIRMATION_BTN).click(); + }); + + it('Changed & unsaved timeline should prompt when it is closed and navigate to external page', () => { + populateTimeline(); + closeTimelineUsingToggle(); + + navigateToDiscoverPageInServerless(); + cy.get(APP_LEAVE_CONFIRM_MODAL).should('be.visible'); + cy.get(MODAL_CONFIRMATION_BTN).click(); + }); + + it('Changed & saved timeline should NOT prompt when it is closed', () => { + populateTimeline(); + addNameToTimelineAndSave('Test'); + closeTimelineUsingToggle(); + + navigateToAlertsPageInServerless(); // security page with timelines enabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + navigateToExplorePageInServerless(); // security page with timelines disabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + navigateToDiscoverPageInServerless(); // external page + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + }); + + it('Changed & unsaved timeline should NOT prompt when navigate to page with timeline using breadcrumbs', () => { + populateTimeline(); + navigateToHostsUsingBreadcrumb(); // hosts has timelines enabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + }); + + it('Changed & unsaved timeline should NOT prompt when navigate to page without timeline using breadcrumbs', () => { + populateTimeline(); + navigateToExploreUsingBreadcrumb(); // explore has timelines disabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('be.visible'); + cy.get(MODAL_CONFIRMATION_BTN).click(); + cy.url().should('contain', EXPLORE_URL); + }); + + it('Changed & saved timeline should NOT prompt when user navigates within security solution where timelines are disabled', () => { + populateTimeline(); + addNameToTimelineAndSave('Test'); + navigateToExploreUsingBreadcrumb(); // explore has timelines disabled + cy.get(APP_LEAVE_CONFIRM_MODAL).should('not.exist'); + }); +}); diff --git a/x-pack/test/security_solution_cypress/cypress/objects/exception.ts b/x-pack/test/security_solution_cypress/cypress/objects/exception.ts index 6e754d837dcf5..6865784ae5bab 100644 --- a/x-pack/test/security_solution_cypress/cypress/objects/exception.ts +++ b/x-pack/test/security_solution_cypress/cypress/objects/exception.ts @@ -6,6 +6,7 @@ */ import type { ExceptionListSchema } from '@kbn/securitysolution-io-ts-list-types'; +import { ELASTICSEARCH_USERNAME } from '../env_var_names_constants'; export interface Exception { field: string; @@ -61,5 +62,15 @@ export const expectedExportedExceptionList = ( exceptionListResponse: Cypress.Response ): string => { const jsonRule = exceptionListResponse.body; - return `{"_version":"${jsonRule._version}","created_at":"${jsonRule.created_at}","created_by":"system_indices_superuser","description":"${jsonRule.description}","id":"${jsonRule.id}","immutable":false,"list_id":"${jsonRule.list_id}","name":"${jsonRule.name}","namespace_type":"single","os_types":[],"tags":[],"tie_breaker_id":"${jsonRule.tie_breaker_id}","type":"${jsonRule.type}","updated_at":"${jsonRule.updated_at}","updated_by":"system_indices_superuser","version":1}\n{"exported_exception_list_count":1,"exported_exception_list_item_count":0,"missing_exception_list_item_count":0,"missing_exception_list_items":[],"missing_exception_lists":[],"missing_exception_lists_count":0}\n`; + return `{"_version":"${jsonRule._version}","created_at":"${ + jsonRule.created_at + }","created_by":"${Cypress.env(ELASTICSEARCH_USERNAME)}","description":"${ + jsonRule.description + }","id":"${jsonRule.id}","immutable":false,"list_id":"${jsonRule.list_id}","name":"${ + jsonRule.name + }","namespace_type":"single","os_types":[],"tags":[],"tie_breaker_id":"${ + jsonRule.tie_breaker_id + }","type":"${jsonRule.type}","updated_at":"${jsonRule.updated_at}","updated_by":"${Cypress.env( + ELASTICSEARCH_USERNAME + )}","version":1}\n{"exported_exception_list_count":1,"exported_exception_list_item_count":0,"missing_exception_list_item_count":0,"missing_exception_list_items":[],"missing_exception_lists":[],"missing_exception_lists_count":0}\n`; }; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts index f616b63e45e19..0eaec7ce0b471 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts @@ -140,10 +140,8 @@ export const SELECT_HISTOGRAM = '[data-test-subj="chart-select-trend"]'; export const LEGEND_ACTIONS = { ADD_TO_TIMELINE: (ruleName: string) => `[data-test-subj="legend-${ruleName}-embeddable_addToTimeline"]`, - FILTER_FOR: (ruleName: string) => - `[data-test-subj="legend-${ruleName}-histogramLegendActionFilterIn"]`, - FILTER_OUT: (ruleName: string) => - `[data-test-subj="legend-${ruleName}-histogramLegendActionFilterOut"]`, + FILTER_FOR: (ruleName: string) => `[data-test-subj="legend-${ruleName}-embeddable_filterIn"]`, + FILTER_OUT: (ruleName: string) => `[data-test-subj="legend-${ruleName}-embeddable_filterOut"]`, COPY: (ruleName: string) => `[data-test-subj="legend-${ruleName}-embeddable_copyToClipboard"]`, }; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/create_new_case.ts b/x-pack/test/security_solution_cypress/cypress/screens/create_new_case.ts index ad7e26d209d5c..f28c7692a77aa 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/create_new_case.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/create_new_case.ts @@ -21,6 +21,6 @@ export const SUBMIT_BTN = '[data-test-subj="create-case-submit"]'; export const TAGS_INPUT = '[data-test-subj="caseTags"] [data-test-subj="comboBoxSearchInput"]'; -export const TIMELINE = '[data-test-subj="timeline"]'; +export const TIMELINE = '[data-test-subj="selectable-input"] [data-test-subj="timeline"]'; export const TITLE_INPUT = '[data-test-subj="caseTitle"] [data-test-subj="input"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/events_viewer.ts b/x-pack/test/security_solution_cypress/cypress/screens/events_viewer.ts new file mode 100644 index 0000000000000..d488eb411ec3b --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/screens/events_viewer.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const DATA_GRID_EMPTY_STATE = '[data-test-subj="tGridEmptyState"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts index 5b8c8255dffee..7edd12dcf1eda 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel.ts @@ -5,10 +5,6 @@ * 2.0. */ -import { - INSIGHTS_TAB_BUTTON_GROUP_TEST_ID, - VISUALIZE_TAB_BUTTON_GROUP_TEST_ID, -} from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; import { INSIGHTS_TAB_TEST_ID, INVESTIGATION_TAB_TEST_ID, @@ -25,9 +21,3 @@ export const DOCUMENT_DETAILS_FLYOUT_INVESTIGATION_TAB = getDataTestSubjectSelector(INVESTIGATION_TAB_TEST_ID); export const DOCUMENT_DETAILS_FLYOUT_RESPONSE_TAB = getDataTestSubjectSelector(RESPONSE_TAB_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_VISUALIZE_TAB_BUTTON_GROUP = getDataTestSubjectSelector( - VISUALIZE_TAB_BUTTON_GROUP_TEST_ID -); -export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_BUTTON_GROUP = getDataTestSubjectSelector( - INSIGHTS_TAB_BUTTON_GROUP_TEST_ID -); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts index 0cda5fb1c87ee..8d4bb411c9e3e 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_entities_tab.ts @@ -6,23 +6,33 @@ */ import { - ENTITIES_DETAILS_TEST_ID, HOST_DETAILS_TEST_ID, USER_DETAILS_TEST_ID, } from '@kbn/security-solution-plugin/public/flyout/document_details/left/components/test_ids'; import { INSIGHTS_TAB_ENTITIES_BUTTON_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/left/tabs/test_ids'; -import { EXPANDABLE_PANEL_CONTENT_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/shared/components/test_ids'; +import { + EXPANDABLE_PANEL_CONTENT_TEST_ID, + EXPANDABLE_PANEL_HEADER_RIGHT_SECTION_TEST_ID, + EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID, +} from '@kbn/security-solution-plugin/public/flyout/shared/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_ENTITIES_BUTTON = getDataTestSubjectSelector( INSIGHTS_TAB_ENTITIES_BUTTON_TEST_ID ); - -export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_ENTITIES_CONTENT = - getDataTestSubjectSelector(ENTITIES_DETAILS_TEST_ID); +export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_TITLE = getDataTestSubjectSelector( + EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(USER_DETAILS_TEST_ID) +); +export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS_RIGHT_SECTION = + getDataTestSubjectSelector(EXPANDABLE_PANEL_HEADER_RIGHT_SECTION_TEST_ID(USER_DETAILS_TEST_ID)); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_USER_DETAILS = getDataTestSubjectSelector( EXPANDABLE_PANEL_CONTENT_TEST_ID(USER_DETAILS_TEST_ID) ); +export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_TITLE = getDataTestSubjectSelector( + EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(HOST_DETAILS_TEST_ID) +); +export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS_RIGHT_SECTION = + getDataTestSubjectSelector(EXPANDABLE_PANEL_HEADER_RIGHT_SECTION_TEST_ID(HOST_DETAILS_TEST_ID)); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_HOST_DETAILS = getDataTestSubjectSelector( EXPANDABLE_PANEL_CONTENT_TEST_ID(HOST_DETAILS_TEST_ID) ); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts index 0efc48511c9be..fe7f7d2fc9e8e 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_left_panel_prevalence_tab.ts @@ -10,7 +10,6 @@ import { PREVALENCE_DETAILS_TABLE_DOC_COUNT_CELL_TEST_ID, PREVALENCE_DETAILS_TABLE_HOST_PREVALENCE_CELL_TEST_ID, PREVALENCE_DETAILS_TABLE_VALUE_CELL_TEST_ID, - PREVALENCE_DETAILS_TABLE_TEST_ID, PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID, PREVALENCE_DETAILS_TABLE_USER_PREVALENCE_CELL_TEST_ID, PREVALENCE_DETAILS_DATE_PICKER_TEST_ID, @@ -23,9 +22,6 @@ export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_BUTTON = getDataTes ); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_DATE_PICKER = getDataTestSubjectSelector(PREVALENCE_DETAILS_DATE_PICKER_TEST_ID); -export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE = getDataTestSubjectSelector( - PREVALENCE_DETAILS_TABLE_TEST_ID -); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_TYPE_CELL = getDataTestSubjectSelector(PREVALENCE_DETAILS_TABLE_FIELD_CELL_TEST_ID); export const DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_PREVALENCE_TABLE_NAME_CELL = diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts index 90d051aec1b57..e808a3c07a7db 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_preview_panel_rule_preview.ts @@ -9,7 +9,6 @@ import { RULE_PREVIEW_TITLE_TEST_ID, RULE_PREVIEW_RULE_CREATED_BY_TEST_ID, RULE_PREVIEW_RULE_UPDATED_BY_TEST_ID, - RULE_PREVIEW_BODY_TEST_ID, RULE_PREVIEW_ABOUT_HEADER_TEST_ID, RULE_PREVIEW_ABOUT_CONTENT_TEST_ID, RULE_PREVIEW_DEFINITION_HEADER_TEST_ID, @@ -17,46 +16,35 @@ import { RULE_PREVIEW_SCHEDULE_HEADER_TEST_ID, RULE_PREVIEW_SCHEDULE_CONTENT_TEST_ID, RULE_PREVIEW_FOOTER_TEST_ID, + RULE_PREVIEW_NAVIGATE_TO_RULE_TEST_ID, } from '@kbn/security-solution-plugin/public/flyout/document_details/preview/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; -export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SECTION = - getDataTestSubjectSelector('previewSection'); - -export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_HEADER = - getDataTestSubjectSelector('previewSectionHeader'); - export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_TITLE = getDataTestSubjectSelector( RULE_PREVIEW_TITLE_TEST_ID ); - export const DOCUMENT_DETAILS_FLYOUT_CREATED_BY = getDataTestSubjectSelector( RULE_PREVIEW_RULE_CREATED_BY_TEST_ID ); - export const DOCUMENT_DETAILS_FLYOUT_UPDATED_BY = getDataTestSubjectSelector( RULE_PREVIEW_RULE_UPDATED_BY_TEST_ID ); - -export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_BODY = - getDataTestSubjectSelector(RULE_PREVIEW_BODY_TEST_ID); - export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_HEADER = getDataTestSubjectSelector( RULE_PREVIEW_ABOUT_HEADER_TEST_ID ); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_ABOUT_SECTION_CONTENT = getDataTestSubjectSelector(RULE_PREVIEW_ABOUT_CONTENT_TEST_ID); - export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_HEADER = getDataTestSubjectSelector(RULE_PREVIEW_DEFINITION_HEADER_TEST_ID); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_DEFINITION_SECTION_CONTENT = getDataTestSubjectSelector(RULE_PREVIEW_DEFINITION_CONTENT_TEST_ID); - export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_HEADER = getDataTestSubjectSelector(RULE_PREVIEW_SCHEDULE_HEADER_TEST_ID); export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_SCHEDULE_SECTION_CONTENT = getDataTestSubjectSelector(RULE_PREVIEW_SCHEDULE_CONTENT_TEST_ID); - export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER = getDataTestSubjectSelector( RULE_PREVIEW_FOOTER_TEST_ID ); +export const DOCUMENT_DETAILS_FLYOUT_RULE_PREVIEW_FOOTER_LINK = getDataTestSubjectSelector( + RULE_PREVIEW_NAVIGATE_TO_RULE_TEST_ID +); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts index de2a25749d6a9..abf9585e368ec 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel.ts @@ -21,6 +21,8 @@ import { import { COLLAPSE_DETAILS_BUTTON_TEST_ID, EXPAND_DETAILS_BUTTON_TEST_ID, + TITLE_HEADER_TEXT_TEST_ID, + TITLE_LINK_ICON_TEST_ID, } from '@kbn/security-solution-plugin/public/flyout/shared/components/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; @@ -28,8 +30,14 @@ export const DOCUMENT_DETAILS_FLYOUT_BODY = getDataTestSubjectSelector(FLYOUT_BO /* Header */ +export const DOCUMENT_DETAILS_FLYOUT_HEADER_ICON = getDataTestSubjectSelector( + TITLE_LINK_ICON_TEST_ID(FLYOUT_HEADER_TITLE_TEST_ID) +); export const DOCUMENT_DETAILS_FLYOUT_HEADER_TITLE = getDataTestSubjectSelector( - FLYOUT_HEADER_TITLE_TEST_ID + TITLE_HEADER_TEXT_TEST_ID(FLYOUT_HEADER_TITLE_TEST_ID) +); +export const DOCUMENT_DETAILS_FLYOUT_HEADER_LINK_ICON = getDataTestSubjectSelector( + TITLE_LINK_ICON_TEST_ID(FLYOUT_HEADER_TITLE_TEST_ID) ); export const DOCUMENT_DETAILS_FLYOUT_CLOSE_BUTTON = getDataTestSubjectSelector('euiFlyoutCloseButton'); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts index e53d1af68d455..66549fea944c6 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_json_tab.ts @@ -5,11 +5,14 @@ * 2.0. */ -import { JSON_TAB_CONTENT_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/right/tabs/test_ids'; -import { RIGHT_SECTION_TEST_ID } from '@kbn/expandable-flyout/src/components/test_ids'; +import { + JSON_TAB_CONTENT_TEST_ID, + JSON_TAB_COPY_TO_CLIPBOARD_BUTTON_TEST_ID, +} from '@kbn/security-solution-plugin/public/flyout/document_details/right/tabs/test_ids'; import { getDataTestSubjectSelector } from '../../helpers/common'; -export const DOCUMENT_DETAILS_FLYOUT_RIGHT_PANEL_CONTENT = - getDataTestSubjectSelector(RIGHT_SECTION_TEST_ID); +export const DOCUMENT_DETAILS_FLYOUT_JSON_TAB_COPY_TO_CLIPBOARD_BUTTON = getDataTestSubjectSelector( + JSON_TAB_COPY_TO_CLIPBOARD_BUTTON_TEST_ID +); export const DOCUMENT_DETAILS_FLYOUT_JSON_TAB_CONTENT = getDataTestSubjectSelector(JSON_TAB_CONTENT_TEST_ID); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts index 771180e1be13f..18c0bd9029ff6 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/expandable_flyout/alert_details_right_panel_table_tab.ts @@ -5,15 +5,9 @@ * 2.0. */ -import { TABLE_TAB_CONTENT_TEST_ID } from '@kbn/security-solution-plugin/public/flyout/document_details/right/tabs/test_ids'; import { getClassSelector, getDataTestSubjectSelector } from '../../helpers/common'; -export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_CONTENT = - getDataTestSubjectSelector(TABLE_TAB_CONTENT_TEST_ID); - export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_FILTER = getClassSelector('euiFieldSearch'); -export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_CLEAR_FILTER = - getDataTestSubjectSelector('clearSearchButton'); export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_ROW = getDataTestSubjectSelector( 'event-fields-table-row-@timestamp' ); @@ -22,6 +16,9 @@ export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_CELL = export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ID_ROW = getDataTestSubjectSelector( 'event-fields-table-row-_id' ); +export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_HOST_OS_BUILD_ROW = getDataTestSubjectSelector( + 'event-fields-table-row-host.os.build' +); const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_ACTIONS = 'actionItem-security-detailsFlyout-cellActions-'; export const DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_FILTER_IN = getDataTestSubjectSelector( diff --git a/x-pack/test/security_solution_cypress/cypress/screens/hosts/events.ts b/x-pack/test/security_solution_cypress/cypress/screens/hosts/events.ts index fd962a5e5bb93..5e516a54fd3b6 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/hosts/events.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/hosts/events.ts @@ -25,7 +25,8 @@ export const INSPECT_MODAL = '[data-test-subj="modal-inspect-euiModal"]'; export const INSPECT_QUERY = '[data-test-subj="events-viewer-panel"] [data-test-subj="inspect-icon-button"]'; -export const SERVER_SIDE_EVENT_COUNT = '[data-test-subj="server-side-event-count"]'; +export const SERVER_SIDE_EVENT_COUNT = + '[data-test-subj="events-viewer-panel"] [data-test-subj="server-side-event-count"]'; export const EVENT_VIEWER_CHECKBOX = '[data-test-subj="dataGridHeaderCell-checkbox-control-column"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/serverless_security_breadcrumbs.ts b/x-pack/test/security_solution_cypress/cypress/screens/serverless_security_breadcrumbs.ts new file mode 100644 index 0000000000000..8cc1be8613830 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/screens/serverless_security_breadcrumbs.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const EXPLORE_BREADCRUMB = + '[data-test-subj*="breadcrumb-deepLinkId-securitySolutionUI:explore"]'; +export const HOSTS_BREADCRUMB = + '[data-test-subj*="breadcrumb-deepLinkId-securitySolutionUI:hosts"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts b/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts index e1dc4c952eac7..02ebebb6c10ea 100644 --- a/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts +++ b/x-pack/test/security_solution_cypress/cypress/support/setup_users.ts @@ -6,7 +6,7 @@ */ import { Role } from '@kbn/security-plugin/common'; -import { rootRequest } from '../tasks/common'; +import { rootRequest } from '../tasks/api_calls/common'; /** * Utility function creates roles and corresponding users per each role with names diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/alerts.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/alerts.ts index 43d9952b9b376..3b9c0612a0724 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/alerts.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/alerts.ts @@ -9,7 +9,7 @@ import { RuleObjectId, RuleSignatureId, } from '@kbn/security-solution-plugin/common/api/detection_engine'; -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const DEFAULT_ALERTS_INDEX_PATTERN = '.alerts-security.alerts-*'; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/common.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/common.ts new file mode 100644 index 0000000000000..775b4c5a8964b --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/common.ts @@ -0,0 +1,264 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DATA_VIEW_PATH, INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { ELASTICSEARCH_PASSWORD, ELASTICSEARCH_USERNAME } from '../../env_var_names_constants'; +import { deleteAllDocuments } from './elasticsearch'; +import { DEFAULT_ALERTS_INDEX_PATTERN } from './alerts'; + +export const API_AUTH = Object.freeze({ + user: Cypress.env(ELASTICSEARCH_USERNAME), + pass: Cypress.env(ELASTICSEARCH_PASSWORD), +}); + +export const API_HEADERS = Object.freeze({ + 'kbn-xsrf': 'cypress-creds', + 'x-elastic-internal-origin': 'security-solution', + [ELASTIC_HTTP_VERSION_HEADER]: [INITIAL_REST_VERSION], +}); + +export const rootRequest = ({ + headers: optionHeaders, + ...restOptions +}: Partial): Cypress.Chainable> => + cy.request({ + auth: API_AUTH, + headers: { + ...API_HEADERS, + ...(optionHeaders || {}), + }, + ...restOptions, + }); + +export const deleteAlertsAndRules = () => { + cy.log('Delete all alerts and rules'); + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; + + rootRequest({ + method: 'POST', + url: '/api/detection_engine/rules/_bulk_action', + body: { + query: '', + action: 'delete', + }, + failOnStatusCode: false, + timeout: 300000, + }); + + rootRequest({ + method: 'POST', + url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, + body: { + query: { + bool: { + filter: [ + { + match: { + type: 'alert', + }, + }, + ], + }, + }, + }, + }); + + deleteAllDocuments(`.lists-*,.items-*,${DEFAULT_ALERTS_INDEX_PATTERN}`); +}; + +export const deleteExceptionLists = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; + rootRequest({ + method: 'POST', + url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, + body: { + query: { + bool: { + filter: [ + { + match: { + type: 'exception-list', + }, + }, + ], + }, + }, + }, + }); +}; + +export const deleteEndpointExceptionList = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; + rootRequest({ + method: 'POST', + url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, + body: { + query: { + bool: { + filter: [ + { + match: { + type: 'exception-list-agnostic', + }, + }, + ], + }, + }, + }, + }); +}; + +export const deleteTimelines = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; + rootRequest({ + method: 'POST', + url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, + body: { + query: { + bool: { + filter: [ + { + match: { + type: 'siem-ui-timeline', + }, + }, + ], + }, + }, + }, + }); +}; + +export const deleteAlertsIndex = () => { + rootRequest({ + method: 'POST', + url: '/api/index_management/indices/delete', + body: { indices: ['.internal.alerts-security.alerts-default-000001'] }, + failOnStatusCode: false, + }); +}; + +export const deleteAllCasesItems = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_alerting_cases_\*`; + rootRequest({ + method: 'POST', + url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, + body: { + query: { + bool: { + filter: [ + { + bool: { + should: [ + { + term: { + type: 'cases', + }, + }, + { + term: { + type: 'cases-configure', + }, + }, + { + term: { + type: 'cases-comments', + }, + }, + { + term: { + type: 'cases-user-action', + }, + }, + { + term: { + type: 'cases-connector-mappings', + }, + }, + ], + }, + }, + ], + }, + }, + }, + }); +}; + +export const deleteConnectors = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_alerting_cases_\*`; + rootRequest({ + method: 'POST', + url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, + body: { + query: { + bool: { + filter: [ + { + match: { + type: 'action', + }, + }, + ], + }, + }, + }, + }); +}; + +export const deletePrebuiltRulesAssets = () => { + const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; + rootRequest({ + method: 'POST', + url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, + body: { + query: { + bool: { + filter: [ + { + match: { + type: 'security-rule', + }, + }, + ], + }, + }, + }, + }); +}; + +export const postDataView = (indexPattern: string, name?: string, id?: string) => { + rootRequest({ + method: 'POST', + url: DATA_VIEW_PATH, + body: { + data_view: { + id: id || indexPattern, + name: name || indexPattern, + fieldAttrs: '{}', + title: indexPattern, + timeFieldName: '@timestamp', + }, + }, + failOnStatusCode: false, + }); +}; + +export const deleteDataView = (dataViewId: string) => { + rootRequest({ + method: 'POST', + url: 'api/content_management/rpc/delete', + body: { + contentTypeId: 'index-pattern', + id: dataViewId, + options: { force: true }, + version: 1, + }, + failOnStatusCode: false, + }); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/elasticsearch.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/elasticsearch.ts index d94049f14c8a1..6dc3622f72a03 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/elasticsearch.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/elasticsearch.ts @@ -4,17 +4,12 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const deleteIndex = (index: string) => { rootRequest({ method: 'DELETE', url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); }; @@ -23,11 +18,6 @@ export const deleteDataStream = (dataStreamName: string) => { rootRequest({ method: 'DELETE', url: `${Cypress.env('ELASTICSEARCH_URL')}/_data_stream/${dataStreamName}`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); }; @@ -40,11 +30,6 @@ export const deleteAllDocuments = (target: string) => { url: `${Cypress.env( 'ELASTICSEARCH_URL' )}/${target}/_delete_by_query?conflicts=proceed&scroll_size=10000&refresh`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, body: { query: { match_all: {}, @@ -57,11 +42,6 @@ export const createIndex = (indexName: string, properties: Record({ method: 'GET', url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}/_search`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }).then((response) => { if (response.status !== 200) { @@ -110,11 +80,6 @@ export const refreshIndex = (index: string) => { rootRequest({ method: 'POST', url: `${Cypress.env('ELASTICSEARCH_URL')}/${index}/_refresh`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }).then((response) => { if (response.status !== 200) { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/exceptions.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/exceptions.ts index 8b7d85b7ebf4d..4e0afa7416da0 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/exceptions.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/exceptions.ts @@ -13,17 +13,12 @@ import type { } from '@kbn/securitysolution-io-ts-list-types'; import { ENDPOINT_LIST_ITEM_URL, ENDPOINT_LIST_URL } from '@kbn/securitysolution-list-constants'; import type { ExceptionList, ExceptionListItem, RuleExceptionItem } from '../../objects/exception'; -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const createEndpointExceptionList = () => rootRequest({ method: 'POST', url: ENDPOINT_LIST_URL, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); export const createEndpointExceptionListItem = (item: CreateEndpointListItemSchema) => @@ -31,11 +26,6 @@ export const createEndpointExceptionListItem = (item: CreateEndpointListItemSche method: 'POST', url: ENDPOINT_LIST_ITEM_URL, body: item, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); export const createExceptionList = ( @@ -51,11 +41,6 @@ export const createExceptionList = ( name: exceptionList.name, type: exceptionList.type, }, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); @@ -88,11 +73,6 @@ export const createExceptionListItem = ( ], expire_time: exceptionListItem?.expire_time, }, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); @@ -103,11 +83,6 @@ export const createRuleExceptionItem = (ruleId: string, exceptionListItems: Rule body: { items: exceptionListItems, }, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); @@ -122,11 +97,6 @@ export const updateExceptionListItem = ( item_id: exceptionListItemId, ...exceptionListItemUpdate, }, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); @@ -134,10 +104,5 @@ export const deleteExceptionList = (listId: string, namespaceType: string) => rootRequest({ method: 'DELETE', url: `/api/exception_lists?list_id=${listId}&namespace_type=${namespaceType}`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/fleet.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/fleet.ts index 5295b033fc7cf..d77361c95ebdd 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/fleet.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/fleet.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { rootRequest } from '../common'; +import { rootRequest } from './common'; /** * Deletes all existing Fleet packages, package policies and agent policies. @@ -25,21 +25,11 @@ const deleteAgentPolicies = () => { return rootRequest<{ items: Array<{ id: string }> }>({ method: 'GET', url: 'api/fleet/agent_policies', - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }).then((response) => { response.body.items.forEach((item: { id: string }) => { rootRequest({ method: 'POST', url: `api/fleet/agent_policies/delete`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, body: { agentPolicyId: item.id, }, @@ -52,20 +42,10 @@ const deletePackagePolicies = () => { return rootRequest<{ items: Array<{ id: string }> }>({ method: 'GET', url: 'api/fleet/package_policies', - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }).then((response) => { rootRequest({ method: 'POST', url: `api/fleet/package_policies/delete`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, body: { packagePolicyIds: response.body.items.map((item: { id: string }) => item.id), }, @@ -77,22 +57,12 @@ const deletePackages = () => { return rootRequest<{ items: Array<{ status: string; name: string; version: string }> }>({ method: 'GET', url: 'api/fleet/epm/packages', - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }).then((response) => { response.body.items.forEach((item) => { if (item.status === 'installed') { rootRequest({ method: 'DELETE', url: `api/fleet/epm/packages/${item.name}/${item.version}`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); } }); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/integrations.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/integrations.ts similarity index 83% rename from x-pack/test/security_solution_cypress/cypress/tasks/integrations.ts rename to x-pack/test/security_solution_cypress/cypress/tasks/api_calls/integrations.ts index eeef97682b9c7..4e212d4b8eb34 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/integrations.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/integrations.ts @@ -56,11 +56,6 @@ export function installIntegrations({ packages, force: true, }, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); // Install agent and package policies @@ -68,11 +63,6 @@ export function installIntegrations({ method: 'POST', url: `${AGENT_POLICY_API_ROUTES.CREATE_PATTERN}?sys_monitoring=true`, body: agentPolicy, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }).then((response) => { const packagePolicyWithAgentPolicyId: PackagePolicy = { ...packagePolicy, @@ -83,11 +73,6 @@ export function installIntegrations({ method: 'POST', url: PACKAGE_POLICY_API_ROUTES.CREATE_PATTERN, body: packagePolicyWithAgentPolicyId, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); }); } diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts index 2c982adad5275..27d5063ce30df 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/kibana_advanced_settings.ts @@ -7,14 +7,13 @@ import { SECURITY_SOLUTION_SHOW_RELATED_INTEGRATIONS_ID } from '@kbn/management-settings-ids'; import { ENABLE_EXPANDABLE_FLYOUT_SETTING } from '@kbn/security-solution-plugin/common/constants'; -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const setKibanaSetting = (key: string, value: boolean | number | string) => { rootRequest({ method: 'POST', url: 'internal/kibana/settings', body: { changes: { [key]: value } }, - headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' }, }); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/machine_learning.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/machine_learning.ts index afb468876c5f1..f03d6edadbc18 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/machine_learning.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/machine_learning.ts @@ -7,17 +7,12 @@ import { ML_INTERNAL_BASE_PATH } from '@kbn/ml-plugin/common/constants/app'; import type { Module } from '@kbn/ml-plugin/common/types/modules'; -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const fetchMachineLearningModules = () => { return rootRequest({ method: 'GET', url: `${ML_INTERNAL_BASE_PATH}/modules/get_module`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': 1, - }, failOnStatusCode: false, }); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/prebuilt_rules.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/prebuilt_rules.ts index 98b9a884e683a..273491ebd2efe 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/prebuilt_rules.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/prebuilt_rules.ts @@ -13,17 +13,12 @@ import { ELASTIC_SECURITY_RULE_ID } from '@kbn/security-solution-plugin/common/d import type { PrePackagedRulesStatusResponse } from '@kbn/security-solution-plugin/public/detection_engine/rule_management/logic/types'; import { getPrebuiltRuleWithExceptionsMock } from '@kbn/security-solution-plugin/server/lib/detection_engine/prebuilt_rules/mocks'; import { createRuleAssetSavedObject } from '../../helpers/rules'; -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const getPrebuiltRulesStatus = () => { return rootRequest({ method: 'GET', url: 'api/detection_engine/rules/prepackaged/_status', - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); }; @@ -43,14 +38,12 @@ export const installAllPrebuiltRulesRequest = () => rootRequest({ method: 'POST', url: PERFORM_RULE_INSTALLATION_URL, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '1', - }, body: { mode: 'ALL_RULES', }, + headers: { + 'elastic-api-version': '1', + }, }); /* Install specific prebuilt rules. Should be available as security-rule saved objects @@ -63,11 +56,6 @@ export const installSpecificPrebuiltRulesRequest = (rules: Array({ method: 'POST', url: PERFORM_RULE_INSTALLATION_URL, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '1', - }, body: { mode: 'SPECIFIC_RULES', rules: rules.map((rule) => ({ @@ -75,6 +63,9 @@ export const installSpecificPrebuiltRulesRequest = (rules: Array { @@ -128,8 +119,6 @@ export const createNewRuleAsset = ({ method: 'PUT', url, headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', 'Content-Type': 'application/json', }, failOnStatusCode: false, @@ -182,7 +171,7 @@ export const bulkCreateRuleAssets = ({ return rootRequest({ method: 'POST', url, - headers: { 'kbn-xsrf': 'cypress-creds', 'Content-Type': 'application/json' }, + headers: { 'Content-Type': 'application/json' }, failOnStatusCode: false, body: bulkIndexRequestBody, }).then((response) => response.status === 200); @@ -197,8 +186,6 @@ export const getRuleAssets = (index: string | undefined = '.kibana_security_solu method: 'GET', url, headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', 'Content-Type': 'application/json', }, failOnStatusCode: false, diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/rules.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/rules.ts index 254d93cac5078..5f89e57ff81c6 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/rules.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/rules.ts @@ -16,16 +16,11 @@ import type { } from '@kbn/security-solution-plugin/common/api/detection_engine'; import type { FetchRulesResponse } from '@kbn/security-solution-plugin/public/detection_engine/rule_management/logic/types'; import { internalAlertingSnoozeRule } from '../../urls/routes'; -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const findAllRules = () => { return rootRequest({ url: DETECTION_ENGINE_RULES_URL_FIND, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); }; @@ -36,11 +31,6 @@ export const createRule = ( method: 'POST', url: DETECTION_ENGINE_RULES_URL, body: rule, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); }; @@ -52,7 +42,7 @@ export const createRule = ( * @param duration Snooze duration in milliseconds, -1 for indefinite */ export const snoozeRule = (id: string, duration: number): Cypress.Chainable => - cy.request({ + rootRequest({ method: 'POST', url: internalAlertingSnoozeRule(id), body: { @@ -61,7 +51,6 @@ export const snoozeRule = (id: string, duration: number): Cypress.Chainable => rRule: { dtstart: new Date().toISOString(), count: 1, tzid: moment().format('zz') }, }, }, - headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' }, failOnStatusCode: false, }); @@ -69,11 +58,6 @@ export const deleteCustomRule = (ruleId = '1') => { rootRequest({ method: 'DELETE', url: `api/detection_engine/rules?rule_id=${ruleId}`, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, failOnStatusCode: false, }); }; @@ -89,10 +73,7 @@ export const importRule = (ndjsonPath: string) => { url: 'api/detection_engine/rules/_import', method: 'POST', headers: { - 'kbn-xsrf': 'cypress-creds', 'content-type': 'multipart/form-data', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', }, body: formdata, }) @@ -108,10 +89,7 @@ export const waitForRulesToFinishExecution = (ruleIds: string[], afterDate?: Dat method: 'GET', url: DETECTION_ENGINE_RULES_URL_FIND, headers: { - 'kbn-xsrf': 'cypress-creds', 'content-type': 'multipart/form-data', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', }, }).then((response) => { const areAllRulesFinished = ruleIds.every((ruleId) => diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/saved_queries.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/saved_queries.ts index 88049b20d6d5b..0ec356e83727c 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/saved_queries.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/saved_queries.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import type { SavedQuery } from '@kbn/data-plugin/public'; import { SAVED_QUERY_BASE_URL } from '@kbn/data-plugin/common/constants'; -import { rootRequest } from '../common'; +import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; +import { rootRequest } from './common'; export const createSavedQuery = ( title: string, @@ -37,9 +37,7 @@ export const createSavedQuery = ( ], }, headers: { - 'kbn-xsrf': 'cypress-creds', [ELASTIC_HTTP_VERSION_HEADER]: '1', - 'x-elastic-internal-origin': 'security-solution', }, }); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/sourcerer.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/sourcerer.ts new file mode 100644 index 0000000000000..a266678ee95d9 --- /dev/null +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/sourcerer.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 { rootRequest } from './common'; + +export const deleteRuntimeField = (dataView: string, fieldName: string) => { + const deleteRuntimeFieldPath = `/api/data_views/data_view/${dataView}/runtime_field/${fieldName}`; + + rootRequest({ + url: deleteRuntimeFieldPath, + method: 'DELETE', + failOnStatusCode: false, + }); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts index 9b6a0c98db40c..a4edcc54752de 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/api_calls/timelines.ts @@ -7,7 +7,7 @@ import type { TimelineResponse } from '@kbn/security-solution-plugin/common/api/timeline'; import type { CompleteTimeline } from '../../objects/timeline'; -import { rootRequest } from '../common'; +import { rootRequest } from './common'; export const createTimeline = (timeline: CompleteTimeline) => rootRequest({ @@ -56,11 +56,6 @@ export const createTimeline = (timeline: CompleteTimeline) => : {}), }, }, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - 'elastic-api-version': '2023-10-31', - }, }); export const createTimelineTemplate = (timeline: CompleteTimeline) => @@ -106,14 +101,12 @@ export const createTimelineTemplate = (timeline: CompleteTimeline) => savedQueryId: null, }, }, - headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' }, }); export const loadPrepackagedTimelineTemplates = () => rootRequest({ method: 'POST', url: 'api/timeline/_prepackaged', - headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' }, }); export const favoriteTimeline = ({ @@ -136,5 +129,4 @@ export const favoriteTimeline = ({ templateTimelineId: templateTimelineId || null, templateTimelineVersion: templateTimelineVersion || null, }, - headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' }, }); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/common.ts b/x-pack/test/security_solution_cypress/cypress/tasks/common.ts index a9b019fc1f6f6..b7d0062cd5d02 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/common.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/common.ts @@ -5,13 +5,8 @@ * 2.0. */ -import { DATA_VIEW_PATH, INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; -import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { KIBANA_LOADING_ICON } from '../screens/security_header'; import { EUI_BASIC_TABLE_LOADING } from '../screens/common/controls'; -import { deleteAllDocuments } from './api_calls/elasticsearch'; -import { DEFAULT_ALERTS_INDEX_PATTERN } from './api_calls/alerts'; -import { ELASTICSEARCH_PASSWORD, ELASTICSEARCH_USERNAME } from '../env_var_names_constants'; const primaryButton = 0; @@ -21,30 +16,6 @@ const primaryButton = 0; */ const dndSloppyClickDetectionThreshold = 5; -export const API_AUTH = Object.freeze({ - user: Cypress.env(ELASTICSEARCH_USERNAME), - pass: Cypress.env(ELASTICSEARCH_PASSWORD), -}); - -export const API_HEADERS = Object.freeze({ - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - [ELASTIC_HTTP_VERSION_HEADER]: [INITIAL_REST_VERSION], -}); - -export const rootRequest = ({ - headers: optionHeaders, - ...restOptions -}: Partial): Cypress.Chainable> => - cy.request({ - auth: API_AUTH, - headers: { - ...API_HEADERS, - ...(optionHeaders || {}), - }, - ...restOptions, - }); - /** Starts dragging the subject */ export const drag = (subject: JQuery) => { const subjectLocation = subject[0].getBoundingClientRect(); @@ -99,243 +70,6 @@ export const resetRulesTableState = () => { clearSessionStorage(); }; -export const deleteAlertsAndRules = () => { - cy.log('Delete all alerts and rules'); - const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; - - rootRequest({ - method: 'POST', - url: '/api/detection_engine/rules/_bulk_action', - body: { - query: '', - action: 'delete', - }, - failOnStatusCode: false, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - }, - timeout: 300000, - }); - - rootRequest({ - method: 'POST', - url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, - body: { - query: { - bool: { - filter: [ - { - match: { - type: 'alert', - }, - }, - ], - }, - }, - }, - }); - - deleteAllDocuments(`.lists-*,.items-*,${DEFAULT_ALERTS_INDEX_PATTERN}`); -}; - -export const deleteExceptionLists = () => { - const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; - rootRequest({ - method: 'POST', - url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, - body: { - query: { - bool: { - filter: [ - { - match: { - type: 'exception-list', - }, - }, - ], - }, - }, - }, - }); -}; - -export const deleteEndpointExceptionList = () => { - const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; - rootRequest({ - method: 'POST', - url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, - body: { - query: { - bool: { - filter: [ - { - match: { - type: 'exception-list-agnostic', - }, - }, - ], - }, - }, - }, - }); -}; - -export const deleteTimelines = () => { - const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; - rootRequest({ - method: 'POST', - url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, - body: { - query: { - bool: { - filter: [ - { - match: { - type: 'siem-ui-timeline', - }, - }, - ], - }, - }, - }, - }); -}; - -export const deleteAlertsIndex = () => { - rootRequest({ - method: 'POST', - url: '/api/index_management/indices/delete', - body: { indices: ['.internal.alerts-security.alerts-default-000001'] }, - failOnStatusCode: false, - }); -}; - -export const deleteAllCasesItems = () => { - const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_alerting_cases_\*`; - rootRequest({ - method: 'POST', - url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, - body: { - query: { - bool: { - filter: [ - { - bool: { - should: [ - { - term: { - type: 'cases', - }, - }, - { - term: { - type: 'cases-configure', - }, - }, - { - term: { - type: 'cases-comments', - }, - }, - { - term: { - type: 'cases-user-action', - }, - }, - { - term: { - type: 'cases-connector-mappings', - }, - }, - ], - }, - }, - ], - }, - }, - }, - }); -}; - -export const deleteConnectors = () => { - const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_alerting_cases_\*`; - rootRequest({ - method: 'POST', - url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, - body: { - query: { - bool: { - filter: [ - { - match: { - type: 'action', - }, - }, - ], - }, - }, - }, - }); -}; - -export const deletePrebuiltRulesAssets = () => { - const kibanaIndexUrl = `${Cypress.env('ELASTICSEARCH_URL')}/.kibana_\*`; - rootRequest({ - method: 'POST', - url: `${kibanaIndexUrl}/_delete_by_query?conflicts=proceed&refresh`, - body: { - query: { - bool: { - filter: [ - { - match: { - type: 'security-rule', - }, - }, - ], - }, - }, - }, - }); -}; - -export const postDataView = (indexPattern: string, name?: string, id?: string) => { - rootRequest({ - method: 'POST', - url: DATA_VIEW_PATH, - body: { - data_view: { - id: id || indexPattern, - name: name || indexPattern, - fieldAttrs: '{}', - title: indexPattern, - timeFieldName: '@timestamp', - }, - }, - headers: { - 'kbn-xsrf': 'cypress-creds', - 'x-elastic-internal-origin': 'security-solution', - }, - failOnStatusCode: false, - }); -}; - -export const deleteDataView = (dataViewId: string) => { - rootRequest({ - method: 'POST', - url: 'api/content_management/rpc/delete', - headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' }, - body: { - contentTypeId: 'index-pattern', - id: dataViewId, - options: { force: true }, - version: 1, - }, - failOnStatusCode: false, - }); -}; - export const scrollToBottom = () => cy.scrollTo('bottom'); export const waitForWelcomePanelToBeLoaded = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_case.ts b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_case.ts index 65da5e0a7d5fd..d93788c9750d9 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/create_new_case.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/create_new_case.ts @@ -80,7 +80,7 @@ export const attachTimeline = (newCase: TestCase) => { }, { interval: 500, timeout: 12000 } ); - cy.get(TIMELINE).eq(1).click(); + cy.get(TIMELINE).first().click(); }; export const createCase = () => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/exceptions_table.ts b/x-pack/test/security_solution_cypress/cypress/tasks/exceptions_table.ts index c3af909131cdf..710526bdff18d 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/exceptions_table.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/exceptions_table.ts @@ -5,7 +5,12 @@ * 2.0. */ -import { INPUT_FILE, TOASTER, TOASTER_BODY } from '../screens/alerts_detection_rules'; +import { + INPUT_FILE, + TOASTER, + TOASTER_BODY, + TOASTER_CLOSE_ICON, +} from '../screens/alerts_detection_rules'; import { EXCEPTIONS_TABLE, EXCEPTIONS_TABLE_SEARCH, @@ -70,6 +75,12 @@ export const exportExceptionList = (listId: string) => { .click(); cy.get(EXCEPTIONS_TABLE_EXPORT_MODAL_BTN).first().click(); cy.get(EXCEPTIONS_TABLE_EXPIRED_EXCEPTION_ITEMS_MODAL_CONFIRM_BTN).first().click(); + cy.root().then(($page) => { + const element = $page.find(TOASTER_CLOSE_ICON); + if (element.length > 0) { + closeErrorToast(); + } + }); }; export const assertNumberLinkedRules = (listId: string, numberOfRulesAsString: string) => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts index abc08842c2fc6..cf023e4bd9a68 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_left_panel_correlations_tab.ts @@ -14,7 +14,3 @@ export const openCorrelationsTab = () => { cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON).scrollIntoView(); cy.get(DOCUMENT_DETAILS_FLYOUT_INSIGHTS_TAB_CORRELATIONS_BUTTON).should('be.visible').click(); }; - -export const expandCorrelationsSection = (sectionSelector: string) => { - cy.get(`${sectionSelector} button`).should('be.visible').click(); -}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_table_tab.ts b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_table_tab.ts index fe578fd145179..0e87a938d6277 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_table_tab.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout/alert_details_right_panel_table_tab.ts @@ -7,7 +7,6 @@ import { DOCUMENT_DETAILS_FLYOUT_BODY } from '../../screens/expandable_flyout/alert_details_right_panel'; import { - DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_CLEAR_FILTER, DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_FILTER, DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_ADD_TO_TIMELINE, DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_FILTER_IN, @@ -24,14 +23,6 @@ export const filterTableTabTable = (filterValue: string) => cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_FILTER).type(filterValue); }); -/** - * Clear table filter under the Table tab in the alert details expandable flyout right section - */ -export const clearFilterTableTabTable = () => - cy.get(DOCUMENT_DETAILS_FLYOUT_BODY).within(() => { - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_CLEAR_FILTER).click(); - }); - /** * Filter In action in the first table row under the Table tab in the alert details expandable flyout right section */ @@ -65,11 +56,3 @@ export const toggleColumnTableTabTable = () => { cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_TIMESTAMP_CELL).first().realHover(); cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_TOGGLE_COLUMN).click(); }; - -/** - * Clear filters in the alert page KQL bar - */ -export const clearFilters = () => - cy.get(DOCUMENT_DETAILS_FLYOUT_BODY).within(() => { - cy.get(DOCUMENT_DETAILS_FLYOUT_TABLE_TAB_ROW_CELL_FILTER_OUT).first().click(); - }); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts index 07a91a903536b..4df97fd86461d 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts @@ -12,13 +12,13 @@ import { LoginState } from '@kbn/security-plugin/common/login_state'; import type { SecurityRoleName } from '@kbn/security-solution-plugin/common/test'; import { KNOWN_SERVERLESS_ROLE_DEFINITIONS } from '@kbn/security-solution-plugin/common/test'; import { LOGOUT_URL } from '../urls/navigation'; -import { rootRequest } from './common'; import { CLOUD_SERVERLESS, ELASTICSEARCH_PASSWORD, ELASTICSEARCH_USERNAME, IS_SERVERLESS, } from '../env_var_names_constants'; +import { API_HEADERS, rootRequest } from './api_calls/common'; /** * Credentials in the `kibana.dev.yml` config file will be used to authenticate @@ -210,7 +210,7 @@ const loginWithUsernameAndPassword = (username: string, password: string): void (provider) => provider.type === 'basic' ); - return rootRequest({ + cy.request({ url: `${baseUrl}/internal/security/login`, method: 'POST', body: { @@ -219,6 +219,7 @@ const loginWithUsernameAndPassword = (username: string, password: string): void currentURL: '/', params: { username, password }, }, + headers: API_HEADERS, }); }); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.ts b/x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.ts index 90c380e8f88b4..8f5e597f375e7 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/serverless/navigation.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { ALERTS } from '../../screens/serverless_security_header'; +import { ALERTS, DISCOVER, EXPLORE } from '../../screens/serverless_security_header'; +import { + EXPLORE_BREADCRUMB, + HOSTS_BREADCRUMB, +} from '../../screens/serverless_security_breadcrumbs'; const navigateTo = (page: string) => { cy.get(page).click(); @@ -14,3 +18,19 @@ const navigateTo = (page: string) => { export const navigateToAlertsPageInServerless = () => { navigateTo(ALERTS); }; + +export const navigateToDiscoverPageInServerless = () => { + navigateTo(DISCOVER); +}; + +export const navigateToExplorePageInServerless = () => { + navigateTo(EXPLORE); +}; + +export const navigateToHostsUsingBreadcrumb = () => { + cy.get(HOSTS_BREADCRUMB).click(); +}; + +export const navigateToExploreUsingBreadcrumb = () => { + cy.get(EXPLORE_BREADCRUMB).click(); +}; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts b/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts index 39a6ed99b1b2e..a534fb3e6d3d8 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/sourcerer.ts @@ -9,7 +9,6 @@ import { DEFAULT_ALERTS_INDEX } from '@kbn/security-solution-plugin/common/const import { HOSTS_STAT, SOURCERER } from '../screens/sourcerer'; import { hostsUrl } from '../urls/navigation'; import { openTimelineUsingToggle } from './security_main'; -import { rootRequest } from './common'; import { visitWithTimeRange } from './navigation'; export const openSourcerer = (sourcererScope?: string) => { @@ -130,14 +129,3 @@ export const refreshUntilAlertsIndexExists = async () => { { interval: 500, timeout: 12000 } ); }; - -export const deleteRuntimeField = (dataView: string, fieldName: string) => { - const deleteRuntimeFieldPath = `/api/data_views/data_view/${dataView}/runtime_field/${fieldName}`; - - rootRequest({ - url: deleteRuntimeFieldPath, - method: 'DELETE', - headers: { 'kbn-xsrf': 'cypress-creds', 'x-elastic-internal-origin': 'security-solution' }, - failOnStatusCode: false, - }); -}; diff --git a/x-pack/test/security_solution_cypress/cypress/tsconfig.json b/x-pack/test/security_solution_cypress/cypress/tsconfig.json index ad3ad00e19af6..3e3563fa2e97b 100644 --- a/x-pack/test/security_solution_cypress/cypress/tsconfig.json +++ b/x-pack/test/security_solution_cypress/cypress/tsconfig.json @@ -33,7 +33,6 @@ "@kbn/cases-components", "@kbn/security-solution-plugin", "@kbn/dev-utils", - "@kbn/expandable-flyout", "@kbn/config-schema", "@kbn/lists-plugin", "@kbn/securitysolution-list-constants", diff --git a/x-pack/test/security_solution_cypress/serverless_config.ts b/x-pack/test/security_solution_cypress/serverless_config.ts index f302617f0e740..d0ee1613f6e4c 100644 --- a/x-pack/test/security_solution_cypress/serverless_config.ts +++ b/x-pack/test/security_solution_cypress/serverless_config.ts @@ -34,9 +34,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { { product_line: 'endpoint', product_tier: 'complete' }, { product_line: 'cloud', product_tier: 'complete' }, ])}`, - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'disableTimelineSaveTour', - ])}`, ], }, testRunner: SecuritySolutionConfigurableCypressTestRunner, diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts index 061e8936bf241..3c31e714ae10b 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_permissions.ts @@ -17,7 +17,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const testSubjects = getService('testSubjects'); const endpointTestResources = getService('endpointTestResources'); - describe('Endpoint permissions:', function () { + // FLAKY: https://github.com/elastic/kibana/issues/171649 + // FLAKY: https://github.com/elastic/kibana/issues/171650 + describe.skip('Endpoint permissions:', function () { targetTags(this, ['@ess']); let indexedData: IndexedHostsAndAlertsResponse; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts b/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts index 9fcc87ceffa81..45dbff31170f8 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/artifact_entries_list.ts @@ -52,8 +52,19 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { .set('kbn-xsrf', 'true'); }; + // Several flaky tests from this file in serverless, hence @skipInServerless + // - https://github.com/elastic/kibana/issues?q=is%3Aissue+is%3Aopen+X-pack+endpoint+integrations++artifact+entries+list + // https://github.com/elastic/kibana/issues/171475 + // https://github.com/elastic/kibana/issues/171476 + // https://github.com/elastic/kibana/issues/171477 + // https://github.com/elastic/kibana/issues/171478 + // https://github.com/elastic/kibana/issues/171487 + // https://github.com/elastic/kibana/issues/171488 + // https://github.com/elastic/kibana/issues/171489 + // https://github.com/elastic/kibana/issues/171491 + // https://github.com/elastic/kibana/issues/171492 describe('For each artifact list under management', function () { - targetTags(this, ['@ess', '@serverless']); + targetTags(this, ['@ess', '@serverless', '@skipInServerless']); this.timeout(60_000 * 5); let indexedData: IndexedHostsAndAlertsResponse; @@ -235,7 +246,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }; for (const testData of getArtifactsListTestsData()) { - describe(`When on the ${testData.title} entries list`, function () { + // FLAKY: https://github.com/elastic/kibana/issues/171489 + // FLAKY: https://github.com/elastic/kibana/issues/171475 + describe.skip(`When on the ${testData.title} entries list`, function () { beforeEach(async () => { policyInfo = await policyTestResources.createPolicy(); await removeAllArtifacts(); @@ -321,7 +334,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); } - describe('Should check artifacts are correctly generated when multiple entries', function () { + // FLAKY: https://github.com/elastic/kibana/issues/171476 + describe.skip('Should check artifacts are correctly generated when multiple entries', function () { let firstPolicy: PolicyTestResourceInfo; let secondPolicy: PolicyTestResourceInfo; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts index b48c64b5e9dd4..a2b1feaabd7cd 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/policy_details.ts @@ -28,7 +28,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const endpointTestResources = getService('endpointTestResources'); const retry = getService('retry'); - describe('When on the Endpoint Policy Details Page', function () { + // FLAKY: https://github.com/elastic/kibana/issues/171653 + // FLAKY: https://github.com/elastic/kibana/issues/171654 + describe.skip('When on the Endpoint Policy Details Page', function () { targetTags(this, ['@ess', '@serverless']); let indexedData: IndexedHostsAndAlertsResponse; diff --git a/x-pack/test/security_solution_endpoint/apps/integrations/trusted_apps_list.ts b/x-pack/test/security_solution_endpoint/apps/integrations/trusted_apps_list.ts index e00dde08d58fb..1d48a415b1577 100644 --- a/x-pack/test/security_solution_endpoint/apps/integrations/trusted_apps_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/integrations/trusted_apps_list.ts @@ -16,7 +16,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const browser = getService('browser'); const endpointTestResources = getService('endpointTestResources'); - describe('When on the Trusted Apps list', function () { + // FLAKY: https://github.com/elastic/kibana/issues/171481 + describe.skip('When on the Trusted Apps list', function () { targetTags(this, ['@ess', '@serverless']); let indexedData: IndexedHostsAndAlertsResponse; @@ -33,7 +34,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await testSubjects.missingOrFail('header-page-title'); }); - it('should be able to add a new trusted app and remove it', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/171481 + it.skip('should be able to add a new trusted app and remove it', async () => { const SHA256 = 'A4370C0CF81686C0B696FA6261c9d3e0d810ae704ab8301839dffd5d5112f476'; // Add it diff --git a/x-pack/test/security_solution_endpoint/config.base.ts b/x-pack/test/security_solution_endpoint/config.base.ts index d75458a4c581d..e3be9a2a6934b 100644 --- a/x-pack/test/security_solution_endpoint/config.base.ts +++ b/x-pack/test/security_solution_endpoint/config.base.ts @@ -90,10 +90,6 @@ export const generateConfig = async ({ `--xpack.fleet.packages.0.version=latest`, // this will be removed in 8.7 when the file upload feature is released `--xpack.fleet.enableExperimental.0=diagnosticFileUploadEnabled`, - // disable a tour that prevents tests from passing - `--xpack.securitySolution.enableExperimental=${JSON.stringify([ - 'disableTimelineSaveTour', - ])}`, ...kbnServerArgs, ], }, diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts index 7434f46ca35be..79f964f8c4271 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_authz.ts @@ -40,7 +40,12 @@ export default function ({ getService }: FtrProviderContext) { body: Record | undefined; } - describe('When attempting to call an endpoint api', function () { + // Flaky: + // https://github.com/elastic/kibana/issues/171655 + // https://github.com/elastic/kibana/issues/171656 + // https://github.com/elastic/kibana/issues/171647 + // https://github.com/elastic/kibana/issues/171648 + describe.skip('When attempting to call an endpoint api', function () { targetTags(this, ['@ess', '@serverless']); let indexedData: IndexedHostsAndAlertsResponse; diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts index f904539dae231..8d297f82befee 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/endpoint_response_actions/execute.ts @@ -16,7 +16,9 @@ export default function ({ getService }: FtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); const endpointTestResources = getService('endpointTestResources'); - describe('Endpoint `execute` response action', function () { + // FLAKY: https://github.com/elastic/kibana/issues/171667 + // FLAKY: https://github.com/elastic/kibana/issues/171666 + describe.skip('Endpoint `execute` response action', function () { targetTags(this, ['@ess', '@serverless']); let indexedData: IndexedHostsAndAlertsResponse; diff --git a/x-pack/test/upgrade/apps/dashboard/dashboard_smoke_tests.ts b/x-pack/test/upgrade/apps/dashboard/dashboard_smoke_tests.ts index 105620f90d6b7..2d54d3ba0a52b 100644 --- a/x-pack/test/upgrade/apps/dashboard/dashboard_smoke_tests.ts +++ b/x-pack/test/upgrade/apps/dashboard/dashboard_smoke_tests.ts @@ -14,6 +14,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const log = getService('log'); const renderable = getService('renderable'); const dashboardExpect = getService('dashboardExpect'); + const kibanaServer = getService('kibanaServer'); const PageObjects = getPageObjects(['common', 'header', 'home', 'dashboard', 'timePicker']); const browser = getService('browser'); @@ -40,8 +41,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); dashboardTests.forEach(({ name, numPanels }) => { it('should launch sample ' + name + ' data set dashboard', async () => { + await kibanaServer.uiSettings.update({ + 'timepicker:timeDefaults': `{ "from": "now-5y", "to": "now"}`, + }); await PageObjects.home.launchSampleDashboard(name); - await PageObjects.timePicker.setCommonlyUsedTime('Last_1 year'); await PageObjects.header.waitUntilLoadingHasFinished(); await renderable.waitForRender(); const panelCount = await PageObjects.dashboard.getPanelCount(); @@ -49,9 +52,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); it('should render visualizations', async () => { + await kibanaServer.uiSettings.update({ + 'timepicker:timeDefaults': `{ "from": "now-5y", "to": "now"}`, + }); await PageObjects.home.launchSampleDashboard('flights'); await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.timePicker.setCommonlyUsedTime('Last_1 year'); await renderable.waitForRender(); log.debug('Checking saved searches rendered'); await dashboardExpect.savedSearchRowCount(49); diff --git a/x-pack/test_serverless/api_integration/services/saml_tools.ts b/x-pack/test_serverless/api_integration/services/saml_tools.ts index 4756109fc667d..bd5cd03a7edbb 100644 --- a/x-pack/test_serverless/api_integration/services/saml_tools.ts +++ b/x-pack/test_serverless/api_integration/services/saml_tools.ts @@ -6,33 +6,35 @@ */ import expect from '@kbn/expect'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { getSAMLResponse } from '@kbn/security-api-integration-helpers/saml/saml_tools'; -import { kbnTestConfig } from '@kbn/test'; - import { parse as parseCookie } from 'tough-cookie'; +import Url from 'url'; +import { createSAMLResponse } from '@kbn/mock-idp-plugin/common'; import { FtrProviderContext } from '../ftr_provider_context'; export function SamlToolsProvider({ getService }: FtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); - const randomness = getService('randomness'); const svlCommonApi = getService('svlCommonApi'); - - function createSAMLResponse(options = {}) { - return getSAMLResponse({ - destination: `http://localhost:${kbnTestConfig.getPort()}/api/security/saml/callback`, - sessionIndex: String(randomness.naturalNumber()), - ...options, - }); - } + const config = getService('config'); return { async login(username: string) { + const kibanaUrl = Url.format({ + protocol: config.get('servers.kibana.protocol'), + hostname: config.get('servers.kibana.hostname'), + port: config.get('servers.kibana.port'), + pathname: '/api/security/saml/callback', + }); const samlAuthenticationResponse = await supertestWithoutAuth .post('/api/security/saml/callback') .set(svlCommonApi.getCommonRequestHeader()) - .send({ SAMLResponse: await createSAMLResponse({ username }) }); + .send({ + SAMLResponse: await createSAMLResponse({ + username, + roles: [], + kibanaUrl, + }), + }); expect(samlAuthenticationResponse.status).to.equal(302); expect(samlAuthenticationResponse.header.location).to.equal('/'); const sessionCookie = parseCookie(samlAuthenticationResponse.header['set-cookie'][0])!; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index.ts index 7dff563bf43b3..e06aaf9225cfa 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/index_management/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/index.ts @@ -14,5 +14,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./index_templates')); loadTestFile(require.resolve('./indices')); loadTestFile(require.resolve('./create_enrich_policies')); + loadTestFile(require.resolve('./mappings')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts index 9c4fd7b196337..70de83c949cf5 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/indices.ts @@ -5,10 +5,9 @@ * 2.0. */ -import expect from 'expect'; +import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -const API_BASE_PATH = '/api/index_management'; const INTERNAL_API_BASE_PATH = '/internal/index_management'; const expectedKeys = ['aliases', 'hidden', 'isFrozen', 'primary', 'replica', 'name'].sort(); @@ -16,22 +15,27 @@ export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const es = getService('es'); const log = getService('log'); + const indexManagementService = getService('indexManagement'); describe('Indices', function () { - const indexName = `index-${Math.random()}`; + let indexName: string; + let reload: typeof indexManagementService['indices']['api']['reload']; + let list: typeof indexManagementService['indices']['api']['list']; + let deleteIndex: typeof indexManagementService['indices']['api']['deleteIndex']; + let createIndex: typeof indexManagementService['indices']['helpers']['createIndex']; + let deleteAllIndices: typeof indexManagementService['indices']['helpers']['deleteAllIndices']; + let catIndex: typeof indexManagementService['indices']['helpers']['catIndex']; before(async () => { - // Create a new index to test against - const indexExists = await es.indices.exists({ index: indexName }); - - // Index should not exist, but in the case that it already does, we bypass the create request - if (indexExists) { - return; - } - + ({ + indices: { + api: { reload, list, deleteIndex }, + helpers: { createIndex, deleteAllIndices, catIndex }, + }, + } = indexManagementService); log.debug(`Creating index: '${indexName}'`); try { - await es.indices.create({ index: indexName }); + indexName = await createIndex(); } catch (err) { log.debug('[Setup error] Error creating index'); throw err; @@ -41,28 +45,27 @@ export default function ({ getService }: FtrProviderContext) { after(async () => { // Cleanup index created for testing purposes try { - await es.indices.delete({ - index: indexName, - }); + await deleteAllIndices(); } catch (err) { log.debug('[Cleanup error] Error deleting index'); throw err; } }); - describe('get all', () => { - it('should list indices with the expected parameters', async () => { - const { body: indices } = await supertest - .get(`${API_BASE_PATH}/indices`) - .set('kbn-xsrf', 'xxx') - .set('x-elastic-internal-origin', 'xxx') - .expect(200); + describe('list', () => { + it('should list all the indices with the expected properties', async function () { + // Create an index that we can assert against + await createIndex('test_index'); - const indexFound = indices.find((index: { name: string }) => index.name === indexName); + // Verify indices request + const { body: indices } = await list().set('x-elastic-internal-origin', 'xxx').expect(200); - expect(indexFound).toBeTruthy(); + // Find the "test_index" created to verify expected keys + const indexCreated = indices.find((index: { name: string }) => index.name === 'test_index'); - expect(Object.keys(indexFound).sort()).toEqual(expectedKeys); + const sortedReceivedKeys = Object.keys(indexCreated).sort(); + + expect(sortedReceivedKeys).to.eql(expectedKeys); }); }); @@ -74,9 +77,9 @@ export default function ({ getService }: FtrProviderContext) { .set('x-elastic-internal-origin', 'xxx') .expect(200); - expect(index).toBeTruthy(); + expect(index).to.be.ok(); - expect(Object.keys(index).sort()).toEqual(expectedKeys); + expect(Object.keys(index).sort()).to.eql(expectedKeys); }); it('throws 404 for a non-existent index', async () => { @@ -118,9 +121,9 @@ export default function ({ getService }: FtrProviderContext) { .set('x-elastic-internal-origin', 'xxx') .expect(200); - expect(index).toBeTruthy(); + expect(index).to.be.ok(); - expect(Object.keys(index).sort()).toEqual(expectedKeys); + expect(Object.keys(index).sort()).to.eql(expectedKeys); }); it('fails to re-create the same index', async () => { @@ -134,5 +137,47 @@ export default function ({ getService }: FtrProviderContext) { .expect(400); }); }); + + describe('reload', function () { + it('should list all the indices with the expected properties', async function () { + // create an index to assert against, otherwise the test is flaky + await createIndex('reload-test-index'); + const { body } = await reload().set('x-elastic-internal-origin', 'xxx').expect(200); + + const indexCreated = body.find( + (index: { name: string }) => index.name === 'reload-test-index' + ); + const sortedReceivedKeys = Object.keys(indexCreated).sort(); + expect(sortedReceivedKeys).to.eql(expectedKeys); + expect(body.length > 1).to.be(true); // to contrast it with the next test + }); + + it('should allow reloading only certain indices', async () => { + const index = await createIndex(); + const { body } = await reload([index]).set('x-elastic-internal-origin', 'xxx'); + + expect(body.length === 1).to.be(true); + expect(body[0].name).to.be(index); + }); + }); + + describe('delete indices', () => { + it('should delete an index', async () => { + const index = await createIndex(); + + const { body: indices1 } = await catIndex(undefined, 'i'); + expect(indices1.map((indexItem) => indexItem.i)).to.contain(index); + + await deleteIndex(index).set('x-elastic-internal-origin', 'xxx').expect(200); + + const { body: indices2 } = await catIndex(undefined, 'i'); + expect(indices2.map((indexItem) => indexItem.i)).not.to.contain(index); + }); + + it('should require index or indices to be provided', async () => { + const { body } = await deleteIndex().set('x-elastic-internal-origin', 'xxx').expect(400); + expect(body.message).to.contain('expected value of type [string]'); + }); + }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/mappings.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/mappings.ts new file mode 100644 index 0000000000000..eb28c77fc4409 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/mappings.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const log = getService('log'); + const indexManagementService = getService('indexManagement'); + + describe('mappings', () => { + let indexName: string; + let getMapping: typeof indexManagementService['mappings']['api']['getMapping']; + let createIndex: typeof indexManagementService['indices']['helpers']['createIndex']; + let deleteAllIndices: typeof indexManagementService['indices']['helpers']['deleteAllIndices']; + + const mappings = { + properties: { + total: { type: 'long' }, + tag: { type: 'keyword' }, + createdAt: { type: 'date' }, + }, + }; + + before(async () => { + ({ + indices: { + helpers: { createIndex, deleteAllIndices }, + }, + mappings: { + api: { getMapping }, + }, + } = indexManagementService); + + log.debug('Creating index'); + try { + indexName = await createIndex(undefined, mappings); + } catch (err) { + log.debug('[Setup error] Error creating index'); + throw err; + } + }); + + after(async () => { + try { + await deleteAllIndices(); + } catch (err) { + log.debug('[Cleanup error] Error deleting index'); + throw err; + } + }); + + it('should get the index mappings', async () => { + const { body } = await getMapping(indexName).expect(200); + + expect(body.mappings).to.eql(mappings); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts index 2b7fc3653c3b6..055f6c1a17a54 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts @@ -6,7 +6,6 @@ */ import { cleanup, generate } from '@kbn/infra-forge'; -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -89,7 +88,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.5], timeSize: 5, @@ -184,7 +182,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>', threshold: [0.5], timeSize: 5, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts index 4f1e9a4ab080b..098f4659fdd2d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -75,7 +74,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.5], timeSize: 5, @@ -170,7 +168,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>', threshold: [0.5], timeSize: 5, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts index 47ed54412296d..0c3f43b29fdd0 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts @@ -12,7 +12,6 @@ */ import { cleanup, generate } from '@kbn/infra-forge'; -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -91,7 +90,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.9], timeSize: 1, @@ -188,7 +186,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [0.9], timeSize: 1, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts index 0f47627be5e2b..01f04b12f0c50 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts @@ -6,7 +6,6 @@ */ import { cleanup, generate } from '@kbn/infra-forge'; -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { Aggregators, Comparator, @@ -85,7 +84,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT, threshold: [2], timeSize: 1, @@ -178,7 +176,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>', threshold: [2], timeSize: 1, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts index 78daabb1eb131..0f7b7a019cc83 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts @@ -11,7 +11,6 @@ * 2.0. */ -import { CUSTOM_AGGREGATOR } from '@kbn/observability-plugin/common/custom_threshold_rule/constants'; import { kbnTestConfig } from '@kbn/test'; import moment from 'moment'; import { cleanup, generate } from '@kbn/infra-forge'; @@ -95,7 +94,6 @@ export default function ({ getService }: FtrProviderContext) { params: { criteria: [ { - aggType: CUSTOM_AGGREGATOR, comparator: Comparator.GT_OR_EQ, threshold: [0.2], timeSize: 1, @@ -205,7 +203,6 @@ export default function ({ getService }: FtrProviderContext) { .eql({ criteria: [ { - aggType: 'custom', comparator: '>=', threshold: [0.2], timeSize: 1, @@ -235,8 +232,7 @@ export default function ({ getService }: FtrProviderContext) { expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - // Added the S to protocol.getUrlParts as not returning the correct value. - `${protocol}s://${hostname}:${port}/app/observability/alerts?_a=(kuery:%27kibana.alert.uuid:%20%22${alertId}%22%27%2CrangeFrom:%27${rangeFrom}%27%2CrangeTo:now%2Cstatus:all)` + `${protocol}://${hostname}:${port}/app/observability/alerts?_a=(kuery:%27kibana.alert.uuid:%20%22${alertId}%22%27%2CrangeFrom:%27${rangeFrom}%27%2CrangeTo:now%2Cstatus:all)` ); expect(resp.hits.hits[0]._source?.reason).eql( `Average system.cpu.total.norm.pct is 80%, above the threshold of 20%. (duration: 1 min, data view: ${DATE_VIEW}, group: host-0)` diff --git a/x-pack/test_serverless/functional/config.base.ts b/x-pack/test_serverless/functional/config.base.ts index 1090f0a96aa64..538316b61e80f 100644 --- a/x-pack/test_serverless/functional/config.base.ts +++ b/x-pack/test_serverless/functional/config.base.ts @@ -75,6 +75,9 @@ export function createTestConfig(options: CreateTestConfigOptions) { connectors: { pathname: '/app/management/insightsAndAlerting/triggersActionsConnectors/', }, + triggersActions: { + pathname: '/app/management/insightsAndAlerting/triggersActions', + }, settings: { pathname: '/app/management/kibana/settings', }, @@ -87,6 +90,16 @@ export function createTestConfig(options: CreateTestConfigOptions) { securitySolution: { pathname: '/app/security', }, + dashboard: { + pathname: '/app/dashboards', + }, + discover: { + pathname: '/app/discover', + }, + context: { + pathname: '/app/discover', + hash: '/context', + }, }, // choose where screenshots should be saved screenshots: { diff --git a/x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern/data.json.gz b/x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern/data.json.gz new file mode 100644 index 0000000000000..45c293daa472c Binary files /dev/null and b/x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern/data.json.gz differ diff --git a/x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern/mappings.json b/x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern/mappings.json new file mode 100644 index 0000000000000..f852c18ebcc1c --- /dev/null +++ b/x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern/mappings.json @@ -0,0 +1,100 @@ +{ + "type": "index", + "value": { + "aliases": { + }, + "index": "kibana_sample_data_flights", + "mappings": { + "properties": { + "AvgTicketPrice": { + "type": "float" + }, + "Cancelled": { + "type": "boolean" + }, + "Carrier": { + "type": "keyword" + }, + "Dest": { + "type": "keyword" + }, + "DestAirportID": { + "type": "keyword" + }, + "DestCityName": { + "type": "keyword" + }, + "DestCountry": { + "type": "keyword" + }, + "DestLocation": { + "type": "geo_point" + }, + "DestRegion": { + "type": "keyword" + }, + "DestWeather": { + "type": "keyword" + }, + "DistanceKilometers": { + "type": "float" + }, + "DistanceMiles": { + "type": "float" + }, + "FlightDelay": { + "type": "boolean" + }, + "FlightDelayMin": { + "type": "integer" + }, + "FlightDelayType": { + "type": "keyword" + }, + "FlightNum": { + "type": "keyword" + }, + "FlightTimeHour": { + "type": "keyword" + }, + "FlightTimeMin": { + "type": "float" + }, + "Origin": { + "type": "keyword" + }, + "OriginAirportID": { + "type": "keyword" + }, + "OriginCityName": { + "type": "keyword" + }, + "OriginCountry": { + "type": "keyword" + }, + "OriginLocation": { + "type": "geo_point" + }, + "OriginRegion": { + "type": "keyword" + }, + "OriginWeather": { + "type": "keyword" + }, + "dayOfWeek": { + "type": "integer" + }, + "timestamp": { + "type": "date" + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file diff --git a/x-pack/test_serverless/functional/fixtures/kbn_archiver/reporting/logs.json b/x-pack/test_serverless/functional/fixtures/kbn_archiver/reporting/logs.json new file mode 100644 index 0000000000000..05e92981916af --- /dev/null +++ b/x-pack/test_serverless/functional/fixtures/kbn_archiver/reporting/logs.json @@ -0,0 +1,560 @@ +{ + "attributes": { + "fieldAttrs": "{\"@message\":{\"count\":2},\"@tags\":{\"count\":2},\"url\":{\"count\":2}}", + "fieldFormatMap": "{}", + "fields": "[]", + "name": "logstash-*", + "runtimeFieldMap": "{}", + "sourceFilters": "[]", + "timeFieldName": "@timestamp", + "title": "logstash-*", + "typeMeta": "{}" + }, + "coreMigrationVersion": "8.7.0", + "id": "logstash-*", + "migrationVersion": { + "index-pattern": "8.0.0" + }, + "references": [], + "type": "index-pattern", + "updated_at": "2023-01-19T00:49:47.963Z", + "version": "WzMxNCwyXQ==" +} + +{ + "attributes": { + "columns": [ + "clientip", + "extension" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"highlightAll\":true,\"version\":true,\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[{\"meta\":{\"alias\":\"datefilter🥜\",\"negate\":false,\"type\":\"range\",\"key\":\"@timestamp\",\"value\":\"Sep 20, 2015 @ 03:19:40.307 to Sep 20, 2015 @ 03:26:56.221\",\"params\":{\"gte\":\"2015-09-20T10:19:40.307Z\",\"lt\":\"2015-09-20T10:26:56.221Z\"},\"disabled\":false,\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"range\":{\"@timestamp\":{\"gte\":\"2015-09-20T10:19:40.307Z\",\"lt\":\"2015-09-20T10:26:56.221Z\"}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "@timestamp", + "desc" + ] + ], + "title": "A Saved Search With a DATE FILTER", + "version": 1 + }, + "coreMigrationVersion": "8.0.0", + "id": "d7a79750-3edd-11e9-99cc-4d80163ee9e7", + "migrationVersion": { + "search": "8.0.0" + }, + "references": [ + { + "id": "logstash-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + }, + { + "id": "logstash-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + } + ], + "type": "search", + "updated_at": "2019-03-05T00:34:28.706Z", + "version": "WzMsMl0=" +} + +{ + "attributes": { + "buildNum": 9007199254740991, + "dateFormat:tz": "UTC", + "defaultIndex": "89655130-5013-11e9-bce7-4dabcb8bef24", + "csv:quoteValues": true, + "csv:separator": ",", + "search:queryLanguage": "lucene" + }, + "coreMigrationVersion": "8.0.0", + "id": "8.0.0", + "migrationVersion": { + "config": "8.0.0" + }, + "references": [], + "type": "config", + "updated_at": "2019-07-09T21:57:57.129Z", + "version": "WzMsMl0=" +} + +{ + "attributes": { + "fieldFormatMap": "{\"date\":{\"id\":\"date_nanos\"}}", + "fields": "[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"date\",\"type\":\"date\",\"esTypes\":[\"date_nanos\"],\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"message\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", + "title": "nanos" + }, + "coreMigrationVersion": "8.0.0", + "id": "907bc200-a294-11e9-a900-ef10e0ac769e", + "migrationVersion": { + "index-pattern": "8.0.0" + }, + "references": [], + "type": "index-pattern", + "updated_at": "2019-07-09T22:07:17.154Z", + "version": "WzQsMl0=" +} + +{ + "attributes": { + "columns": [ + "date", + "message", + "_id" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "date", + "desc" + ] + ], + "title": "TESTS DATE NANOS", + "version": 1 + }, + "coreMigrationVersion": "8.0.0", + "id": "e4035040-a295-11e9-a900-ef10e0ac769e", + "migrationVersion": { + "search": "8.0.0" + }, + "references": [ + { + "id": "907bc200-a294-11e9-a900-ef10e0ac769e", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "search", + "updated_at": "2019-07-09T22:07:22.318Z", + "version": "WzUsMl0=" +} + +{ + "id": "timeless-sales", + "attributes": { + "fields": "[{\"name\":\"@date\",\"type\":\"date\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"metric\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"name\",\"type\":\"string\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"power\",\"type\":\"number\",\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"success\",\"type\":\"boolean\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", + "title": "sales" + }, + "migrationVersion": { + "index-pattern": "6.5.0" + }, + "references": [ + ], + "type": "index-pattern", + "updated_at": "2019-03-05T22:52:35.474Z" +} + +{ + "id": "71e3ee20-3f99-11e9-b8ee-6b9604f2f877", + "migrationVersion": { + "search": "7.0.0" + }, + "references": [ + { + "id": "timeless-sales", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + }, + { + "id": "timeless-sales", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + } + ], + "attributes": { + "columns": [ + "name", + "power" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"$state\":{\"store\":\"appState\"},\"meta\":{\"alias\":null,\"disabled\":false,\"key\":\"power\",\"negate\":false,\"params\":{\"gte\":1,\"lt\":null},\"type\":\"range\",\"value\":\"1 to \",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"range\":{\"power\":{\"gte\":1,\"lt\":null}}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [[ + "power", + "asc" + ]], + "title": "SALE POWER", + "version": 1 + }, + "type": "search", + "updated_at": "2019-03-05T22:53:08.481Z" +} + +{ + "attributes": { + "state": { + "datasourceStates": { + "indexpattern": { + "layers": { + "0385075d-0f3b-4a12-b3c0-68a95781d48d": { + "columnOrder": [ + "03195b79-6315-40f7-b513-5222330367d7", + "2cb8226c-bfe5-4505-9c66-9f99ff6b5822" + ], + "columns": { + "03195b79-6315-40f7-b513-5222330367d7": { + "dataType": "date", + "isBucketed": true, + "label": "date", + "operationType": "date_histogram", + "params": { + "interval": "auto" + }, + "scale": "interval", + "sourceField": "date" + }, + "2cb8226c-bfe5-4505-9c66-9f99ff6b5822": { + "dataType": "number", + "isBucketed": false, + "label": "Count of records", + "operationType": "count", + "scale": "ratio", + "sourceField": "Records" + } + }, + "incompleteColumns": {} + } + } + } + }, + "filters": [], + "query": { + "language": "kuery", + "query": "" + }, + "visualization": { + "layers": [ + { + "accessors": [ + "2cb8226c-bfe5-4505-9c66-9f99ff6b5822" + ], + "layerId": "0385075d-0f3b-4a12-b3c0-68a95781d48d", + "layerType": "data", + "position": "top", + "seriesType": "bar_stacked", + "showGridlines": false, + "xAccessor": "03195b79-6315-40f7-b513-5222330367d7" + } + ], + "legend": { + "isVisible": true, + "position": "right" + }, + "preferredSeriesType": "bar_stacked", + "title": "Empty XY chart", + "valueLabels": "hide" + } + }, + "title": "distogram", + "visualizationType": "lnsXY" + }, + "coreMigrationVersion": "8.0.0", + "id": "4b498150-6821-11eb-9375-4bd700f7d8d4", + "migrationVersion": { + "lens": "8.0.0" + }, + "references": [], + "type": "lens", + "updated_at": "2021-02-06T02:16:17.129Z", + "version": "WzgsMl0=" +} + +{ + "attributes": { + "fieldAttrs": "{\"_id\":{\"count\":1},\"gender\":{\"count\":1},\"name\":{\"count\":1},\"value\":{\"count\":1},\"year\":{\"count\":1},\"years_ago\":{\"count\":1},\"date_informal\":{\"count\":1}}", + "fieldFormatMap": "{\"years_ago\":{\"id\":\"number\",\"params\":{\"pattern\":\"0,0.00000000000000000000\"}},\"year\":{\"id\":\"number\",\"params\":{\"pattern\":\"0\"}},\"date_informal\":{\"id\":\"date\",\"params\":{\"parsedUrl\":{\"origin\":\"http://localhost:5620\",\"pathname\":\"/app/dashboards\",\"basePath\":\"\"},\"pattern\":\"MMM Do YY\"}}}", + "fields": "[{\"count\":1,\"script\":\"2019 - doc['year'].value\",\"lang\":\"painless\",\"name\":\"years_ago\",\"type\":\"number\",\"scripted\":true,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":1,\"script\":\"doc['date'].value\",\"lang\":\"painless\",\"name\":\"date_informal\",\"type\":\"date\",\"scripted\":true,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]", + "runtimeFieldMap": "{}", + "timeFieldName": "date", + "title": "babynames" + }, + "coreMigrationVersion": "8.0.0", + "id": "89655130-5013-11e9-bce7-4dabcb8bef24", + "migrationVersion": { + "index-pattern": "8.0.0" + }, + "references": [], + "type": "index-pattern", + "updated_at": "2021-02-06T02:15:25.565Z", + "version": "WzcsMl0=" +} + +{ + "attributes": { + "columns": [ + "_id", + "name", + "gender", + "value", + "year", + "years_ago", + "date_informal" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"highlightAll\":true,\"version\":true,\"sort\":[{\"date\":\"desc\"}],\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"fieldsFromSource\":[\"_id\",\"_index\",\"_score\",\"_source\",\"_type\",\"date\",\"gender\",\"name\",\"percent\",\"value\",\"year\",\"years_ago\",\"date_informal\"],\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "date", + "desc" + ] + ], + "title": "namessearch", + "version": 1 + }, + "coreMigrationVersion": "8.0.0", + "id": "cdb908f0-6820-11eb-9375-4bd700f7d8d4", + "migrationVersion": { + "search": "8.0.0" + }, + "references": [ + { + "id": "89655130-5013-11e9-bce7-4dabcb8bef24", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "search", + "updated_at": "2021-02-06T02:15:31.253Z", + "version": "WzYsMl0=" +} + +{ + "attributes": { + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}" + }, + "optionsJSON": "{\"hidePanelTitles\":false,\"useMargins\":true}", + "panelsJSON": "[{\"version\":\"7.11.0\",\"type\":\"search\",\"gridData\":{\"x\":0,\"y\":0,\"w\":48,\"h\":13,\"i\":\"56f914c9-9597-4781-bfc6-229d40b382c7\"},\"panelIndex\":\"56f914c9-9597-4781-bfc6-229d40b382c7\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_56f914c9-9597-4781-bfc6-229d40b382c7\"},{\"version\":\"7.11.0\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":13,\"w\":48,\"h\":14,\"i\":\"f3ea512f-e441-4206-8aa7-000b1418ea2b\"},\"panelIndex\":\"f3ea512f-e441-4206-8aa7-000b1418ea2b\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_f3ea512f-e441-4206-8aa7-000b1418ea2b\"}]", + "timeRestore": false, + "title": "names dashboard", + "version": 1 + }, + "coreMigrationVersion": "8.0.0", + "id": "52af6d10-6821-11eb-9375-4bd700f7d8d4", + "migrationVersion": { + "dashboard": "8.0.0" + }, + "references": [ + { + "id": "cdb908f0-6820-11eb-9375-4bd700f7d8d4", + "name": "56f914c9-9597-4781-bfc6-229d40b382c7:panel_56f914c9-9597-4781-bfc6-229d40b382c7", + "type": "search" + }, + { + "id": "4b498150-6821-11eb-9375-4bd700f7d8d4", + "name": "f3ea512f-e441-4206-8aa7-000b1418ea2b:panel_f3ea512f-e441-4206-8aa7-000b1418ea2b", + "type": "lens" + } + ], + "type": "dashboard", + "updated_at": "2021-02-06T02:16:29.540Z", + "version": "WzksMl0=" +} + +{ + "attributes": { + "fieldAttrs": "{\"name\":{\"count\":1},\"updated_at\":{\"count\":1}}", + "fields": "[]", + "runtimeFieldMap": "{}", + "timeFieldName": "timestamp", + "title": "sparse_data", + "typeMeta": "{}" + }, + "coreMigrationVersion": "8.1.0", + "id": "8e5af470-62de-11ec-a5fd-9f30aac1abbf", + "migrationVersion": { + "index-pattern": "8.0.0" + }, + "references": [], + "type": "index-pattern", + "updated_at": "2021-12-22T04:22:06.170Z", + "version": "WzI0MTQsMV0=" +} + +{ + "attributes": { + "columns": [ + "name", + "updated_at" + ], + "description": "", + "grid": {}, + "hideChart": false, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "timestamp", + "desc" + ] + ], + "title": "Sparse Columns" + }, + "coreMigrationVersion": "8.1.0", + "id": "c4367dd0-62de-11ec-a5fd-9f30aac1abbf", + "migrationVersion": { + "search": "8.0.0" + }, + "references": [ + { + "id": "8e5af470-62de-11ec-a5fd-9f30aac1abbf", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "search", + "updated_at": "2021-12-22T04:22:25.584Z", + "version": "WzI0MjAsMV0=" +} + +{ + "attributes": { + "columns": [], + "description": "", + "grid": {}, + "hideChart": false, + "isTextBasedQuery": false, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[{\"meta\":{\"type\":\"custom\",\"disabled\":false,\"negate\":false,\"alias\":null,\"key\":\"query\",\"value\":\"{\\\"bool\\\":{\\\"minimum_should_match\\\":1,\\\"should\\\":[{\\\"match_phrase\\\":{\\\"@tags\\\":\\\"info\\\"}}]}}\",\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\"},\"query\":{\"bool\":{\"minimum_should_match\":1,\"should\":[{\"match_phrase\":{\"@tags\":\"info\"}}]}},\"$state\":{\"store\":\"appState\"}}],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "@timestamp", + "desc" + ] + ], + "timeRestore": false, + "title": "A saved search with match_phrase filter and no columns selected", + "usesAdHocDataView": false + }, + "coreMigrationVersion": "8.7.0", + "created_at": "2023-01-19T00:36:50.456Z", + "id": "5cfe1180-9791-11ed-97f7-93bc26fd388d", + "migrationVersion": { + "search": "8.0.0" + }, + "references": [ + { + "id": "logstash-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + }, + { + "id": "logstash-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + } + ], + "type": "search", + "updated_at": "2023-01-19T00:37:22.716Z", + "version": "WzE5NiwyXQ==" +} + +{ + "attributes": { + "columns": [ + "@message", + "url", + "@tags" + ], + "description": "", + "grid": {}, + "hideChart": false, + "isTextBasedQuery": false, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"host:media-for-the-masses\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "refreshInterval": { + "pause": true, + "value": 60000 + }, + "sort": [ + [ + "@timestamp", + "desc" + ] + ], + "timeRange": { + "from": "2015-07-30T15:49:33.702Z", + "to": "2015-11-01T01:39:01.782Z" + }, + "timeRestore": true, + "title": "A saved search with the time stored and a query", + "usesAdHocDataView": false + }, + "coreMigrationVersion": "8.7.0", + "created_at": "2023-01-19T00:38:13.779Z", + "id": "8ea82630-9791-11ed-97f7-93bc26fd388d", + "migrationVersion": { + "search": "8.0.0" + }, + "references": [ + { + "id": "logstash-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "search", + "updated_at": "2023-01-19T00:50:04.124Z", + "version": "WzMxNiwyXQ==" +} + +{ + "attributes": { + "columns": [ + "@message", + "@tags", + "url" + ], + "description": "", + "grid": {}, + "hideChart": false, + "isTextBasedQuery": false, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"host:media-for-the-masses\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "sort": [ + [ + "@timestamp", + "desc" + ] + ], + "timeRestore": false, + "title": "A saved search with a query", + "usesAdHocDataView": false + }, + "coreMigrationVersion": "8.7.0", + "created_at": "2023-01-19T00:31:57.708Z", + "id": "ae8044c0-9790-11ed-97f7-93bc26fd388d", + "migrationVersion": { + "search": "8.0.0" + }, + "references": [ + { + "id": "logstash-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "search", + "updated_at": "2023-01-19T00:39:15.770Z", + "version": "WzI2MCwyXQ==" +} diff --git a/x-pack/test_serverless/functional/page_objects/svl_common_navigation.ts b/x-pack/test_serverless/functional/page_objects/svl_common_navigation.ts index 5c497b47a6e15..93b5dea4f0495 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_common_navigation.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_common_navigation.ts @@ -106,6 +106,19 @@ export function SvlCommonNavigationProvider(ctx: FtrProviderContext) { }); } }, + async findLink(by: { deepLinkId: AppDeepLinkId } | { navId: string } | { text: string }) { + await this.expectLinkExists(by); + if ('deepLinkId' in by) { + return testSubjects.find(`~nav-item-deepLinkId-${by.deepLinkId}`); + } else if ('navId' in by) { + return testSubjects.find(`~nav-item-id-${by.navId}`); + } else { + return retry.try(async () => { + const link = await getByVisibleText('~nav-item', by.text); + return link; + }); + } + }, async expectSectionExists(sectionId: NavigationId) { log.debug('ServerlessCommonNavigation.sidenav.expectSectionExists', sectionId); await testSubjects.existOrFail(getSectionIdTestSubj(sectionId)); @@ -153,6 +166,20 @@ export function SvlCommonNavigationProvider(ctx: FtrProviderContext) { async expectExists() { await testSubjects.existOrFail('breadcrumbs'); }, + async clickBreadcrumb(by: { deepLinkId: AppDeepLinkId } | { text: string }) { + if ('deepLinkId' in by) { + await testSubjects.click(`~breadcrumb-deepLinkId-${by.deepLinkId}`); + } else { + (await getByVisibleText('~breadcrumb', by.text))?.click(); + } + }, + getBreadcrumb(by: { deepLinkId: AppDeepLinkId } | { text: string }) { + if ('deepLinkId' in by) { + return testSubjects.find(`~breadcrumb-deepLinkId-${by.deepLinkId}`); + } else { + return getByVisibleText('~breadcrumb', by.text); + } + }, async expectBreadcrumbExists(by: { deepLinkId: AppDeepLinkId } | { text: string }) { log.debug( 'ServerlessCommonNavigation.breadcrumbs.expectBreadcrumbExists', diff --git a/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts b/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts index 4ba56987416d3..d453101e55e2d 100644 --- a/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts +++ b/x-pack/test_serverless/functional/services/deployment_agnostic_services.ts @@ -57,6 +57,7 @@ const deploymentAgnosticFunctionalServices = _.pick(functionalServices, [ 'queryBar', 'random', 'renderable', + 'reporting', 'retryOnStale', 'rules', 'sampleData', diff --git a/x-pack/test_serverless/functional/services/ml/observability_navigation.ts b/x-pack/test_serverless/functional/services/ml/observability_navigation.ts index 3dd18587a9140..91c149dab37ac 100644 --- a/x-pack/test_serverless/functional/services/ml/observability_navigation.ts +++ b/x-pack/test_serverless/functional/services/ml/observability_navigation.ts @@ -16,10 +16,10 @@ export function MachineLearningNavigationProviderObservability({ async function navigateToArea(id: string) { await svlCommonNavigation.sidenav.openSection('observability_project_nav.aiops'); - await testSubjects.existOrFail(`~nav-item-id-observability_project_nav.aiops.ml:${id}`, { + await testSubjects.existOrFail(`~nav-item-observability_project_nav.aiops.ml:${id}`, { timeout: 60 * 1000, }); - await testSubjects.click(`~nav-item-id-observability_project_nav.aiops.ml:${id}`); + await testSubjects.click(`~nav-item-observability_project_nav.aiops.ml:${id}`); } return { diff --git a/x-pack/test_serverless/functional/test_suites/common/context/_context_navigation.ts b/x-pack/test_serverless/functional/test_suites/common/context/_context_navigation.ts new file mode 100644 index 0000000000000..f23ebd55f1072 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/context/_context_navigation.ts @@ -0,0 +1,164 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +const TEST_FILTER_COLUMN_NAMES = [ + [ + 'agent', + 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24', + ], + ['extension', 'jpg'], +]; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const retry = getService('retry'); + const browser = getService('browser'); + const dataGrid = getService('dataGrid'); + const PageObjects = getPageObjects([ + 'common', + 'header', + 'context', + 'discover', + 'timePicker', + 'svlCommonNavigation', + ]); + const kibanaServer = getService('kibanaServer'); + const filterBar = getService('filterBar'); + + const checkMainViewFilters = async () => { + for (const [columnName, value] of TEST_FILTER_COLUMN_NAMES) { + expect(await filterBar.hasFilter(columnName, value, true)).to.eql(true); + } + expect(await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes()).to.eql({ + start: PageObjects.timePicker.defaultStartTime, + end: PageObjects.timePicker.defaultEndTime, + }); + }; + + describe('discover - context - back navigation', function contextSize() { + before(async () => { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update({ + defaultIndex: 'logstash-*', + }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + for (const [columnName, value] of TEST_FILTER_COLUMN_NAMES) { + await filterBar.addFilter({ field: columnName, operation: 'is', value }); + } + // TODO: Serverless sidebar causes the grid to be hidden, so set a larger window size + await browser.setWindowSize(1920, 1080); + }); + + after(async function () { + await kibanaServer.uiSettings.replace({}); + }); + + it('should go back after loading', async function () { + await retry.waitFor('user navigating to context and returning to discover', async () => { + // navigate to the context view + const initialHitCount = await PageObjects.discover.getHitCount(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await PageObjects.context.clickSuccessorLoadMoreButton(); + await PageObjects.context.clickSuccessorLoadMoreButton(); + await PageObjects.context.clickSuccessorLoadMoreButton(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await browser.goBack(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + const hitCount = await PageObjects.discover.getHitCount(); + return initialHitCount === hitCount; + }); + }); + + it('should go back via breadcrumbs with preserved state', async function () { + await retry.waitFor( + 'user navigating to context and returning to discover via breadcrumbs', + async () => { + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ + deepLinkId: 'discover', + }); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await checkMainViewFilters(); + return true; + } + ); + }); + + it('should go back via breadcrumbs with preserved state after a page refresh', async function () { + await retry.waitFor( + 'user navigating to context and returning to discover via breadcrumbs', + async () => { + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await browser.refresh(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ + deepLinkId: 'discover', + }); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + await checkMainViewFilters(); + return true; + } + ); + }); + + it('should go back via breadcrumbs with updated state after a goBack browser', async function () { + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + await PageObjects.common.sleep(5000); + + // update url state + await filterBar.removeFilter('agent'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ + deepLinkId: 'discover', + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await filterBar.getFilterCount()).to.eql(2); + await checkMainViewFilters(); + + await browser.goBack(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + expect(await filterBar.getFilterCount()).to.eql(1); + const [filterName, filterValue] = TEST_FILTER_COLUMN_NAMES[1]; + expect(await filterBar.hasFilter(filterName, filterValue, false)).to.eql(true); + + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ + deepLinkId: 'discover', + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await filterBar.getFilterCount()).to.eql(2); + await checkMainViewFilters(); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/context/_discover_navigation.ts b/x-pack/test_serverless/functional/test_suites/common/context/_discover_navigation.ts new file mode 100644 index 0000000000000..296a8245f9d1d --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/context/_discover_navigation.ts @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +const TEST_COLUMN_NAMES = ['@message']; +const TEST_FILTER_COLUMN_NAMES = [ + ['extension.raw', 'jpg'], + ['geo.src', 'IN'], +]; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const retry = getService('retry'); + const dataGrid = getService('dataGrid'); + const filterBar = getService('filterBar'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'timePicker', + 'settings', + 'dashboard', + 'context', + 'header', + 'unifiedFieldList', + 'svlCommonNavigation', + ]); + const testSubjects = getService('testSubjects'); + const dashboardAddPanel = getService('dashboardAddPanel'); + const browser = getService('browser'); + const kibanaServer = getService('kibanaServer'); + + describe('context link in discover', () => { + before(async () => { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update({ + defaultIndex: 'logstash-*', + }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + for (const columnName of TEST_COLUMN_NAMES) { + await PageObjects.unifiedFieldList.clickFieldListItemAdd(columnName); + } + + for (const [columnName, value] of TEST_FILTER_COLUMN_NAMES) { + await filterBar.addFilter({ field: columnName, operation: 'is', value }); + await PageObjects.header.waitUntilLoadingHasFinished(); + } + // TODO: Serverless sidebar causes the grid to be hidden, so set a larger window size + await browser.setWindowSize(1920, 1080); + }); + + after(async () => { + await kibanaServer.uiSettings.replace({}); + }); + + it('should open the context view with the selected document as anchor and allows selecting next anchor', async () => { + /** + * Helper function to get the first timestamp of the document table + * @param isAnchorRow - determins if just the anchor row of context should be selected + */ + const getTimestamp = async (isAnchorRow: boolean = false) => { + const contextFields = await dataGrid.getFields({ isAnchorRow }); + return contextFields[0][0]; + }; + // get the timestamp of the first row + const firstDiscoverTimestamp = await getTimestamp(); + + // check the anchor timestamp in the context view + await retry.waitFor('selected document timestamp matches anchor timestamp', async () => { + // navigate to the context view + await dataGrid.clickRowToggle({ rowIndex: 0 }); + + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + const anchorTimestamp = await getTimestamp(true); + return anchorTimestamp === firstDiscoverTimestamp; + }); + + await retry.waitFor('next anchor timestamp matches previous anchor timestamp', async () => { + // get the timestamp of the first row + const firstContextTimestamp = await getTimestamp(false); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + const anchorTimestamp = await getTimestamp(true); + return anchorTimestamp === firstContextTimestamp; + }); + }); + + it('should open the context view with the same columns', async () => { + const columnNames = await dataGrid.getHeaderFields(); + expect(columnNames).to.eql(['@timestamp', ...TEST_COLUMN_NAMES]); + }); + + it('should open the context view with the filters disabled', async () => { + let disabledFilterCounter = 0; + for (const [columnName, value] of TEST_FILTER_COLUMN_NAMES) { + if (await filterBar.hasFilter(columnName, value, false)) { + disabledFilterCounter++; + } + } + expect(disabledFilterCounter).to.be(TEST_FILTER_COLUMN_NAMES.length); + }); + + it('should navigate to the first document and then back to discover', async () => { + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + // click the open action + await retry.try(async () => { + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + if (!rowActions.length) { + throw new Error('row actions empty, trying again'); + } + await rowActions[0].click(); + }); + + const hasDocHit = await testSubjects.exists('doc-hit'); + expect(hasDocHit).to.be(true); + + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ + deepLinkId: 'discover', + }); + await PageObjects.discover.waitForDiscoverAppOnScreen(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('navigates to doc view from embeddable', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.saveSearch('my search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.dashboard.navigateToApp(); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + + await dashboardAddPanel.addSavedSearch('my search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[0].click(); + await PageObjects.common.sleep(250); + + // close popup + const alert = await browser.getAlert(); + await alert?.accept(); + if (await testSubjects.exists('confirmModalConfirmButton')) { + await testSubjects.click('confirmModalConfirmButton'); + } + + await retry.waitFor('navigate to doc view', async () => { + const currentUrl = await browser.getCurrentUrl(); + return currentUrl.includes('#/doc'); + }); + await retry.waitFor('doc view being rendered', async () => { + return await PageObjects.discover.isShowingDocViewer(); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/context/_filters.ts b/x-pack/test_serverless/functional/test_suites/common/context/_filters.ts new file mode 100644 index 0000000000000..c27998a658899 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/context/_filters.ts @@ -0,0 +1,255 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +const TEST_INDEX_PATTERN = 'logstash-*'; +const TEST_ANCHOR_ID = 'AU_x3_BrGFA8no6QjjaI'; +const TEST_ANCHOR_FILTER_FIELD = 'geo.src'; +const TEST_ANCHOR_FILTER_VALUE = 'IN'; +const TEST_COLUMN_NAMES = ['extension', 'geo.src']; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const dataGrid = getService('dataGrid'); + const filterBar = getService('filterBar'); + const retry = getService('retry'); + const browser = getService('browser'); + const kibanaServer = getService('kibanaServer'); + + const PageObjects = getPageObjects(['common', 'context']); + const testSubjects = getService('testSubjects'); + + describe('context filters', function contextSize() { + before(async function () { + await kibanaServer.uiSettings.update({ + 'discover:rowHeightOption': 0, // to have more grid rows visible at once + }); + }); + + beforeEach(async function () { + await PageObjects.context.navigateTo(TEST_INDEX_PATTERN, TEST_ANCHOR_ID, { + columns: TEST_COLUMN_NAMES, + }); + }); + + it('inclusive filter should be addable via expanded data grid rows', async function () { + await retry.waitFor(`filter ${TEST_ANCHOR_FILTER_FIELD} in filterbar`, async () => { + await dataGrid.clickRowToggle({ isAnchorRow: true, renderMoreRows: true }); + await dataGrid.clickFieldActionInFlyout( + TEST_ANCHOR_FILTER_FIELD, + 'addFilterForValueButton' + ); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + return await filterBar.hasFilter(TEST_ANCHOR_FILTER_FIELD, TEST_ANCHOR_FILTER_VALUE, true); + }); + + await dataGrid.closeFlyout(); + + await retry.waitFor(`filter matching docs in data grid`, async () => { + const fields = await dataGrid.getFields(); + return fields + .map((row) => row[2]) + .every((fieldContent) => fieldContent === TEST_ANCHOR_FILTER_VALUE); + }); + }); + + it('inclusive filter should be toggleable via the filter bar', async function () { + await filterBar.addFilter({ + field: TEST_ANCHOR_FILTER_FIELD, + operation: 'is', + value: TEST_ANCHOR_FILTER_VALUE, + }); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + // disable filter + await filterBar.toggleFilterEnabled(TEST_ANCHOR_FILTER_FIELD); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + await retry.waitFor(`a disabled filter in filterbar`, async () => { + return await filterBar.hasFilter(TEST_ANCHOR_FILTER_FIELD, TEST_ANCHOR_FILTER_VALUE, false); + }); + + await retry.waitFor('filters are disabled', async () => { + const fields = await dataGrid.getFields(); + const hasOnlyFilteredRows = fields + .map((row) => row[2]) + .every((fieldContent) => fieldContent === TEST_ANCHOR_FILTER_VALUE); + return hasOnlyFilteredRows === false; + }); + }); + + it('filter for presence should be addable via expanded data grid rows', async function () { + await retry.waitFor('an exists filter in the filterbar', async () => { + await dataGrid.clickRowToggle({ isAnchorRow: true, renderMoreRows: true }); + await dataGrid.clickFieldActionInFlyout(TEST_ANCHOR_FILTER_FIELD, 'addExistsFilterButton'); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + return await filterBar.hasFilter(TEST_ANCHOR_FILTER_FIELD, 'exists', true); + }); + }); + + const addPinnedFilter = async () => { + await filterBar.addFilter({ + field: TEST_ANCHOR_FILTER_FIELD, + operation: 'is', + value: TEST_ANCHOR_FILTER_VALUE, + }); + await filterBar.toggleFilterPinned(TEST_ANCHOR_FILTER_FIELD); + }; + + const everyFieldMatches = async (matches: (field: string[]) => boolean) => { + const fields = await dataGrid.getFields(); + return fields.every(matches); + }; + + it('should update the data grid when a pinned filter is modified', async function () { + await addPinnedFilter(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await everyFieldMatches((field) => field[2] === TEST_ANCHOR_FILTER_VALUE)).to.be(true); + await filterBar.toggleFilterNegated(TEST_ANCHOR_FILTER_FIELD); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await everyFieldMatches((field) => field[2] === TEST_ANCHOR_FILTER_VALUE)).to.be( + false + ); + }); + + const expectFiltersToExist = async () => { + expect(await filterBar.getFilterCount()).to.be(2); + expect( + await filterBar.hasFilter(TEST_ANCHOR_FILTER_FIELD, TEST_ANCHOR_FILTER_VALUE, true, true) + ).to.be(true); + expect(await filterBar.hasFilter('extension', 'png')).to.be(true); + expect( + await everyFieldMatches( + (field) => field[1] === 'png' && field[2] === TEST_ANCHOR_FILTER_VALUE + ) + ).to.be(true); + }; + + it('should preserve filters when the page is refreshed', async function () { + await addPinnedFilter(); + await filterBar.addFilter({ field: 'extension', operation: 'is', value: 'png' }); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await expectFiltersToExist(); + await browser.refresh(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await expectFiltersToExist(); + }); + + it('should update filters when navigating forward and backward in history', async () => { + await filterBar.addFilter({ field: 'extension', operation: 'is', value: 'png' }); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(1); + expect(await filterBar.hasFilter('extension', 'png')).to.be(true); + expect(await everyFieldMatches((field) => field[1] === 'png')).to.be(true); + await browser.goBack(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(0); + expect(await everyFieldMatches((field) => field[1] === 'png')).to.be(false); + await browser.goForward(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(1); + expect(await filterBar.hasFilter('extension', 'png')).to.be(true); + expect(await everyFieldMatches((field) => field[1] === 'png')).to.be(true); + }); + + it('should add or filter', async () => { + await filterBar.addFilter({ + condition: 'OR', + filters: [ + { field: 'extension', operation: 'is', value: 'png' }, + { field: 'bytes', operation: 'is between', value: { from: '1000', to: '2000' } }, + ], + }); + + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(1); + expect(await filterBar.hasFilterWithId('0')).to.be(true); + + await filterBar.clickEditFilterById('0'); + + expect(await filterBar.getFilterEditorPreview()).to.equal( + 'extension: png OR bytes: 1,000B to 2KB' + ); + }); + + it('should add and filter', async () => { + await filterBar.addFilter({ + condition: 'AND', + filters: [ + { field: 'extension', operation: 'is one of', value: ['png', 'jpeg'] }, + { field: 'bytes', operation: 'is between', value: { from: '1000', to: '2000' } }, + ], + }); + + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(1); + expect(await filterBar.hasFilterWithId('0')).to.be(true); + + await filterBar.clickEditFilterById('0'); + + expect(await filterBar.getFilterEditorPreview()).to.equal( + 'extension: is one of png, jpeg AND bytes: 1,000B to 2KB' + ); + }); + + it('should add nested filters', async () => { + await filterBar.addFilter({ + condition: 'AND', + filters: [ + { + condition: 'OR', + filters: [ + { field: 'clientip', operation: 'does not exist' }, + { field: 'extension', operation: 'is one of', value: ['png', 'jpeg'] }, + ], + }, + { field: 'bytes', operation: 'is between', value: { from: '1000', to: '2000' } }, + ], + }); + + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(1); + expect(await filterBar.hasFilterWithId('0')).to.be(true); + + await filterBar.clickEditFilterById('0'); + + expect(await filterBar.getFilterEditorPreview()).to.equal( + '(NOT clientip: exists OR extension: is one of png, jpeg) AND bytes: 1,000B to 2KB' + ); + }); + + it('should add comma delimiter values', async () => { + await filterBar.addFilter({ field: 'extension', operation: 'is one of', value: 'png, jpeg' }); + + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(1); + expect(await filterBar.hasFilterWithId('0')).to.be(true); + + await filterBar.clickEditFilterById('0'); + + expect(await filterBar.getFilterEditorPreview()).to.equal('extension: is one of png, jpeg'); + }); + + it('should display the negated values correctly', async () => { + await filterBar.addFilter({ field: 'extension', operation: 'is not', value: 'png' }); + + await PageObjects.context.waitUntilContextLoadingHasFinished(); + expect(await filterBar.getFilterCount()).to.be(1); + const filterLabel = await filterBar.getFiltersLabel(); + expect(filterLabel[0]).to.be('NOT extension: png'); + + await filterBar.clickEditFilterById('0'); + await filterBar.addAndFilter('0'); + await filterBar.createFilter({ field: 'extension', operation: 'is', value: 'jpeg' }, '0.1'); + await testSubjects.clickWhenNotDisabled('saveFilter'); + + const filterLabelUpdated = await filterBar.getFiltersLabel(); + expect(filterLabelUpdated[0]).to.be('NOT extension: png AND extension: jpeg'); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/context/_size.ts b/x-pack/test_serverless/functional/test_suites/common/context/_size.ts new file mode 100644 index 0000000000000..2daebf6ed0f82 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/context/_size.ts @@ -0,0 +1,100 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +const TEST_INDEX_PATTERN = 'logstash-*'; +const TEST_ANCHOR_ID = 'AU_x3_BrGFA8no6QjjaI'; +const TEST_DEFAULT_CONTEXT_SIZE = 2; +const TEST_STEP_SIZE = 2; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const security = getService('security'); + const retry = getService('retry'); + const dataGrid = getService('dataGrid'); + const browser = getService('browser'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['context']); + let expectedRowLength = 2 * TEST_DEFAULT_CONTEXT_SIZE + 1; + + describe('context size', function contextSize() { + before(async function () { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await kibanaServer.uiSettings.update({ + 'context:defaultSize': `${TEST_DEFAULT_CONTEXT_SIZE}`, + 'context:step': `${TEST_STEP_SIZE}`, + }); + await PageObjects.context.navigateTo(TEST_INDEX_PATTERN, TEST_ANCHOR_ID); + }); + + it('should default to the `context:defaultSize` setting', async function () { + await retry.waitFor( + `number of rows displayed initially is ${expectedRowLength}`, + async function () { + const rows = await dataGrid.getRowsText(); + return rows.length === expectedRowLength; + } + ); + await retry.waitFor( + `predecessor count picker is set to ${TEST_DEFAULT_CONTEXT_SIZE}`, + async function () { + const predecessorCountPicker = await PageObjects.context.getPredecessorCountPicker(); + const value = await predecessorCountPicker.getAttribute('value'); + return value === String(TEST_DEFAULT_CONTEXT_SIZE); + } + ); + }); + + it('should increase according to the `context:step` setting when clicking the `load newer` button', async function () { + await PageObjects.context.clickPredecessorLoadMoreButton(); + expectedRowLength += TEST_STEP_SIZE; + + await retry.waitFor( + `number of rows displayed after clicking load more predecessors is ${expectedRowLength}`, + async function () { + const rows = await dataGrid.getRowsText(true); + return rows.length === expectedRowLength; + } + ); + }); + + it('should increase according to the `context:step` setting when clicking the `load older` button', async function () { + await PageObjects.context.clickSuccessorLoadMoreButton(); + expectedRowLength += TEST_STEP_SIZE; + + await retry.waitFor( + `number of rows displayed after clicking load more successors is ${expectedRowLength}`, + async function () { + const rows = await dataGrid.getRowsText(true); + return rows.length === expectedRowLength; + } + ); + }); + + it('should show 101 records when 50 newer and 50 older records are requests', async function () { + const predecessorCountPicker = await PageObjects.context.getPredecessorCountPicker(); + await predecessorCountPicker.clearValueWithKeyboard(); + await predecessorCountPicker.pressKeys('50'); + await predecessorCountPicker.pressKeys(browser.keys.ENTER); + + const successorCountPicker = await PageObjects.context.getSuccessorCountPicker(); + await successorCountPicker.clearValueWithKeyboard(); + await successorCountPicker.pressKeys('50'); + await successorCountPicker.pressKeys(browser.keys.ENTER); + + await retry.waitFor( + `number of rows displayed after clicking load more successors is ${expectedRowLength}`, + async function () { + const dataGridWrapper = await testSubjects.find('discoverDocTable'); + const length = await dataGridWrapper.getAttribute('data-document-number'); + return Number(length) === 101; + } + ); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/context/index.ts b/x-pack/test_serverless/functional/test_suites/common/context/index.ts new file mode 100644 index 0000000000000..9ed486999e9f6 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/context/index.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 { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ + getService, + getPageObjects, + loadTestFile, + getPageObject, +}: FtrProviderContext) { + const browser = getService('browser'); + const esArchiver = getService('esArchiver'); + const PageObjects = getPageObjects(['common']); + const kibanaServer = getService('kibanaServer'); + const svlCommonPage = getPageObject('svlCommonPage'); + + describe('context app', function () { + before(async () => { + await browser.setWindowSize(1200, 800); + // TODO: Serverless tests require login first + await svlCommonPage.login(); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/visualize.json'); + await kibanaServer.uiSettings.replace({ defaultIndex: 'logstash-*' }); + await PageObjects.common.navigateToApp('discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/visualize.json' + ); + }); + + loadTestFile(require.resolve('./_context_navigation')); + loadTestFile(require.resolve('./_discover_navigation')); + loadTestFile(require.resolve('./_filters')); + loadTestFile(require.resolve('./_size')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts new file mode 100644 index 0000000000000..5b95dace01a6d --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts @@ -0,0 +1,154 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const browser = getService('browser'); + const dataGrid = getService('dataGrid'); + const dashboardAddPanel = getService('dashboardAddPanel'); + const dashboardPanelActions = getService('dashboardPanelActions'); + const dashboardReplacePanel = getService('dashboardReplacePanel'); + const filterBar = getService('filterBar'); + const queryBar = getService('queryBar'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['common', 'dashboard', 'header', 'timePicker', 'discover']); + + describe('discover saved search embeddable', () => { + before(async () => { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/dashboard/current/data'); + await kibanaServer.savedObjects.cleanStandardList(); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/dashboard/current/kibana' + ); + await kibanaServer.uiSettings.replace({ + defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c', + }); + await PageObjects.common.setTime({ + from: 'Sep 22, 2015 @ 00:00:00.000', + to: 'Sep 23, 2015 @ 00:00:00.000', + }); + }); + + after(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await PageObjects.common.unsetTime(); + }); + + beforeEach(async () => { + await PageObjects.dashboard.navigateToApp(); + await filterBar.ensureFieldEditorModalIsClosed(); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + }); + + const addSearchEmbeddableToDashboard = async () => { + await dashboardAddPanel.addSavedSearch('Rendering-Test:-saved-search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.dashboard.waitForRenderComplete(); + const rows = await dataGrid.getDocTableRows(); + expect(rows.length).to.be.above(0); + }; + + const refreshDashboardPage = async () => { + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.dashboard.waitForRenderComplete(); + }; + + it('can save a search embeddable with a defined rows per page number', async function () { + const dashboardName = 'Dashboard with a Paginated Saved Search'; + await addSearchEmbeddableToDashboard(); + await dataGrid.checkCurrentRowsPerPageToBe(100); + + await PageObjects.dashboard.saveDashboard(dashboardName, { + waitDialogIsClosed: true, + exitFromEditMode: false, + }); + + await refreshDashboardPage(); + + await dataGrid.checkCurrentRowsPerPageToBe(100); + + await dataGrid.changeRowsPerPageTo(10); + + await PageObjects.dashboard.saveDashboard(dashboardName); + await refreshDashboardPage(); + + await dataGrid.checkCurrentRowsPerPageToBe(10); + }); + + it('should control columns correctly', async () => { + await addSearchEmbeddableToDashboard(); + await PageObjects.dashboard.switchToEditMode(); + + const cell = await dataGrid.getCellElement(0, 2); + expect(await cell.getVisibleText()).to.be('Sep 22, 2015 @ 23:50:13.253'); + await dataGrid.clickMoveColumnLeft('agent'); + + const cellAfter = await dataGrid.getCellElement(0, 2); + expect(await cellAfter.getVisibleText()).to.be( + 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)' + ); + + await dataGrid.clickRemoveColumn('agent'); + expect(await cell.getVisibleText()).to.be('Sep 22, 2015 @ 23:50:13.253'); + }); + + it('should render duplicate saved search embeddables', async () => { + await addSearchEmbeddableToDashboard(); + await addSearchEmbeddableToDashboard(); + const [firstGridCell, secondGridCell] = await dataGrid.getAllCellElements(); + const firstGridCellContent = await firstGridCell.getVisibleText(); + const secondGridCellContent = await secondGridCell.getVisibleText(); + + expect(firstGridCellContent).to.be.equal(secondGridCellContent); + }); + + it('should display an error', async () => { + await addSearchEmbeddableToDashboard(); + await queryBar.setQuery('bytes > 5000'); + await queryBar.submitQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + expect(await PageObjects.discover.getSavedSearchDocumentCount()).to.be('2,572 documents'); + await queryBar.setQuery('this < is not : a valid > query'); + await queryBar.submitQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + const embeddableError = await testSubjects.find('embeddableError'); + const errorMessage = await embeddableError.findByTestSubject('errorMessageMarkdown'); + expect(await errorMessage.getVisibleText()).to.equal( + 'Expected AND, OR, end of input, whitespace but "n" found. this < is not : a valid > query ----------^' + ); + }); + + it('should replace a panel with a saved search', async () => { + await dashboardAddPanel.addVisualization('Rendering Test: datatable'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.dashboard.waitForRenderComplete(); + await dashboardPanelActions.replacePanelByTitle('Rendering Test: datatable'); + await dashboardReplacePanel.replaceEmbeddable('Rendering-Test:-saved-search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.dashboard.waitForRenderComplete(); + await testSubjects.missingOrFail('embeddableError'); + expect(await PageObjects.discover.getSavedSearchDocumentCount()).to.be('4,633 documents'); + }); + + it('should not show the full screen button', async () => { + await addSearchEmbeddableToDashboard(); + await testSubjects.missingOrFail('dataGridFullScreenButton'); + }); + + it('should show the the grid toolbar', async () => { + await addSearchEmbeddableToDashboard(); + await testSubjects.existOrFail('dscGridToolbar'); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/index.ts new file mode 100644 index 0000000000000..c27f827e74ff2 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/index.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 { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile, getPageObject }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const svlCommonPage = getPageObject('svlCommonPage'); + + describe('discover/embeddable', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + // TODO: Serverless tests require login first + await svlCommonPage.login(); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_saved_search_embeddable')); + }); +} 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 new file mode 100644 index 0000000000000..684278f7e8638 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover.ts @@ -0,0 +1,341 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const browser = getService('browser'); + const log = getService('log'); + const retry = getService('retry'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const queryBar = getService('queryBar'); + const inspector = getService('inspector'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'header', + 'timePicker', + 'unifiedFieldList', + ]); + + const defaultSettings = { + defaultIndex: 'logstash-*', + }; + + describe('discover test', function describeIndexTests() { + before(async function () { + log.debug('load kibana index with default index pattern'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + // and load a set of makelogs data + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + after(async () => { + await kibanaServer.savedObjects.clean({ types: ['search', 'index-pattern'] }); + }); + describe('query', function () { + const queryName1 = 'Query # 1'; + + it('should show correct time range string by timepicker', async function () { + const time = await PageObjects.timePicker.getTimeConfig(); + expect(time.start).to.be(PageObjects.timePicker.defaultStartTime); + expect(time.end).to.be(PageObjects.timePicker.defaultEndTime); + const rowData = await PageObjects.discover.getDocTableIndex(1); + log.debug('check the newest doc timestamp in UTC (check diff timezone in last test)'); + expect(rowData).to.contain('Sep 22, 2015 @ 23:50:13.253'); + }); + + it('save query should show toast message and display query name', async function () { + await PageObjects.discover.saveSearch(queryName1); + const actualQueryNameString = await PageObjects.discover.getCurrentQueryName(); + expect(actualQueryNameString).to.be(queryName1); + }); + + it('load query should show query name', async function () { + await PageObjects.discover.loadSavedSearch(queryName1); + + await retry.try(async function () { + expect(await PageObjects.discover.getCurrentQueryName()).to.be(queryName1); + }); + }); + + it('renaming a saved query should modify name in breadcrumb', async function () { + const queryName2 = 'Modified Query # 1'; + await PageObjects.discover.loadSavedSearch(queryName1); + await PageObjects.discover.saveSearch(queryName2); + + await retry.try(async function () { + expect(await PageObjects.discover.getCurrentQueryName()).to.be(queryName2); + }); + }); + + it('should show the correct hit count', async function () { + const expectedHitCount = '14,004'; + await retry.try(async function () { + expect(await PageObjects.discover.getHitCount()).to.be(expectedHitCount); + }); + }); + + it('should show correct time range string in chart', async function () { + const actualTimeString = await PageObjects.discover.getChartTimespan(); + const expectedTimeString = `${PageObjects.timePicker.defaultStartTime} - ${PageObjects.timePicker.defaultEndTime} (interval: Auto - 3 hours)`; + expect(actualTimeString).to.be(expectedTimeString); + }); + + it('should modify the time range when a bar is clicked', async function () { + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.clickHistogramBar(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + const time = await PageObjects.timePicker.getTimeConfig(); + // TODO: The Serverless sidebar causes `PageObjects.discover.clickHistogramBar()` + // to click a different range in the histogram, resulting in a different duration + expect(time.start).to.be('Sep 19, 2015 @ 06:31:44.000'); + expect(time.end).to.be('Sep 23, 2015 @ 18:31:44.000'); + await retry.waitForWithTimeout( + 'table to contain the right search result', + 3000, + async () => { + const rowData = await PageObjects.discover.getDocTableField(1); + log.debug(`The first timestamp value in doc table: ${rowData}`); + // TODO: The Serverless sidebar causes `PageObjects.discover.clickHistogramBar()` + // to click a different range in the histogram, resulting in a different timestamp + return rowData.includes('Sep 22, 2015 @ 23:50:13.253'); + } + ); + }); + + it('should show correct initial chart interval of Auto', async function () { + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await testSubjects.click('unifiedHistogramQueryHits'); // to cancel out tooltips + const actualInterval = await PageObjects.discover.getChartInterval(); + + const expectedInterval = 'Auto'; + expect(actualInterval).to.be(expectedInterval); + }); + + it('should not show "no results"', async () => { + const isVisible = await PageObjects.discover.hasNoResults(); + expect(isVisible).to.be(false); + }); + + it('should reload the saved search with persisted query to show the initial hit count', async function () { + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // apply query some changes + await queryBar.setQuery('test'); + await queryBar.submitQuery(); + await retry.try(async function () { + expect(await PageObjects.discover.getHitCount()).to.be('22'); + }); + + // reset to persisted state + await queryBar.clearQuery(); + await PageObjects.discover.revertUnsavedChanges(); + const expectedHitCount = '14,004'; + await retry.try(async function () { + expect(await queryBar.getQueryString()).to.be(''); + expect(await PageObjects.discover.getHitCount()).to.be(expectedHitCount); + }); + }); + }); + + describe('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'; + + before(async () => { + log.debug('setAbsoluteRangeForAnotherQuery'); + await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should show "no results"', async () => { + await retry.waitFor('no results screen is displayed', async function () { + const isVisible = await PageObjects.discover.hasNoResults(); + return isVisible === true; + }); + }); + + it('should suggest a new time range is picked', async () => { + const isVisible = await PageObjects.discover.hasNoResultsTimepicker(); + expect(isVisible).to.be(true); + }); + + it('should show matches when time range is expanded', async () => { + await PageObjects.discover.expandTimeRangeAsSuggestedInNoResultsMessage(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await retry.try(async function () { + expect(await PageObjects.discover.hasNoResults()).to.be(false); + expect(await PageObjects.discover.getHitCountInt()).to.be.above(0); + }); + }); + }); + + describe('nested query', () => { + before(async () => { + log.debug('setAbsoluteRangeForAnotherQuery'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should support querying on nested fields', async function () { + await queryBar.setQuery('nestedField:{ child: nestedValue }'); + await queryBar.submitQuery(); + await retry.try(async function () { + expect(await PageObjects.discover.getHitCount()).to.be('1'); + }); + }); + }); + + describe('data-shared-item', function () { + it('should have correct data-shared-item title and description', async () => { + const expected = { + title: 'A Saved Search', + description: 'A Saved Search Description', + }; + + await retry.try(async () => { + await PageObjects.discover.loadSavedSearch(expected.title); + const { title, description } = + await PageObjects.common.getSharedItemTitleAndDescription(); + expect(title).to.eql(expected.title); + expect(description).to.eql(expected.description); + }); + }); + }); + + describe('time zone switch', () => { + it('should show bars in the correct time zone after switching', async function () { + await kibanaServer.uiSettings.update({ 'dateFormat:tz': 'America/Phoenix' }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.awaitKibanaChrome(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await queryBar.clearQuery(); + + log.debug( + 'check that the newest doc timestamp is now -7 hours from the UTC time in the first test' + ); + const rowData = await PageObjects.discover.getDocTableIndex(1); + expect(rowData.startsWith('Sep 22, 2015 @ 16:50:13.253')).to.be.ok(); + }); + }); + + describe('invalid time range in URL', function () { + it('should get the default timerange', async function () { + await PageObjects.common.navigateToUrl('discover', '#/?_g=(time:(from:now-15m,to:null))', { + useActualUrl: true, + }); + await PageObjects.header.awaitKibanaChrome(); + const time = await PageObjects.timePicker.getTimeConfig(); + expect(time.start).to.be('~ 15 minutes ago'); + expect(time.end).to.be('now'); + }); + }); + + describe('managing fields', function () { + it('should add a field, sort by it, remove it and also sorting by it', async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('_score'); + await PageObjects.discover.clickFieldSort('_score', 'Sort Low-High'); + const currentUrlWithScore = await browser.getCurrentUrl(); + expect(currentUrlWithScore).to.contain('_score'); + await PageObjects.unifiedFieldList.clickFieldListItemRemove('_score'); + const currentUrlWithoutScore = await browser.getCurrentUrl(); + expect(currentUrlWithoutScore).not.to.contain('_score'); + }); + it('should add a field with customLabel, sort by it, display it correctly', async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('referer'); + await PageObjects.discover.clickFieldSort('referer', 'Sort A-Z'); + expect(await PageObjects.discover.getDocHeader()).to.have.string('Referer custom'); + expect(await PageObjects.unifiedFieldList.getAllFieldNames()).to.contain('Referer custom'); + const url = await browser.getCurrentUrl(); + expect(url).to.contain('referer'); + }); + }); + + describe('refresh interval', function () { + it('should refetch when autofresh is enabled', async () => { + const intervalS = 5; + await PageObjects.timePicker.startAutoRefresh(intervalS); + + const getRequestTimestamp = async () => { + // check inspector panel request stats for timestamp + await inspector.open(); + const requestStats = await inspector.getTableData(); + const requestStatsRow = requestStats.filter( + (r) => r && r[0] && r[0].includes('Request timestamp') + ); + if (!requestStatsRow || !requestStatsRow[0] || !requestStatsRow[0][1]) { + return ''; + } + await inspector.close(); + return requestStatsRow[0][1]; + }; + + const requestTimestampBefore = await getRequestTimestamp(); + await retry.waitFor('refetch because of refresh interval', async () => { + const requestTimestampAfter = await getRequestTimestamp(); + log.debug( + `Timestamp before: ${requestTimestampBefore}, Timestamp after: ${requestTimestampAfter}` + ); + return Boolean(requestTimestampAfter) && requestTimestampBefore !== requestTimestampAfter; + }); + }); + + after(async () => { + await inspector.close(); + await PageObjects.timePicker.pauseAutoRefresh(); + }); + }); + + describe('resizable layout panels', () => { + it('should allow resizing the histogram layout panels', async () => { + const resizeDistance = 100; + const topPanel = await testSubjects.find('unifiedHistogramResizablePanelFixed'); + const mainPanel = await testSubjects.find('unifiedHistogramResizablePanelFlex'); + const resizeButton = await testSubjects.find('unifiedHistogramResizableButton'); + const topPanelSize = (await topPanel.getPosition()).height; + const mainPanelSize = (await mainPanel.getPosition()).height; + await browser.dragAndDrop( + { location: resizeButton }, + { location: { x: 0, y: resizeDistance } } + ); + const newTopPanelSize = (await topPanel.getPosition()).height; + const newMainPanelSize = (await mainPanel.getPosition()).height; + expect(newTopPanelSize).to.be(topPanelSize + resizeDistance); + expect(newMainPanelSize).to.be(mainPanelSize - resizeDistance); + }); + + it('should allow resizing the sidebar layout panels', async () => { + const resizeDistance = 100; + const leftPanel = await testSubjects.find('discoverLayoutResizablePanelFixed'); + const mainPanel = await testSubjects.find('discoverLayoutResizablePanelFlex'); + const resizeButton = await testSubjects.find('discoverLayoutResizableButton'); + const leftPanelSize = (await leftPanel.getPosition()).width; + const mainPanelSize = (await mainPanel.getPosition()).width; + await browser.dragAndDrop( + { location: resizeButton }, + { location: { x: resizeDistance, y: 0 } } + ); + const newLeftPanelSize = (await leftPanel.getPosition()).width; + const newMainPanelSize = (await mainPanel.getPosition()).width; + expect(newLeftPanelSize).to.be(leftPanelSize + resizeDistance); + expect(newMainPanelSize).to.be(mainPanelSize - resizeDistance); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts new file mode 100644 index 0000000000000..becf81ab3da9f --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts @@ -0,0 +1,336 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 type { TimeStrings } from '../../../../../../../test/functional/page_objects/common_page'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const elasticChart = getService('elasticChart'); + const kibanaServer = getService('kibanaServer'); + const security = getService('security'); + const PageObjects = getPageObjects([ + 'timePicker', + 'dashboard', + 'settings', + 'discover', + 'common', + 'header', + ]); + const defaultSettings = { + defaultIndex: 'long-window-logstash-*', + 'dateFormat:tz': 'Europe/Berlin', + }; + const testSubjects = getService('testSubjects'); + const browser = getService('browser'); + const retry = getService('retry'); + const log = getService('log'); + const queryBar = getService('queryBar'); + + describe('discover histogram', function describeIndexTests() { + before(async () => { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await esArchiver.load('test/functional/fixtures/es_archiver/long_window_logstash'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/long_window_logstash_index_pattern' + ); + await security.testUser.setRoles(['kibana_admin', 'long_window_logstash']); + await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + }); + after(async () => { + await esArchiver.unload('test/functional/fixtures/es_archiver/long_window_logstash'); + await kibanaServer.savedObjects.cleanStandardList(); + await security.testUser.restoreDefaults(); + await PageObjects.common.unsetTime(); + }); + + async function prepareTest(time: TimeStrings, interval?: string) { + await PageObjects.common.setTime(time); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + if (interval) { + await PageObjects.discover.setChartInterval(interval); + await PageObjects.header.waitUntilLoadingHasFinished(); + } + } + + it('should modify the time range when the histogram is brushed', async function () { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // this is the number of renderings of the histogram needed when new data is fetched + let renderingCountInc = 1; + const prevRenderingCount = await elasticChart.getVisualizationRenderingCount(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await retry.waitFor('chart rendering complete', async () => { + const actualCount = await elasticChart.getVisualizationRenderingCount(); + const expectedCount = prevRenderingCount + renderingCountInc; + log.debug(`renderings before brushing - actual: ${actualCount} expected: ${expectedCount}`); + return actualCount === expectedCount; + }); + let prevRowData = ''; + // to make sure the table is already rendered + await retry.try(async () => { + prevRowData = await PageObjects.discover.getDocTableField(1); + log.debug(`The first timestamp value in doc table before brushing: ${prevRowData}`); + }); + + await PageObjects.discover.brushHistogram(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + renderingCountInc = 2; + await retry.waitFor('chart rendering complete after being brushed', async () => { + const actualCount = await elasticChart.getVisualizationRenderingCount(); + const expectedCount = prevRenderingCount + renderingCountInc * 2; + log.debug(`renderings after brushing - actual: ${actualCount} expected: ${expectedCount}`); + return actualCount <= expectedCount; + }); + const newDurationHours = await PageObjects.timePicker.getTimeDurationInHours(); + // TODO: The Serverless sidebar causes `PageObjects.discover.brushHistogram()` + // to brush a different range in the histogram, resulting in a different duration + expect(Math.round(newDurationHours)).to.be(31); + + await retry.waitFor('doc table containing the documents of the brushed range', async () => { + const rowData = await PageObjects.discover.getDocTableField(1); + log.debug(`The first timestamp value in doc table after brushing: ${rowData}`); + return prevRowData !== rowData; + }); + }); + + it('should update correctly when switching data views and brushing the histogram', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.selectIndexPattern('logstash-*'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.selectIndexPattern('long-window-logstash-*'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.brushHistogram(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // TODO: The Serverless sidebar causes `PageObjects.discover.brushHistogram()` + // to brush a different range in the histogram, resulting in a different count + expect(await PageObjects.discover.getHitCount()).to.be('12'); + }); + + it('should update the histogram timerange when the query is resubmitted', async function () { + await kibanaServer.uiSettings.update({ + 'timepicker:timeDefaults': '{ "from": "2015-09-18T19:37:13.000Z", "to": "now"}', + }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.awaitKibanaChrome(); + const initialTimeString = await PageObjects.discover.getChartTimespan(); + await queryBar.clickQuerySubmitButton(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitFor('chart timespan to have changed', async () => { + const refreshedTimeString = await PageObjects.discover.getChartTimespan(); + await queryBar.clickQuerySubmitButton(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + log.debug( + `Timestamp before: ${initialTimeString}, Timestamp after: ${refreshedTimeString}` + ); + return refreshedTimeString !== initialTimeString; + }); + }); + + it('should visualize monthly data with different day intervals', async () => { + const from = 'Nov 1, 2017 @ 00:00:00.000'; + const to = 'Mar 21, 2018 @ 00:00:00.000'; + await prepareTest({ from, to }, 'Month'); + const chartCanvasExist = await elasticChart.canvasExists(); + expect(chartCanvasExist).to.be(true); + }); + it('should visualize weekly data with within DST changes', async () => { + const from = 'Mar 1, 2018 @ 00:00:00.000'; + const to = 'May 1, 2018 @ 00:00:00.000'; + await prepareTest({ from, to }, 'Week'); + const chartCanvasExist = await elasticChart.canvasExists(); + expect(chartCanvasExist).to.be(true); + }); + it('should visualize monthly data with different years scaled to 30 days', async () => { + const from = 'Jan 1, 2010 @ 00:00:00.000'; + const to = 'Mar 21, 2019 @ 00:00:00.000'; + await prepareTest({ from, to }, 'Day'); + const chartCanvasExist = await elasticChart.canvasExists(); + expect(chartCanvasExist).to.be(true); + const chartIntervalIconTip = await PageObjects.discover.getChartIntervalWarningIcon(); + expect(chartIntervalIconTip).to.be(true); + }); + it('should allow hide/show histogram, persisted in url state', async () => { + const from = 'Jan 1, 2010 @ 00:00:00.000'; + const to = 'Mar 21, 2019 @ 00:00:00.000'; + await prepareTest({ from, to }); + let canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(true); + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + await retry.try(async () => { + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(false); + }); + // histogram is hidden, when reloading the page it should remain hidden + await browser.refresh(); + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(false); + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await retry.try(async () => { + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(true); + }); + }); + it('should allow hiding the histogram, persisted in saved search', async () => { + const from = 'Jan 1, 2010 @ 00:00:00.000'; + const to = 'Mar 21, 2019 @ 00:00:00.000'; + const savedSearch = 'persisted hidden histogram'; + await prepareTest({ from, to }); + + // close chart for saved search + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + let canvasExists: boolean; + await retry.try(async () => { + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(false); + }); + + // save search + await PageObjects.discover.saveSearch(savedSearch); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // open new search + await PageObjects.discover.clickNewSearchButton(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // load saved search + await PageObjects.discover.loadSavedSearch(savedSearch); + await PageObjects.header.waitUntilLoadingHasFinished(); + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(false); + + // open chart for saved search + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + await retry.waitFor(`Discover histogram to be displayed`, async () => { + canvasExists = await elasticChart.canvasExists(); + return canvasExists; + }); + + // save search + await PageObjects.discover.saveSearch(savedSearch); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // open new search + await PageObjects.discover.clickNewSearchButton(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // load saved search + await PageObjects.discover.loadSavedSearch(savedSearch); + await PageObjects.header.waitUntilLoadingHasFinished(); + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(true); + }); + it('should show permitted hidden histogram state when returning back to discover', async () => { + // close chart + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + let canvasExists: boolean; + await retry.try(async () => { + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(false); + }); + + // save search + await PageObjects.discover.saveSearch('persisted hidden histogram'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // open chart + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + await retry.try(async () => { + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(true); + }); + + // go to dashboard + await PageObjects.dashboard.navigateToApp(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // go to discover + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(true); + + // close chart + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + await retry.try(async () => { + canvasExists = await elasticChart.canvasExists(); + expect(canvasExists).to.be(false); + }); + }); + + it('should recover from broken query search when clearing the query bar', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + // Make sure the chart is visible + await testSubjects.click('unifiedHistogramChartOptionsToggle'); + await testSubjects.click('unifiedHistogramChartToggle'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // type an invalid search query, hit refresh + await queryBar.setQuery('this is > not valid'); + await queryBar.submitQuery(); + + await PageObjects.discover.showsErrorCallout(); + + // now remove the query + await queryBar.clearQuery(); + await queryBar.submitQuery(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // check no error state + expect(await PageObjects.discover.isChartVisible()).to.be(true); + }); + + it('should reset all histogram state when resetting the saved search', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + const savedSearch = 'histogram state'; + await PageObjects.discover.saveSearch(savedSearch); + await PageObjects.discover.chooseBreakdownField('extension.keyword'); + await PageObjects.discover.setChartInterval('Second'); + let requestData = await testSubjects.getAttribute( + 'unifiedHistogramChart', + 'data-request-data' + ); + expect(JSON.parse(requestData)).to.eql({ + dataViewId: 'long-window-logstash-*', + timeField: '@timestamp', + timeInterval: 's', + breakdownField: 'extension.keyword', + }); + await PageObjects.discover.toggleChartVisibility(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.revertUnsavedChanges(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + requestData = await testSubjects.getAttribute('unifiedHistogramChart', 'data-request-data'); + expect(JSON.parse(requestData)).to.eql({ + dataViewId: 'long-window-logstash-*', + timeField: '@timestamp', + timeInterval: 'auto', + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts new file mode 100644 index 0000000000000..13629a6007937 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_url_state.ts @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const browser = getService('browser'); + const log = getService('log'); + const retry = getService('retry'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const filterBar = getService('filterBar'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'header', + 'timePicker', + 'unifiedFieldList', + 'visualize', + 'svlCommonNavigation', + ]); + + const defaultSettings = { + defaultIndex: 'logstash-*', + }; + + describe('discover URL state', () => { + before(async function () { + log.debug('load kibana index with default index pattern'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + // and load a set of makelogs data + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + }); + + after(async () => { + await kibanaServer.savedObjects.clean({ types: ['search', 'index-pattern'] }); + }); + + it('should show a warning and fall back to the default data view when navigating to a URL with an invalid data view ID', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.header.waitUntilLoadingHasFinished(); + const dataViewId = await PageObjects.discover.getCurrentDataViewId(); + const originalUrl = await browser.getCurrentUrl(); + const newUrl = originalUrl.replace(dataViewId, 'invalid-data-view-id'); + await browser.get(newUrl); + await PageObjects.header.waitUntilLoadingHasFinished(); + await retry.try(async () => { + expect(await browser.getCurrentUrl()).to.be(originalUrl); + expect(await testSubjects.exists('dscDataViewNotFoundShowDefaultWarning')).to.be(true); + }); + }); + + it('should show a warning and fall back to the current data view if the URL is updated to an invalid data view ID', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + const originalHash = await browser.execute<[], string>('return window.location.hash'); + const dataViewId = await PageObjects.discover.getCurrentDataViewId(); + const newHash = originalHash.replace(dataViewId, 'invalid-data-view-id'); + await browser.execute(`window.location.hash = "${newHash}"`); + await PageObjects.header.waitUntilLoadingHasFinished(); + await retry.try(async () => { + const currentHash = await browser.execute<[], string>('return window.location.hash'); + expect(currentHash).to.be(originalHash); + expect(await testSubjects.exists('dscDataViewNotFoundShowSavedWarning')).to.be(true); + }); + }); + + describe('Side nav', function () { + // Discover does not exist in Serverless O11y side nav (Log Explorer instead) + this.tags('skipSvlOblt'); + + it('should sync Lens global state to Discover sidebar link and carry over the state when navigating to Discover', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.common.navigateToApp('lens'); + // TODO: Sidebar links works differently in Serverless + let discoverLink = await PageObjects.svlCommonNavigation.sidenav.findLink({ + deepLinkId: 'discover', + }); + expect(await discoverLink?.getAttribute('href')).to.contain( + '/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-15m,to:now))' + + "&_a=(columns:!(),filters:!(),index:'logstash-*',interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))" + ); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await filterBar.addFilter({ + field: 'extension.raw', + operation: 'is one of', + value: ['jpg', 'css'], + }); + await filterBar.toggleFilterPinned('extension.raw'); + await PageObjects.header.waitUntilLoadingHasFinished(); + discoverLink = await PageObjects.svlCommonNavigation.sidenav.findLink({ + deepLinkId: 'discover', + }); + expect(await discoverLink?.getAttribute('href')).to.contain( + "/app/discover#/?_g=(filters:!(('$state':(store:globalState)," + + "meta:(alias:!n,disabled:!f,field:extension.raw,index:'logstash-*'," + + 'key:extension.raw,negate:!f,params:!(jpg,css),type:phrases,value:!(jpg,css)),' + + 'query:(bool:(minimum_should_match:1,should:!((match_phrase:(extension.raw:jpg)),' + + "(match_phrase:(extension.raw:css))))))),query:(language:kuery,query:'')," + + "refreshInterval:(pause:!t,value:60000),time:(from:'2015-09-19T06:31:44.000Z'," + + "to:'2015-09-23T18:31:44.000Z'))&_a=(columns:!(),filters:!(),index:'logstash-*'," + + "interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))" + ); + await PageObjects.svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'discover' }); + await PageObjects.header.waitUntilLoadingHasFinished(); + expect(await filterBar.hasFilter('extension.raw', '', undefined, true)).to.be(true); + expect(await filterBar.isFilterPinned('extension.raw')).to.be(true); + expect(await PageObjects.timePicker.getTimeConfig()).to.eql({ + start: 'Sep 19, 2015 @ 06:31:44.000', + end: 'Sep 23, 2015 @ 18:31:44.000', + }); + expect(await PageObjects.discover.getHitCount()).to.be('11,268'); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/index.ts new file mode 100644 index 0000000000000..0365d037e8f32 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/index.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile, getPageObject }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const svlCommonPage = getPageObject('svlCommonPage'); + + describe('discover/group1', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + // TODO: Serverless tests require login first + await svlCommonPage.login(); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_discover')); + loadTestFile(require.resolve('./_discover_histogram')); + loadTestFile(require.resolve('./_url_state')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/_adhoc_data_views.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_adhoc_data_views.ts new file mode 100644 index 0000000000000..03dd58892e5cf --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_adhoc_data_views.ts @@ -0,0 +1,279 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const dataGrid = getService('dataGrid'); + const toasts = getService('toasts'); + const esArchiver = getService('esArchiver'); + const filterBar = getService('filterBar'); + const fieldEditor = getService('fieldEditor'); + const dashboardAddPanel = getService('dashboardAddPanel'); + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const queryBar = getService('queryBar'); + const testSubjects = getService('testSubjects'); + const browser = getService('browser'); + const PageObjects = getPageObjects([ + 'common', + 'unifiedSearch', + 'discover', + 'timePicker', + 'settings', + 'header', + 'context', + 'dashboard', + 'unifiedFieldList', + 'svlCommonNavigation', + ]); + const security = getService('security'); + + const addSearchToDashboard = async (name: string) => { + await dashboardAddPanel.addSavedSearch(name); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.dashboard.waitForRenderComplete(); + }; + + describe('adhoc data views', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover.json'); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await PageObjects.common.navigateToApp('discover'); + }); + + after(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.unload('x-pack/test/functional/es_archives/logstash_functional'); + }); + + it('should navigate back correctly from to surrounding and single views', async () => { + await PageObjects.discover.createAdHocDataView('logstash', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + const first = await PageObjects.discover.getCurrentDataViewId(); + + await PageObjects.discover.addRuntimeField( + '_bytes-runtimefield', + `emit(doc["bytes"].value.toString())` + ); + await PageObjects.unifiedFieldList.clickFieldListItemToggle('_bytes-runtimefield'); + + const second = await PageObjects.discover.getCurrentDataViewId(); + expect(first).not.to.equal(second); + + // navigate to context view + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const [, surrDocs] = await dataGrid.getRowActions({ rowIndex: 0 }); + await surrDocs.click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ deepLinkId: 'discover' }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.be('logstash*'); + + // navigate to single doc view + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const [singleView] = await dataGrid.getRowActions({ rowIndex: 0 }); + await singleView.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ deepLinkId: 'discover' }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await PageObjects.discover.getCurrentlySelectedDataView()).to.be('logstash*'); + }); + + it('should support query and filtering', async () => { + await filterBar.addFilter({ + field: 'nestedField.child', + operation: 'is', + value: 'nestedValue', + }); + expect(await filterBar.hasFilter('nestedField.child', 'nestedValue')).to.be(true); + await retry.try(async function () { + expect(await PageObjects.discover.getHitCount()).to.be('1'); + }); + await filterBar.removeFilter('nestedField.child'); + + await queryBar.setQuery('test'); + await queryBar.submitQuery(); + await retry.try(async () => expect(await PageObjects.discover.getHitCount()).to.be('22')); + + await queryBar.clearQuery(); + await queryBar.submitQuery(); + }); + + it('should not update data view id when saving search first time', async () => { + const prevDataViewId = await PageObjects.discover.getCurrentDataViewId(); + + await PageObjects.discover.saveSearch('logstash*-ss'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const newDataViewId = await PageObjects.discover.getCurrentDataViewId(); + + expect(prevDataViewId).to.equal(newDataViewId); + }); + + it('should update data view id when saving new search copy', async () => { + const prevDataViewId = await PageObjects.discover.getCurrentDataViewId(); + + await PageObjects.discover.saveSearch('logstash*-ss-new', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const newDataViewId = await PageObjects.discover.getCurrentDataViewId(); + + expect(prevDataViewId).not.to.equal(newDataViewId); + }); + + it('search results should be different after data view update', async () => { + await PageObjects.discover.createAdHocDataView('logst', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + const prevDataViewId = await PageObjects.discover.getCurrentDataViewId(); + + // trigger data view id update + await PageObjects.discover.addRuntimeField( + '_bytes-runtimefield', + `emit(doc["bytes"].value.toString())` + ); + await PageObjects.unifiedFieldList.clickFieldListItemToggle('_bytes-runtimefield'); + const newDataViewId = await PageObjects.discover.getCurrentDataViewId(); + expect(newDataViewId).not.to.equal(prevDataViewId); + + // save first search + await PageObjects.discover.saveSearch('logst*-ss-_bytes-runtimefield'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // remove field and create with the same name, but different value + await PageObjects.unifiedFieldList.clickFieldListItemRemove('_bytes-runtimefield'); + await PageObjects.discover.removeField('_bytes-runtimefield'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // trigger data view id update + await PageObjects.discover.addRuntimeField( + '_bytes-runtimefield', + `emit((doc["bytes"].value * 2).toString())` + ); + await PageObjects.unifiedFieldList.clickFieldListItemToggle('_bytes-runtimefield'); + + // save second search + await PageObjects.discover.saveSearch('logst*-ss-_bytes-runtimefield-updated', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // open searches on dashboard + await PageObjects.dashboard.navigateToApp(); + await filterBar.ensureFieldEditorModalIsClosed(); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + + await addSearchToDashboard('logst*-ss-_bytes-runtimefield'); + await addSearchToDashboard('logst*-ss-_bytes-runtimefield-updated'); + + const [firstSearchCell, secondSearchCell] = await dataGrid.getAllCellElements(0, 3); + const first = await firstSearchCell.getVisibleText(); + const second = await secondSearchCell.getVisibleText(); + + expect(+second).to.equal(+first * 2); + }); + + it('should open saved search by navigation to context from embeddable', async () => { + // navigate to context view + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const [, surrDocs] = await dataGrid.getRowActions({ rowIndex: 0 }); + await surrDocs.click(); + + // close popup + const alert = await browser.getAlert(); + await alert?.accept(); + if (await testSubjects.exists('confirmModalConfirmButton')) { + await testSubjects.click('confirmModalConfirmButton'); + } + await PageObjects.context.waitUntilContextLoadingHasFinished(); + + // open saved search + // TODO: Clicking breadcrumbs works differently in Serverless + await PageObjects.svlCommonNavigation.breadcrumbs.clickBreadcrumb({ deepLinkId: 'discover' }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // TODO: Getting breadcrumbs works differently in Serverless + const savedSearch = await PageObjects.svlCommonNavigation.breadcrumbs.getBreadcrumb({ + deepLinkId: 'discover', + }); + const savedSearchName = await savedSearch?.getVisibleText(); + // TODO: This functionality is broken in Serverless: https://github.com/elastic/kibana/issues/163488 + expect(savedSearchName).to.be.equal('Discover'); + await PageObjects.discover.loadSavedSearch('logst*-ss-_bytes-runtimefield'); + + // test the header now + const header = await dataGrid.getHeaderFields(); + expect(header.join(' ')).to.have.string('_bytes-runtimefield'); + }); + + it('should update id after data view field edit', async () => { + await PageObjects.discover.loadSavedSearch('logst*-ss-_bytes-runtimefield'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const prevDataViewId = await PageObjects.discover.getCurrentDataViewId(); + + // trigger data view id update + await dataGrid.clickEditField('_bytes-runtimefield'); + await fieldEditor.setName('_bytes-runtimefield-edited', true); + await fieldEditor.save(); + await fieldEditor.confirmSave(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const newDataViewId = await PageObjects.discover.getCurrentDataViewId(); + expect(prevDataViewId).not.to.equal(newDataViewId); + }); + + it('should notify about invalid filter reffs', async () => { + await PageObjects.discover.createAdHocDataView('logstas', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await filterBar.addFilter({ + field: 'nestedField.child', + operation: 'is', + value: 'nestedValue', + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await filterBar.addFilter({ field: 'extension', operation: 'is', value: 'jpg' }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const first = await PageObjects.discover.getCurrentDataViewId(); + // trigger data view id update + await PageObjects.discover.addRuntimeField( + '_bytes-runtimefield', + `emit((doc["bytes"].value * 2).toString())` + ); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const second = await PageObjects.discover.getCurrentDataViewId(); + expect(first).not.equal(second); + + await toasts.dismissAllToasts(); + + await browser.goBack(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const [firstToast, secondToast] = await toasts.getAllToastElements(); + + expect([await firstToast.getVisibleText(), await secondToast.getVisibleText()].sort()).to.eql( + [ + `"${first}" is not a configured data view ID\nShowing the saved data view: "logstas*" (${second})`, + `Different index references\nData view id references in some of the applied filters differ from the current data view.`, + ].sort() + ); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_navigation.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_navigation.ts new file mode 100644 index 0000000000000..d690efea7693b --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_navigation.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const filterBar = getService('filterBar'); + const dataGrid = getService('dataGrid'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'context']); + const esArchiver = getService('esArchiver'); + const retry = getService('retry'); + const kibanaServer = getService('kibanaServer'); + const security = getService('security'); + const defaultSettings = { defaultIndex: 'logstash-*' }; + + describe('discover data grid doc link', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + }); + + beforeEach(async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + }); + + it('should open the doc view of the selected document', async function () { + // navigate to the doc view + await dataGrid.clickRowToggle({ rowIndex: 0 }); + + // click the open action + await retry.try(async () => { + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + if (!rowActions.length) { + throw new Error('row actions empty, trying again'); + } + await rowActions[0].click(); + }); + + await retry.waitFor('hit loaded', async () => { + const hasDocHit = await testSubjects.exists('doc-hit'); + return !!hasDocHit; + }); + }); + + it('should create an exists filter from doc view of the selected document', async function () { + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await dataGrid.clickFieldActionInFlyout('@timestamp', 'addExistsFilterButton'); + + const hasExistsFilter = await filterBar.hasFilter('@timestamp', 'exists', true, false, false); + expect(hasExistsFilter).to.be(true); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_table.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_table.ts new file mode 100644 index 0000000000000..99e9cd721fed5 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group2/_data_grid_doc_table.ts @@ -0,0 +1,254 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const find = getService('find'); + const dataGrid = getService('dataGrid'); + const log = getService('log'); + const retry = getService('retry'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const monacoEditor = getService('monacoEditor'); + const dashboardAddPanel = getService('dashboardAddPanel'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'header', + 'timePicker', + 'dashboard', + 'unifiedFieldList', + ]); + const defaultSettings = { + defaultIndex: 'logstash-*', + 'discover:rowHeightOption': 0, // single line + }; + const testSubjects = getService('testSubjects'); + const security = getService('security'); + + describe('discover data grid doc table', function describeIndexTests() { + before(async function () { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + log.debug('load kibana index with default index pattern'); + await kibanaServer.savedObjects.clean({ types: ['search', 'index-pattern'] }); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover.json'); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.uiSettings.replace(defaultSettings); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + }); + + beforeEach(async () => { + await PageObjects.common.navigateToApp('discover'); + }); + + after(async function () { + log.debug('reset uiSettings'); + await kibanaServer.uiSettings.replace({}); + }); + + it('should show rows by default', async function () { + // with the default range the number of hits is ~14000 + const rows = await dataGrid.getDocTableRows(); + expect(rows.length).to.be.above(0); + }); + + it('should refresh the table content when changing time window', async function () { + const initialRows = await dataGrid.getDocTableRows(); + + const fromTime = 'Sep 20, 2015 @ 23:00:00.000'; + const toTime = 'Sep 20, 2015 @ 23:14:00.000'; + + await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + const finalRows = await PageObjects.discover.getDocTableRows(); + expect(finalRows.length).to.be.below(initialRows.length); + }); + + it('should show popover with expanded cell content by click on expand button', async () => { + log.debug('open popover with expanded cell content to get json from the editor'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.waitForWithTimeout('timestamp matches expected doc', 5000, async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + log.debug(`row document timestamp: ${text}`); + return text === 'Sep 22, 2015 @ 23:50:13.253'; + }); + + await dataGrid.clickCellExpandButton(0, 3); + + let expandDocId = ''; + await retry.waitForWithTimeout('expandDocId to be valid', 5000, async () => { + const text = await monacoEditor.getCodeEditorValue(); + const flyoutJson = JSON.parse(text); + expandDocId = flyoutJson._id; + return expandDocId === 'AU_x3_g4GFA8no6QjkYX'; + }); + log.debug(`expanded document id: ${expandDocId}`); + + await dataGrid.clickRowToggle(); + await find.clickByCssSelectorWhenNotDisabledWithoutRetry('#kbn_doc_viewer_tab_1'); + + await retry.waitForWithTimeout( + 'document id in flyout matching the expanded document id', + 5000, + async () => { + const text = await monacoEditor.getCodeEditorValue(); + const flyoutJson = JSON.parse(text); + log.debug(`flyout document id: ${flyoutJson._id}`); + return flyoutJson._id === expandDocId; + } + ); + }); + + it('should show popover with expanded cell content by click on expand button on embeddable', async () => { + log.debug('open popover with expanded cell content to get json from the editor'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.saveSearch('expand-cell-search'); + + await PageObjects.dashboard.navigateToApp(); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await dashboardAddPanel.addSavedSearch('expand-cell-search'); + + await retry.waitForWithTimeout('timestamp matches expected doc', 5000, async () => { + const cell = await dataGrid.getCellElement(0, 2); + const text = await cell.getVisibleText(); + log.debug(`row document timestamp: ${text}`); + return text === 'Sep 22, 2015 @ 23:50:13.253'; + }); + await dataGrid.clickCellExpandButton(0, 3); + + let expandDocId = ''; + await retry.waitForWithTimeout('expandDocId to be valid', 5000, async () => { + const text = await monacoEditor.getCodeEditorValue(); + return (expandDocId = JSON.parse(text)._id) === 'AU_x3_g4GFA8no6QjkYX'; + }); + log.debug(`expanded document id: ${expandDocId}`); + + await dataGrid.clickRowToggle(); + await find.clickByCssSelectorWhenNotDisabledWithoutRetry('#kbn_doc_viewer_tab_1'); + + await retry.waitForWithTimeout( + 'document id in flyout matching the expanded document id', + 5000, + async () => { + const text = await monacoEditor.getCodeEditorValue(); + const flyoutJson = JSON.parse(text); + log.debug(`flyout document id: ${flyoutJson._id}`); + return flyoutJson._id === expandDocId; + } + ); + }); + + describe('expand a document row', function () { + const rowToInspect = 1; + + it('should expand the detail row when the toggle arrow is clicked', async function () { + await retry.try(async function () { + await dataGrid.clickRowToggle({ isAnchorRow: false, rowIndex: rowToInspect - 1 }); + const detailsEl = await dataGrid.getDetailsRows(); + const defaultMessageEl = await detailsEl[0].findByTestSubject('docTableRowDetailsTitle'); + expect(defaultMessageEl).to.be.ok(); + await dataGrid.closeFlyout(); + }); + }); + + it('should show the detail panel actions', async function () { + await retry.try(async function () { + await dataGrid.clickRowToggle({ isAnchorRow: false, rowIndex: rowToInspect - 1 }); + const [surroundingActionEl, singleActionEl] = await dataGrid.getRowActions({ + isAnchorRow: false, + rowIndex: rowToInspect - 1, + }); + expect(surroundingActionEl).to.be.ok(); + expect(singleActionEl).to.be.ok(); + await dataGrid.closeFlyout(); + }); + }); + + it('should allow paginating docs in the flyout by clicking in the doc table', async function () { + await retry.try(async function () { + await dataGrid.clickRowToggle({ rowIndex: rowToInspect - 1 }); + await testSubjects.exists(`dscDocNavigationPage0`); + await dataGrid.clickRowToggle({ rowIndex: rowToInspect }); + await testSubjects.exists(`dscDocNavigationPage1`); + await dataGrid.closeFlyout(); + }); + }); + + it('should show allow adding columns from the detail panel', async function () { + await retry.try(async function () { + await dataGrid.clickRowToggle({ isAnchorRow: false, rowIndex: rowToInspect - 1 }); + + // add columns + const fields = ['_id', '_index', 'agent']; + for (const field of fields) { + await dataGrid.clickFieldActionInFlyout(field, 'toggleColumnButton'); + } + + const headerWithFields = await dataGrid.getHeaderFields(); + expect(headerWithFields.join(' ')).to.contain(fields.join(' ')); + + // remove columns + for (const field of fields) { + await dataGrid.clickFieldActionInFlyout(field, 'toggleColumnButton'); + } + + const headerWithoutFields = await dataGrid.getHeaderFields(); + expect(headerWithoutFields.join(' ')).not.to.contain(fields.join(' ')); + + await dataGrid.closeFlyout(); + }); + }); + }); + + describe('add and remove columns', function () { + const extraColumns = ['phpmemory', 'ip']; + + afterEach(async function () { + for (const column of extraColumns) { + await PageObjects.unifiedFieldList.clickFieldListItemRemove(column); + await PageObjects.header.waitUntilLoadingHasFinished(); + } + }); + + it('should add more columns to the table', async function () { + for (const column of extraColumns) { + await PageObjects.unifiedFieldList.clearFieldSearchInput(); + await PageObjects.unifiedFieldList.findFieldByName(column); + await PageObjects.unifiedFieldList.clickFieldListItemAdd(column); + await PageObjects.header.waitUntilLoadingHasFinished(); + // test the header now + const header = await dataGrid.getHeaderFields(); + expect(header.join(' ')).to.have.string(column); + } + }); + + it('should remove columns from the table', async function () { + for (const column of extraColumns) { + await PageObjects.unifiedFieldList.clearFieldSearchInput(); + await PageObjects.unifiedFieldList.findFieldByName(column); + await PageObjects.unifiedFieldList.clickFieldListItemAdd(column); + await PageObjects.header.waitUntilLoadingHasFinished(); + } + // remove the second column + await PageObjects.unifiedFieldList.clickFieldListItemRemove(extraColumns[1]); + await PageObjects.header.waitUntilLoadingHasFinished(); + // test that the second column is no longer there + const header = await dataGrid.getHeaderFields(); + expect(header.join(' ')).to.not.have.string(extraColumns[1]); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts new file mode 100644 index 0000000000000..72243eaa24047 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group2/index.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile, getPageObject }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const svlCommonPage = getPageObject('svlCommonPage'); + + describe('discover/group2', function () { + before(async function () { + await browser.setWindowSize(1600, 1200); + // TODO: Serverless tests require login first + await svlCommonPage.login(); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_data_grid_doc_navigation')); + loadTestFile(require.resolve('./_data_grid_doc_table')); + loadTestFile(require.resolve('./_adhoc_data_views')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/_request_counts.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_request_counts.ts new file mode 100644 index 0000000000000..8e373bae57ad6 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_request_counts.ts @@ -0,0 +1,226 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'timePicker', + 'header', + 'unifiedSearch', + 'settings', + ]); + const testSubjects = getService('testSubjects'); + const browser = getService('browser'); + const filterBar = getService('filterBar'); + const queryBar = getService('queryBar'); + const elasticChart = getService('elasticChart'); + + describe('discover request counts', function describeIndexTests() { + before(async function () { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/long_window_logstash'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/long_window_logstash_index_pattern' + ); + await kibanaServer.uiSettings.replace({ + defaultIndex: 'logstash-*', + 'bfetch:disable': true, + // TODO: Removed ES|QL setting since ES|QL isn't supported in Serverless + }); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.savedObjects.cleanStandardList(); + await kibanaServer.uiSettings.replace({}); + }); + + beforeEach(async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + }); + + const getSearchCount = async (type: 'ese' | 'esql') => { + const requests = await browser.execute(() => + performance + .getEntries() + .filter((entry: any) => ['fetch', 'xmlhttprequest'].includes(entry.initiatorType)) + ); + return requests.filter((entry) => entry.name.endsWith(`/internal/search/${type}`)).length; + }; + + const waitForLoadingToFinish = async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitForDocTableLoadingComplete(); + await elasticChart.canvasExists(); + }; + + const expectSearches = async (type: 'ese' | 'esql', expected: number, cb: Function) => { + await browser.execute(async () => { + performance.clearResourceTimings(); + }); + let searchCount = await getSearchCount(type); + expect(searchCount).to.be(0); + await cb(); + await waitForLoadingToFinish(); + searchCount = await getSearchCount(type); + expect(searchCount).to.be(expected); + }; + + const getSharedTests = ({ + type, + savedSearch, + query1, + query2, + savedSearchesRequests, + setQuery, + }: { + type: 'ese' | 'esql'; + savedSearch: string; + query1: string; + query2: string; + savedSearchesRequests?: number; + setQuery: (query: string) => Promise; + }) => { + it('should send 2 search requests (documents + chart) on page load', async () => { + await browser.refresh(); + await browser.execute(async () => { + performance.setResourceTimingBufferSize(Number.MAX_SAFE_INTEGER); + }); + await waitForLoadingToFinish(); + const searchCount = await getSearchCount(type); + expect(searchCount).to.be(2); + }); + + it('should send 2 requests (documents + chart) when refreshing', async () => { + await expectSearches(type, 2, async () => { + await queryBar.clickQuerySubmitButton(); + }); + }); + + it('should send 2 requests (documents + chart) when changing the query', async () => { + await expectSearches(type, 2, async () => { + await setQuery(query1); + await queryBar.clickQuerySubmitButton(); + }); + }); + + it('should send 2 requests (documents + chart) when changing the time range', async () => { + await expectSearches(type, 2, async () => { + await PageObjects.timePicker.setAbsoluteRange( + 'Sep 21, 2015 @ 06:31:44.000', + 'Sep 23, 2015 @ 00:00:00.000' + ); + }); + }); + + it('should send 2 requests (documents + chart) when toggling the chart visibility', async () => { + await expectSearches(type, 2, async () => { + await PageObjects.discover.toggleChartVisibility(); + }); + await expectSearches(type, 2, async () => { + await PageObjects.discover.toggleChartVisibility(); + }); + }); + + it('should send 2 requests for saved search changes', async () => { + await setQuery(query1); + await queryBar.clickQuerySubmitButton(); + await PageObjects.timePicker.setAbsoluteRange( + 'Sep 21, 2015 @ 06:31:44.000', + 'Sep 23, 2015 @ 00:00:00.000' + ); + await waitForLoadingToFinish(); + // TODO: Check why the request happens 4 times in case of opening a saved search + // https://github.com/elastic/kibana/issues/165192 + // creating the saved search + await expectSearches(type, savedSearchesRequests ?? 2, async () => { + await PageObjects.discover.saveSearch(savedSearch); + }); + // resetting the saved search + await setQuery(query2); + await queryBar.clickQuerySubmitButton(); + await waitForLoadingToFinish(); + await expectSearches(type, 2, async () => { + await PageObjects.discover.revertUnsavedChanges(); + }); + // clearing the saved search + await expectSearches('ese', 2, async () => { + await testSubjects.click('discoverNewButton'); + await waitForLoadingToFinish(); + }); + // loading the saved search + // TODO: https://github.com/elastic/kibana/issues/165192 + await expectSearches(type, savedSearchesRequests ?? 2, async () => { + await PageObjects.discover.loadSavedSearch(savedSearch); + }); + }); + }; + + describe('data view mode', () => { + const type = 'ese'; + + getSharedTests({ + type, + savedSearch: 'data view test', + query1: 'bytes > 1000', + query2: 'bytes < 2000', + setQuery: (query) => queryBar.setQuery(query), + }); + + it('should send 2 requests (documents + chart) when adding a filter', async () => { + await expectSearches(type, 2, async () => { + await filterBar.addFilter({ + field: 'extension', + operation: 'is', + value: 'jpg', + }); + }); + }); + + it('should send 2 requests (documents + chart) when sorting', async () => { + await expectSearches(type, 2, async () => { + await PageObjects.discover.clickFieldSort('@timestamp', 'Sort Old-New'); + }); + }); + + it('should send 2 requests (documents + chart) when changing to a breakdown field without an other bucket', async () => { + await expectSearches(type, 2, async () => { + await PageObjects.discover.chooseBreakdownField('type'); + }); + }); + + it('should send 3 requests (documents + chart + other bucket) when changing to a breakdown field with an other bucket', async () => { + await expectSearches(type, 3, async () => { + await PageObjects.discover.chooseBreakdownField('extension.raw'); + }); + }); + + it('should send 2 requests (documents + chart) when changing the chart interval', async () => { + await expectSearches(type, 2, async () => { + await PageObjects.discover.setChartInterval('Day'); + }); + }); + + it('should send 2 requests (documents + chart) when changing the data view', async () => { + await expectSearches(type, 2, async () => { + await PageObjects.discover.selectIndexPattern('long-window-logstash-*'); + }); + }); + }); + + // TODO: ES|QL tests removed since ES|QL isn't supported in Serverless + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts new file mode 100644 index 0000000000000..17606ac87a429 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_sidebar.ts @@ -0,0 +1,740 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'timePicker', + 'header', + 'unifiedSearch', + 'unifiedFieldList', + ]); + const testSubjects = getService('testSubjects'); + const find = getService('find'); + const browser = getService('browser'); + const filterBar = getService('filterBar'); + const fieldEditor = getService('fieldEditor'); + const retry = getService('retry'); + const dataGrid = getService('dataGrid'); + const INITIAL_FIELD_LIST_SUMMARY = '53 available fields. 0 empty fields. 3 meta fields.'; + + describe('discover sidebar', function describeIndexTests() { + before(async function () { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + beforeEach(async () => { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.uiSettings.replace({ + defaultIndex: 'logstash-*', + }); + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + afterEach(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.savedObjects.cleanStandardList(); + await kibanaServer.uiSettings.replace({}); + await PageObjects.unifiedFieldList.cleanSidebarLocalStorage(); + }); + + describe('field filtering', function () { + it('should reveal and hide the filter form when the toggle is clicked', async function () { + await PageObjects.unifiedFieldList.openSidebarFieldFilter(); + await PageObjects.unifiedFieldList.closeSidebarFieldFilter(); + }); + + it('should filter by field type', async function () { + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + await PageObjects.unifiedFieldList.openSidebarFieldFilter(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await testSubjects.click('typeFilter-keyword'); + + await retry.waitFor('first updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '7 available fields. 0 empty fields. 2 meta fields.' + ); + }); + + await testSubjects.click('typeFilter-number'); + + await retry.waitFor('second updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '13 available fields. 0 empty fields. 3 meta fields.' + ); + }); + + await testSubjects.click('fieldListFiltersFieldTypeFilterClearAll'); + + await retry.waitFor('reset', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + INITIAL_FIELD_LIST_SUMMARY + ); + }); + }); + + // TODO: ES|QL tests removed since ES|QL isn't supported in Serverless + }); + + describe('search', function () { + beforeEach(async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + }); + + afterEach(async () => { + const fieldSearch = await testSubjects.find('clearSearchButton'); + await fieldSearch.click(); + + await retry.waitFor('reset', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + INITIAL_FIELD_LIST_SUMMARY + ); + }); + }); + + it('should be able to search by string', async function () { + await PageObjects.unifiedFieldList.findFieldByName('i'); + + await retry.waitFor('first updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '30 available fields. 0 empty fields. 2 meta fields.' + ); + }); + + await PageObjects.unifiedFieldList.findFieldByName('p'); + + await retry.waitFor('second updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '4 available fields. 0 empty fields. 0 meta fields.' + ); + }); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('available')).join(', ') + ).to.be('clientip, ip, relatedContent.og:description, relatedContent.twitter:description'); + }); + + it('should be able to search by wildcard', async function () { + await PageObjects.unifiedFieldList.findFieldByName('relatedContent*image'); + + await retry.waitFor('updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '2 available fields. 0 empty fields. 0 meta fields.' + ); + }); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('available')).join(', ') + ).to.be('relatedContent.og:image, relatedContent.twitter:image'); + }); + + it('should be able to search with spaces as wildcard', async function () { + await PageObjects.unifiedFieldList.findFieldByName('relatedContent image'); + + await retry.waitFor('updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '4 available fields. 0 empty fields. 0 meta fields.' + ); + }); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('available')).join(', ') + ).to.be( + 'relatedContent.og:image, relatedContent.og:image:height, relatedContent.og:image:width, relatedContent.twitter:image' + ); + }); + + it('should ignore empty search', async function () { + await PageObjects.unifiedFieldList.findFieldByName(' '); // only spaces + + await retry.waitFor('the clear button', async () => { + return await testSubjects.exists('clearSearchButton'); + }); + + // expect no changes in the list + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + }); + }); + + describe('field stats', function () { + it('should work for regular and pinned filters', async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + + const allTermsResult = 'jpg\n65.0%\ncss\n15.4%\npng\n9.8%\ngif\n6.6%\nphp\n3.2%'; + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be(allTermsResult); + + await filterBar.addFilter({ field: 'extension', operation: 'is', value: 'jpg' }); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const onlyJpgResult = 'jpg\n100%'; + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be(onlyJpgResult); + + await filterBar.toggleFilterNegated('extension'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const jpgExcludedResult = 'css\n44.1%\npng\n28.0%\ngif\n18.8%\nphp\n9.1%'; + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be( + jpgExcludedResult + ); + + await filterBar.toggleFilterPinned('extension'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be( + jpgExcludedResult + ); + + await browser.refresh(); + + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be( + jpgExcludedResult + ); + + await filterBar.toggleFilterEnabled('extension'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be(allTermsResult); + }); + }); + + describe('collapse expand', function () { + it('should initially be expanded', async function () { + await testSubjects.existOrFail('discover-sidebar'); + await testSubjects.existOrFail('fieldList'); + }); + + it('should collapse when clicked', async function () { + await PageObjects.discover.toggleSidebarCollapse(); + await testSubjects.existOrFail('discover-sidebar'); + await testSubjects.missingOrFail('fieldList'); + }); + + it('should expand when clicked', async function () { + await PageObjects.discover.toggleSidebarCollapse(); + await testSubjects.existOrFail('discover-sidebar'); + await testSubjects.existOrFail('fieldList'); + }); + }); + + describe('renders field groups', function () { + it('should show field list groups excluding subfields', async function () { + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + expect(await PageObjects.unifiedFieldList.doesSidebarShowFields()).to.be(true); + + // Initial Available fields + const expectedInitialAvailableFields = + '@message, @tags, @timestamp, agent, bytes, clientip, extension, geo.coordinates, geo.dest, geo.src, geo.srcdest, headings, host, id, index, ip, links, machine.os, machine.ram, machine.ram_range, memory, meta.char, meta.related, meta.user.firstname, meta.user.lastname, nestedField.child, phpmemory, referer, relatedContent.article:modified_time, relatedContent.article:published_time, relatedContent.article:section, relatedContent.article:tag, relatedContent.og:description, relatedContent.og:image, relatedContent.og:image:height, relatedContent.og:image:width, relatedContent.og:site_name, relatedContent.og:title, relatedContent.og:type, relatedContent.og:url, relatedContent.twitter:card, relatedContent.twitter:description, relatedContent.twitter:image, relatedContent.twitter:site, relatedContent.twitter:title, relatedContent.url, request, response, spaces, type'; + let availableFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames( + 'available' + ); + expect(availableFields.length).to.be(50); + expect(availableFields.join(', ')).to.be(expectedInitialAvailableFields); + + // Available fields after scrolling down + const emptySectionButton = await find.byCssSelector( + PageObjects.unifiedFieldList.getSidebarSectionSelector('empty', true) + ); + await emptySectionButton.scrollIntoViewIfNecessary(); + + await retry.waitFor('list to update after scrolling', async () => { + availableFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames( + 'available' + ); + return availableFields.length === 53; + }); + + expect(availableFields.join(', ')).to.be( + `${expectedInitialAvailableFields}, url, utc_time, xss` + ); + + // Expand Empty section + await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('empty')).join(', ') + ).to.be(''); + + // Expand Meta section + await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('meta')).join(', ') + ).to.be('_id, _index, _score'); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + }); + + it('should show field list groups excluding subfields when searched from source', async function () { + await kibanaServer.uiSettings.update({ 'discover:searchFieldsFromSource': true }); + await browser.refresh(); + + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + expect(await PageObjects.unifiedFieldList.doesSidebarShowFields()).to.be(true); + + // Initial Available fields + const availableFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames( + 'available' + ); + expect(availableFields.length).to.be(50); + expect( + availableFields + .join(', ') + .startsWith( + '@message, @tags, @timestamp, agent, bytes, clientip, extension, geo.coordinates' + ) + ).to.be(true); + + // Available fields after scrolling down + const emptySectionButton = await find.byCssSelector( + PageObjects.unifiedFieldList.getSidebarSectionSelector('empty', true) + ); + await emptySectionButton.scrollIntoViewIfNecessary(); + + // Expand Empty section + await PageObjects.unifiedFieldList.toggleSidebarSection('empty'); + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('empty')).join(', ') + ).to.be(''); + + // Expand Meta section + await PageObjects.unifiedFieldList.toggleSidebarSection('meta'); + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('meta')).join(', ') + ).to.be('_id, _index, _score'); + + // Expand Unmapped section + await PageObjects.unifiedFieldList.toggleSidebarSection('unmapped'); + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('unmapped')).join(', ') + ).to.be('relatedContent'); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '53 available fields. 1 unmapped field. 0 empty fields. 3 meta fields.' + ); + }); + + it('should show selected and popular fields', async function () { + await PageObjects.unifiedFieldList.clickFieldListItemAdd('extension'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('@message'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('selected')).join(', ') + ).to.be('extension, @message'); + + const availableFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames( + 'available' + ); + expect(availableFields.includes('extension')).to.be(true); + expect(availableFields.includes('@message')).to.be(true); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '2 selected fields. 2 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.unifiedFieldList.clickFieldListItemRemove('@message'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await PageObjects.unifiedFieldList.clickFieldListItemAdd('_id'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('@message'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('selected')).join(', ') + ).to.be('extension, _id, @message'); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('popular')).join(', ') + ).to.be('@message, _id, extension'); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '3 selected fields. 3 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + ); + }); + + // TODO: ES|QL tests removed since ES|QL isn't supported in Serverless + + it('should work correctly for a data view for a missing index', async function () { + // but we are skipping importing the index itself + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + await browser.refresh(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await PageObjects.discover.selectIndexPattern('with-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '0 available fields. 0 empty fields. 0 meta fields.' + ); + await testSubjects.missingOrFail( + `${PageObjects.unifiedFieldList.getSidebarSectionSelector('available')}-fetchWarning` + ); + await testSubjects.existOrFail( + `${PageObjects.unifiedFieldList.getSidebarSectionSelector( + 'available' + )}NoFieldsCallout-noFieldsExist` + ); + + await PageObjects.discover.selectIndexPattern('logstash-*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + }); + + it('should work correctly when switching data views', async function () { + await esArchiver.loadIfNeeded( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await browser.refresh(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await PageObjects.discover.selectIndexPattern('without-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '6 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('with-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '0 available fields. 7 empty fields. 3 meta fields.' + ); + await testSubjects.existOrFail( + `${PageObjects.unifiedFieldList.getSidebarSectionSelector( + 'available' + )}NoFieldsCallout-noFieldsMatch` + ); + + await PageObjects.discover.selectIndexPattern('logstash-*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await esArchiver.unload( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + }); + + it('should work when filters change', async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be( + 'jpg\n65.0%\ncss\n15.4%\npng\n9.8%\ngif\n6.6%\nphp\n3.2%' + ); + + await filterBar.addFilter({ field: 'extension', operation: 'is', value: 'jpg' }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + // check that the filter was passed down to the sidebar + await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be('jpg\n100%'); + }); + + it('should work for many fields', async () => { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/many_fields'); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/many_fields_data_view' + ); + + await browser.refresh(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await PageObjects.discover.selectIndexPattern('indices-stats*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '6873 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('logstash-*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/many_fields_data_view' + ); + await esArchiver.unload('test/functional/fixtures/es_archiver/many_fields'); + }); + + it('should work with ad-hoc data views and runtime fields', async () => { + await PageObjects.discover.createAdHocDataView('logstash', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await PageObjects.discover.addRuntimeField( + '_bytes-runtimefield', + `emit((doc["bytes"].value * 2).toString())` + ); + + await retry.waitFor('form to close', async () => { + return !(await testSubjects.exists('fieldEditor')); + }); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '54 available fields. 0 empty fields. 3 meta fields.' + ); + + let allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); + expect(allFields.includes('_bytes-runtimefield')).to.be(true); + + await PageObjects.discover.editField('_bytes-runtimefield'); + await fieldEditor.enableCustomLabel(); + await fieldEditor.setCustomLabel('_bytes-runtimefield2'); + await fieldEditor.save(); + + await retry.waitFor('form to close', async () => { + return !(await testSubjects.exists('fieldEditor')); + }); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '54 available fields. 0 empty fields. 3 meta fields.' + ); + + allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); + expect(allFields.includes('_bytes-runtimefield2')).to.be(true); + expect(allFields.includes('_bytes-runtimefield')).to.be(false); + await PageObjects.discover.removeField('_bytes-runtimefield'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); + expect(allFields.includes('_bytes-runtimefield2')).to.be(false); + expect(allFields.includes('_bytes-runtimefield')).to.be(false); + }); + + it('should render even when retrieving documents failed with an error', async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await PageObjects.discover.addRuntimeField('_invalid-runtimefield', `emit(‘’);`); + + await PageObjects.header.waitUntilLoadingHasFinished(); + + // error in fetching documents because of the invalid runtime field + await PageObjects.discover.showsErrorCallout(); + + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + // check that the sidebar is rendered + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '54 available fields. 0 empty fields. 3 meta fields.' + ); + let allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); + expect(allFields.includes('_invalid-runtimefield')).to.be(true); + + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.showsErrorCallout(); // still has error + + // check that the sidebar is rendered event after a refresh + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + allFields = await PageObjects.unifiedFieldList.getAllFieldNames(); + expect(allFields.includes('_invalid-runtimefield')).to.be(true); + + await PageObjects.discover.removeField('_invalid-runtimefield'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + }); + + it('should work correctly when time range is updated', async function () { + await esArchiver.loadIfNeeded( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await browser.refresh(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + INITIAL_FIELD_LIST_SUMMARY + ); + + await PageObjects.discover.selectIndexPattern('with-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '0 available fields. 7 empty fields. 3 meta fields.' + ); + await testSubjects.existOrFail( + `${PageObjects.unifiedFieldList.getSidebarSectionSelector( + 'available' + )}NoFieldsCallout-noFieldsMatch` + ); + + await PageObjects.timePicker.setAbsoluteRange( + 'Sep 21, 2019 @ 00:00:00.000', + 'Sep 23, 2019 @ 00:00:00.000' + ); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.unifiedFieldList.getSidebarAriaDescription()).to.be( + '7 available fields. 0 empty fields. 3 meta fields.' + ); + + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await esArchiver.unload( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + }); + + it('should remove the table column after a field was deleted', async () => { + const newField = '_test_field_and_column_removal'; + await PageObjects.discover.addRuntimeField(newField, `emit("hi there")`); + + await retry.waitFor('form to close', async () => { + return !(await testSubjects.exists('fieldEditor')); + }); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + let selectedFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames( + 'selected' + ); + expect(selectedFields.includes(newField)).to.be(false); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'Document']); + + await PageObjects.unifiedFieldList.clickFieldListItemAdd(newField); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + selectedFields = await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('selected'); + expect(selectedFields.includes(newField)).to.be(true); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', newField]); + + await PageObjects.discover.removeField(newField); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.unifiedFieldList.waitUntilSidebarHasLoaded(); + + await retry.waitFor('sidebar to update', async () => { + return !(await PageObjects.unifiedFieldList.getAllFieldNames()).includes(newField); + }); + + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'Document']); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/_unsaved_changes_badge.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_unsaved_changes_badge.ts new file mode 100644 index 0000000000000..f063a805635f7 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group3/_unsaved_changes_badge.ts @@ -0,0 +1,166 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +const SAVED_SEARCH_NAME = 'test saved search'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const testSubjects = getService('testSubjects'); + const dataGrid = getService('dataGrid'); + const PageObjects = getPageObjects([ + 'settings', + 'common', + 'discover', + 'header', + 'timePicker', + 'dashboard', + 'unifiedFieldList', + ]); + const security = getService('security'); + const defaultSettings = { + defaultIndex: 'logstash-*', + hideAnnouncements: true, + }; + + describe('discover unsaved changes badge', function describeIndexTests() { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.uiSettings.replace({}); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + beforeEach(async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update(defaultSettings); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should not show the badge initially nor after changes to a draft saved search', async () => { + await testSubjects.missingOrFail('unsavedChangesBadge'); + + await PageObjects.unifiedFieldList.clickFieldListItemAdd('bytes'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.missingOrFail('unsavedChangesBadge'); + }); + + it('should show the badge only after changes to a persisted saved search', async () => { + await PageObjects.discover.saveSearch(SAVED_SEARCH_NAME); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.missingOrFail('unsavedChangesBadge'); + + await PageObjects.unifiedFieldList.clickFieldListItemAdd('bytes'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.existOrFail('unsavedChangesBadge'); + + await PageObjects.discover.saveUnsavedChanges(); + + await testSubjects.missingOrFail('unsavedChangesBadge'); + }); + + it('should not show a badge after loading a saved search, only after changes', async () => { + await PageObjects.discover.loadSavedSearch(SAVED_SEARCH_NAME); + + await testSubjects.missingOrFail('unsavedChangesBadge'); + + await PageObjects.discover.chooseBreakdownField('_index'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.existOrFail('unsavedChangesBadge'); + }); + + it('should allow to revert changes', async () => { + await PageObjects.discover.loadSavedSearch(SAVED_SEARCH_NAME); + await testSubjects.missingOrFail('unsavedChangesBadge'); + + // test changes to columns + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'bytes']); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('extension'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'bytes', 'extension']); + await testSubjects.existOrFail('unsavedChangesBadge'); + await PageObjects.discover.revertUnsavedChanges(); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'bytes']); + await testSubjects.missingOrFail('unsavedChangesBadge'); + + // test changes to sample size + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentSampleSizeValue()).to.be(500); + await dataGrid.changeSampleSizeValue(250); + await dataGrid.clickGridSettings(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await testSubjects.existOrFail('unsavedChangesBadge'); + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentSampleSizeValue()).to.be(250); + await dataGrid.clickGridSettings(); + await PageObjects.discover.revertUnsavedChanges(); + await testSubjects.missingOrFail('unsavedChangesBadge'); + await dataGrid.clickGridSettings(); + expect(await dataGrid.getCurrentSampleSizeValue()).to.be(500); + await dataGrid.clickGridSettings(); + + // test changes to rows per page + await dataGrid.checkCurrentRowsPerPageToBe(100); + await dataGrid.changeRowsPerPageTo(25); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await testSubjects.existOrFail('unsavedChangesBadge'); + await dataGrid.checkCurrentRowsPerPageToBe(25); + await PageObjects.discover.revertUnsavedChanges(); + await testSubjects.missingOrFail('unsavedChangesBadge'); + await dataGrid.checkCurrentRowsPerPageToBe(100); + }); + + it('should hide the badge once user manually reverts changes', async () => { + await PageObjects.discover.loadSavedSearch(SAVED_SEARCH_NAME); + await testSubjects.missingOrFail('unsavedChangesBadge'); + + // changes to columns + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'bytes']); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('extension'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'bytes', 'extension']); + await testSubjects.existOrFail('unsavedChangesBadge'); + await PageObjects.unifiedFieldList.clickFieldListItemRemove('extension'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + expect(await dataGrid.getHeaderFields()).to.eql(['@timestamp', 'bytes']); + await testSubjects.missingOrFail('unsavedChangesBadge'); + + // test changes to breakdown field + await PageObjects.discover.chooseBreakdownField('_index'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await testSubjects.existOrFail('unsavedChangesBadge'); + await PageObjects.discover.clearBreakdownField(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await testSubjects.missingOrFail('unsavedChangesBadge'); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group3/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group3/index.ts new file mode 100644 index 0000000000000..75b2e6c9cd252 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group3/index.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile, getPageObject }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const svlCommonPage = getPageObject('svlCommonPage'); + + describe('discover/group3', function () { + before(async function () { + await browser.setWindowSize(1300, 800); + // TODO: Serverless tests require login first + await svlCommonPage.login(); + }); + + after(async function unloadMakelogs() { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + loadTestFile(require.resolve('./_sidebar')); + loadTestFile(require.resolve('./_request_counts')); + loadTestFile(require.resolve('./_unsaved_changes_badge')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/__snapshots__/reporting.snap b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/__snapshots__/reporting.snap new file mode 100644 index 0000000000000..9d1f3633eb374 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/__snapshots__/reporting.snap @@ -0,0 +1,3071 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`discover Discover CSV Export Generate CSV: archived search generates a report with data 1`] = ` +"\\"order_date\\",category,currency,\\"customer_id\\",\\"order_id\\",\\"day_of_week_i\\",\\"products.created_on\\",sku +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,12,570552,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0216402164, ZO0666306663\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,570520,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0618906189, ZO0289502895\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,570569,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0643506435, ZO0646406464\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,45,570133,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0320503205, ZO0049500495\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,4,570161,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0606606066, ZO0596305963\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,17,570200,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0025100251, ZO0101901019\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,732050,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0101201012, ZO0230902309, ZO0325603256, ZO0056400564\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,52,719675,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0448604486, ZO0686206862, ZO0395403954, ZO0528505285\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,26,570396,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0495604956, ZO0208802088\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,17,570037,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0321503215, ZO0200102001\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,569311,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0024600246, ZO0660706607\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,29,570632,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0432404324, ZO0313603136\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,569674,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0423104231, ZO0408804088\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,569716,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0146701467, ZO0212902129\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,569962,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0129901299, ZO0440704407\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,569821,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0066600666, ZO0049000490\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,569898,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0591805918, ZO0474004740\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,34,570232,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0682006820, ZO0399103991\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,25,721217,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0567705677, ZO0414204142, ZO0415904159, ZO0119801198\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,570111,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0253002530, ZO0117101171\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,569610,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0140001400, ZO0219302193\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,29,570087,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0308403084, ZO0623506235\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,570442,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0175501755, ZO0103601036\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,4,569548,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0587605876, ZO0463904639\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Women's Accessories\\",EUR,16,569577,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0464404644, ZO0128401284\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,569611,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0450604506, ZO0440304403\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,570480,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0286202862, ZO0694506945\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,570594,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0111901119, ZO0540605406\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,570077,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0433904339, ZO0627706277\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,24,570056,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0131801318, ZO0215802158\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,5,725669,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0234102341, ZO0353703537, ZO0265102651, ZO0149501495\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,18,570694,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0376703767, ZO0350603506\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,25,570542,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0623606236, ZO0565405654\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,42,570576,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0637906379, ZO0325103251\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Accessories, Men's Clothing\\",EUR,52,716588,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0318303183, ZO0310503105, ZO0584605846, ZO0609706097\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,25,719459,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0410004100, ZO0513605136, ZO0431404314, ZO0662906629\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,10,569531,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0664106641, ZO0549105491\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569569,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0070600706, ZO0488704887\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569614,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0226202262, ZO0647006470\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,20,570484,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0712407124, ZO0095600956\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,569679,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0433604336, ZO0275702757\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,570250,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0638906389, ZO0148001480\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,25,570303,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0573305733, ZO0513205132\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Women's Accessories\\",EUR,7,569746,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0484004840, ZO0605906059\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,569806,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0558305583\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,570353,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0413704137, ZO0559205592\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,570021,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0709807098, ZO0166301663\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,570502,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0280602806, ZO0408504085\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,570477,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0299202992, ZO0392403924\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,43,570263,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0041800418, ZO0194901949\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,18,570304,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0053000530, ZO0360203602\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,569743,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0610306103\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,5,569529,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0264102641, ZO0658706587\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes, Women's Accessories\\",EUR,38,714566,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0430204302, ZO0397303973, ZO0686806868, ZO0320403204\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,712856,3,\\"Dec 15, 2016 @ 00:00:00.000\\",ZO0263202632 +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing, Men's Accessories\\",EUR,52,713377,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0318803188, ZO0535005350, ZO0445504455, ZO0599605996\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,570472,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0478704787, ZO0591205912\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,50,570120,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0392903929, ZO0254802548\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,570177,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0532905329, ZO0524105241\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,570209,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0658306583, ZO0570705707\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,570254,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0495304953, ZO0634906349\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,20,569734,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0348703487, ZO0141401414\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,48,569814,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0602606026, ZO0298402984\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,32,570414,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0481704817, ZO0396503965\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,39,569436,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0386103861, ZO0451504515\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,41,570079,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0598505985, ZO0449304493\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,37,569637,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0300103001, ZO0688106881\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,570588,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0092000920, ZO0152001520\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,17,569567,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0366203662, ZO0361403614\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,569645,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0392803928, ZO0277102771\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,18,570658,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0003600036, ZO0016800168\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,712926,3,\\"Dec 15, 2016 @ 00:00:00.000\\",ZO0263002630 +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,570264,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0627206272, ZO0285702857\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,26,569424,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0175201752, ZO0206202062\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,4,569468,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0285202852, ZO0448304483\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,14,569505,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0608906089, ZO0478504785\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,569337,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0634106341, ZO0066900669\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,569362,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0292402924, ZO0681006810\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,569375,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0347603476, ZO0668806688\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,569387,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0593805938, ZO0125201252\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes, Women's Accessories\\",EUR,52,713556,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0592105921, ZO0421204212, ZO0400604006, ZO0319403194\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,569919,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0051200512, ZO0232602326\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,569768,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0231502315, ZO0131401314\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,570334,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0520205202, ZO0545205452\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,570374,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0674906749, ZO0073200732\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,570024,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0631506315, ZO0426804268\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,19,570143,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0482904829\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,730736,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0074200742, ZO0266602666, ZO0364503645, ZO0134601346\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,570075,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0621706217, ZO0114301143\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,43,569623,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0208302083, ZO0307603076\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,29,569546,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0559105591, ZO0563205632\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,570532,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0557405574, ZO0118601186\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,8,570586,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0694206942, ZO0596505965\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,569452,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0159301593, ZO0250502505\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,569496,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0659006590, ZO0103801038\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,14,569336,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0512505125, ZO0384103841\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,42,569370,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0358603586, ZO0641106411\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,45,569411,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0094200942, ZO0003700037\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,570663,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0152501525, ZO0104201042\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,570491,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0198901989, ZO0104701047\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,570608,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0478504785, ZO0663306633\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,20,569371,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0225702257, ZO0186601866\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,46,570065,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0027300273, ZO0698606986\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,569624,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0333803338, ZO0138901389\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,27,569953,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0021100211, ZO0193601936\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,8,569984,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0537205372, ZO0403504035\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,569822,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0271402714, ZO0047200472\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,20,569880,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0325303253, ZO0244002440\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,570234,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0707007070, ZO0016200162\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,46,570512,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0332003320, ZO0357103571\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,569422,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0102501025, ZO0063500635\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,30,569958,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0311903119, ZO0563305633\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,34,570003,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0298902989, ZO0694506945\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,22,569868,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0200702007, ZO0106501065\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,569710,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0053600536, ZO0239702397\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,570151,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0589105891, ZO0587705877\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,17,725499,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0678306783, ZO0305503055, ZO0369203692, ZO0006700067\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,31,569338,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0702507025, ZO0528105281\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,569392,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0516405164, ZO0532705327\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,712590,3,\\"Dec 15, 2016 @ 00:00:00.000\\",ZO0262202622 +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,31,569312,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0425104251, ZO0107901079\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,570643,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0618806188, ZO0119701197\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,44,570687,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0135501355, ZO0675806758\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,13,569939,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0471304713, ZO0528905289\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,45,569968,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0047300473, ZO0142401424\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,569995,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0125701257, ZO0664706647\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,570009,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0510705107, ZO0594605946\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,44,569834,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0076900769, ZO0151501515\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,42,569869,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0362803628, ZO0237802378\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,569900,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0644506445, ZO0104901049\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,570164,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0210002100, ZO0068200682\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,569761,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0166101661, ZO0337203372\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,570335,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0337703377, ZO0048500485\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,570372,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0124001240, ZO0560205602\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,570040,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0146901469, ZO0673806738\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,569985,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0554005540, ZO0403504035\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,569835,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0077800778, ZO0177301773\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569873,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0165701657, ZO0485004850\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,52,569905,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0599605996, ZO0403804038\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,6,570508,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0002600026, ZO0328703287\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,52,569699,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0398603986, ZO0521305213\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,570280,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0341703417, ZO0168701687\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Women's Accessories\\",EUR,29,569736,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0517305173, ZO0319703197\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,569777,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0254302543, ZO0289102891\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,569815,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0269602696, ZO0067400674\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,8,570350,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0460004600, ZO0569705697\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,4,569925,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0437004370, ZO0475204752\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,51,570061,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0604606046, ZO0416004160\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,569477,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0533305333, ZO0565105651\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,14,569510,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0312203122, ZO0115101151\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,570309,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0496504965, ZO0269202692\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569787,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0055900559, ZO0224002240\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,36,570388,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0405604056, ZO0604506045\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,569309,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0364103641, ZO0708807088\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,51,570620,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0422204222, ZO0256502565\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,570671,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0240702407, ZO0099400994\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,43,569652,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0665906659, ZO0240002400\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,50,569694,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0398703987, ZO0687806878\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,51,569469,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0434204342, ZO0600206002\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,20,569513,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0135701357, ZO0097600976\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,569356,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0010500105, ZO0172201722\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,568397,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0112101121, ZO0530405304\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,568044,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0630406304, ZO0120201202\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,44,568229,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0192201922, ZO0192801928\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,10,568292,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0534205342, ZO0599605996\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,568386,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0422404224, ZO0291702917\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,44,568023,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0075900759, ZO0489304893\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,42,568789,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0197501975, ZO0079300793\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,39,568331,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0385903859, ZO0516605166\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,568524,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0694706947\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,10,568589,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0114401144, ZO0564705647\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,568640,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0125901259, ZO0443204432\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,14,568682,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0680706807, ZO0392603926\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,569259,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0335503355, ZO0381003810\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,8,568793,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0312503125, ZO0545505455\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,31,568350,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0317303173, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,31,568531,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0482104821, ZO0447104471\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,29,568578,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0520005200, ZO0421104211\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,568609,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0570405704, ZO0256102561\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,568652,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0403304033, ZO0125901259\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,37,568068,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0583005830, ZO0602706027\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,568070,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0575605756, ZO0293302933\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,568106,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0068700687, ZO0101301013\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,568439,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0170601706, ZO0251502515\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,568507,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0431304313, ZO0523605236\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,568236,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0416604166, ZO0581605816\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,568275,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0330903309, ZO0214802148\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,568434,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0362203622, ZO0000300003\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,27,568458,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0164501645, ZO0195501955\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,44,568503,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0643306433, ZO0376203762\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing, Men's Shoes\\",EUR,25,714149,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0309503095, ZO0411904119, ZO0683306833, ZO0397103971\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,568232,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0282902829, ZO0566605666\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing\\",EUR,48,568269,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0318603186, ZO0407904079\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,568301,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0146401464, ZO0014700147\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,568469,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0659806598, ZO0070100701\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,568499,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0474604746, ZO0113801138\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,17,568083,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0200902009, ZO0092300923\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,52,569163,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0681106811, ZO0682706827\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,18,569214,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0490104901, ZO0087200872\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,11,568875,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0613606136, ZO0463804638\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,15,568943,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0445804458, ZO0686106861\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,23,569046,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0393103931, ZO0619906199\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,569103,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0636506365, ZO0345503455\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,33,568993,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0510505105, ZO0482604826\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,720661,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0423004230, ZO0471604716, ZO0315303153, ZO0445604456\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,569144,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0108101081, ZO0501105011\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,569198,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0464304643, ZO0581905819\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,568845,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0657906579, ZO0258102581\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,24,568894,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0141801418, ZO0206302063\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,568938,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0642806428, ZO0632506325\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,11,569045,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0315903159, ZO0461104611\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,30,569097,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0511605116, ZO0483004830\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,727370,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0680206802, ZO0321703217, ZO0049900499, ZO0029400294\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,49,568751,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0308703087, ZO0613106131\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,43,569010,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0090700907, ZO0265002650\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,25,568745,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0528305283, ZO0309203092\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories, Women's Clothing\\",EUR,5,728962,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0019800198, ZO0089200892, ZO0069700697, ZO0332303323\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,23,568069,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0530305303, ZO0528405284\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,732546,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0228602286, ZO0502605026, ZO0108901089, ZO0362503625\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,17,568218,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0227402274, ZO0079000790\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,568278,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0536705367, ZO0449804498\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,568428,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0408404084, ZO0422304223\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,568492,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0346103461, ZO0054100541\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,569262,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0609906099, ZO0614806148\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,569306,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0412004120, ZO0625406254\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,21,569223,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0444004440, ZO0596805968\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,568039,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0599705997, ZO0416704167\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,52,568117,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0315203152, ZO0406304063\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,568165,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0065600656, ZO0337003370\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,568393,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0374103741, ZO0242102421\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,567996,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0105401054, ZO0046200462\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,569173,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0452204522, ZO0631206312\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,49,569209,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0472304723, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,568865,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0294502945, ZO0560605606\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,23,568926,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0298302983, ZO0300003000\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,568955,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0068900689, ZO0076200762\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,43,569056,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0494804948, ZO0096000960\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,569083,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0099000990, ZO0631606316\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,717726,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0284902849, ZO0481204812, ZO0398403984, ZO0282402824\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,24,568149,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0342503425, ZO0675206752\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,568192,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0485504855, ZO0355603556\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569183,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0641206412, ZO0165301653\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,568818,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0294802948, ZO0451404514\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,568854,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0616706167, ZO0255402554\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,4,568901,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0466704667, ZO0427104271\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,9,568954,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0399603996, ZO0685906859\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,45,569033,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0015700157, ZO0362503625\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,11,569091,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0258602586, ZO0552205522\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,4,569003,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0414704147, ZO0387503875\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,41,568707,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0513305133, ZO0253302533\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,568019,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0530805308, ZO0563905639\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,568182,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0338603386, ZO0641006410\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,569299,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0519605196, ZO0630806308\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,13,569123,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0609006090, ZO0441504415\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,728335,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0134701347, ZO0026200262, ZO0223102231, ZO0022900229\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,726874,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0362303623, ZO0035400354, ZO0705207052, ZO0504005040\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,569218,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0633206332, ZO0488604886\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,722613,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0618806188, ZO0442804428, ZO0530705307, ZO0410804108\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,568152,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0349303493, ZO0043900439\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,568212,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0536405364, ZO0688306883\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,568228,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0387103871, ZO0580005800\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,568455,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0413104131, ZO0392303923\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,567994,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0430904309, ZO0288402884\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,568045,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0160501605, ZO0069500695\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,568308,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0138701387, ZO0024600246\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,568515,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0159901599, ZO0238702387\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,721706,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0519005190, ZO0610206102, ZO0514405144, ZO0586505865\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,569250,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0228902289, ZO0005400054\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,568776,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0616906169, ZO0296902969\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,568014,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0523905239, ZO0556605566\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,568702,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0142801428, ZO0182801828\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,22,568128,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0087500875, ZO0007100071\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,568177,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0584505845, ZO0403804038\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,569178,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0177001770, ZO0260502605\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,28,568877,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0132401324, ZO0058200582\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,33,568898,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0542205422, ZO0517805178\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,42,568941,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0076600766, ZO0068800688\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,12,569027,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0245402454, ZO0060100601\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,28,569055,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0375903759, ZO0269402694\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,569107,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0339603396, ZO0504705047\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,25,714385,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0586805868, ZO0609106091, ZO0310903109, ZO0420104201\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,723213,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0297802978, ZO0456704567, ZO0572105721, ZO0280502805\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,568325,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0288202882, ZO0391803918\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,568360,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0480304803, ZO0274402744\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,569278,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0271802718, ZO0057100571\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,568816,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0146601466, ZO0108601086\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,21,568375,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0623606236, ZO0605306053\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,38,568559,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0599005990, ZO0626506265\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,45,568611,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0174701747, ZO0305103051\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,16,568638,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0388003880, ZO0478304783\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,20,568706,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0672206722, ZO0331903319\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories, Men's Clothing\\",EUR,25,716889,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0510505105, ZO0482404824, ZO0602306023, ZO0445904459\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,728580,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0156601566, ZO0498004980, ZO0070700707, ZO0086700867\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,568762,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0052200522, ZO0265602656\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,568571,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0034100341, ZO0343103431\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,568671,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0637406374, ZO0219002190\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,568774,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0037200372, ZO0369303693\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,568319,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0535105351, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,568363,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0629806298, ZO0467104671\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,568541,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0428904289, ZO0588205882\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,42,568586,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0232202322, ZO0208402084\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,568636,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0503905039, ZO0631806318\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,22,568674,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0192301923, ZO0011400114\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,9,567868,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0310403104, ZO0416604166\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,42,567446,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0322803228, ZO0002700027\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,7,567340,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0615606156, ZO0514905149\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,567736,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0663706637, ZO0620906209\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,567755,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0571405714, ZO0255402554\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,715455,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0477504775, ZO0613206132, ZO0585405854, ZO0110701107\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566768,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0217702177, ZO0331703317\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,45,566812,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0266902669, ZO0244202442\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,9,566680,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0316703167, ZO0393303933\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,566944,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0497004970, ZO0054900549\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566979,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0071900719, ZO0493404934\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,11,566734,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0691006910, ZO0314203142\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,567094,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0442904429, ZO0629706297\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,38,566892,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0589505895, ZO0575405754\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,567950,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0273002730, ZO0541105411\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,566826,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0575305753, ZO0540605406\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,567240,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0421004210, ZO0689006890\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,567290,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0442704427\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,24,567669,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0148301483, ZO0202902029\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,567365,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0008600086, ZO0266002660\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,566845,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0547905479, ZO0583305833\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,567048,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0566905669, ZO0564005640\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,567281,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0221402214, ZO0632806328\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,567119,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0711507115, ZO0350903509\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,567169,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0558805588, ZO0622206222\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,567869,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0565105651, ZO0443804438\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,567909,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0609606096, ZO0588905889\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,44,567524,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0096300963, ZO0377403774\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,567565,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0015600156, ZO0323603236\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,28,567019,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0151301513, ZO0204902049\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,567069,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0503805038, ZO0047500475\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,567935,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0116101161, ZO0574305743\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,566831,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0341103411, ZO0648406484\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,51,567543,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0608106081, ZO0296502965\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,567598,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0039400394, ZO0672906729\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,567876,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0705707057, ZO0047700477\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,6,567684,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0201202012, ZO0035000350\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,7,567790,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0522405224, ZO0405104051\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,32,567465,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0274502745, ZO0686006860\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,50,567256,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0461004610, ZO0702707027\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,13,716462,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0549505495, ZO0458504585, ZO0602506025, ZO0617506175\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,46,566775,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0671006710, ZO0708007080\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,567926,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0113301133, ZO0562105621\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,566829,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0100901009, ZO0235102351\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,567666,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0311403114, ZO0282002820\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,567383,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0647406474, ZO0330703307\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,567381,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0278402784, ZO0458304583\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,567437,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0275902759, ZO0545005450\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,14,567324,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0426604266, ZO0629406294\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,21,567504,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0606506065, ZO0277702777\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,42,567623,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0239802398, ZO0645406454\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,52,567400,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0605606056, ZO0588105881\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,43,566757,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0196201962, ZO0168601686\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,12,566884,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0490204902, ZO0025000250\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,567815,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0263602636, ZO0241002410\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,567177,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0197301973, ZO0180401804\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,733060,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0155601556, ZO0013600136, ZO0235702357, ZO0383203832\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,42,567486,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0058200582, ZO0365503655\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,567625,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0328603286, ZO0328803288\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,10,567224,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0128501285, ZO0606306063\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,22,567252,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0369803698, ZO0220502205\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,567735,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0129701297, ZO0518705187\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,22,567822,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0244802448, ZO0346303463\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,31,567852,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0523805238, ZO0596505965\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,8,566861,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0520305203, ZO0462204622\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,567042,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0243002430, ZO0103901039\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,731037,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0148801488, ZO0335003350, ZO0155301553, ZO0074300743\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,19,567729,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0395103951, ZO0296102961\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,567384,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0426704267, ZO0612006120\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,566690,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0449004490, ZO0118501185\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,49,566951,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0406604066, ZO0517405174\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,566982,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0149301493, ZO0099800998\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,50,566725,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0444404444, ZO0584205842\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,43,566856,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0216502165, ZO0327503275\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,567039,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0184101841, ZO0711207112\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,567068,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0038000380, ZO0711007110\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",EUR,5,732229,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0175701757, ZO0163801638, ZO0697506975, ZO0245602456\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,724806,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0643106431, ZO0033300333, ZO0696206962, ZO0651206512\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,567769,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0414004140, ZO0630106301\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,566772,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0152901529, ZO0019100191\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,567318,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0421104211, ZO0256202562\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,6,567615,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0013500135, ZO0174501745\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,37,567316,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0390403904, ZO0403004030\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,20,566896,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0242702427, ZO0090000900\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,50,567418,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0400404004, ZO0625006250\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,567462,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0644406444, ZO0709307093\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,567667,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0273802738, ZO0300303003\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,567703,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0037900379, ZO0134901349\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,567260,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0068100681, ZO0674106741\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,724844,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0707507075, ZO0246402464, ZO0226802268, ZO0343503435\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,45,567308,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0181601816, ZO0011000110\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,567404,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0107101071, ZO0537905379\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,31,567538,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0596905969, ZO0450804508\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,46,567593,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0655306553, ZO0208902089\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,15,567294,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0317403174, ZO0457204572\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,17,728256,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0371903719, ZO0352803528, ZO0137501375, ZO0229202292\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,567544,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0585005850, ZO0120301203\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,567592,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0535405354, ZO0291302913\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,44,566942,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0084000840, ZO0636606366\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,567015,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0558605586, ZO0527805278\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,28,567081,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0209702097, ZO0186301863\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567475,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0578805788, ZO0520405204\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,567631,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0101101011, ZO0667406674\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,567454,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0645406454, ZO0166001660\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,28,567855,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0657106571, ZO0084800848\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,567835,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0589405894, ZO0483304833\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,567889,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0282202822, ZO0393003930\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,566852,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0257002570, ZO0455404554\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,5,567037,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0206402064, ZO0365903659\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,721778,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0400004000, ZO0519305193, ZO0482004820, ZO0540305403\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,38,567143,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0573005730, ZO0313203132\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,567191,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0113901139, ZO0478904789\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,567135,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0528305283, ZO0549305493\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,727730,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0050600506, ZO0710907109, ZO0023300233, ZO0334603346\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,25,567939,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0127201272, ZO0425504255\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567970,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0441504415, ZO0691606916\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,567301,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0577605776, ZO0438104381\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,566801,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0279702797, ZO0573705737\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,566685,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0296902969, ZO0530205302\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,20,566924,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0673606736, ZO0161801618\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,11,567662,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0308903089, ZO0614306143\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,20,567708,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0090500905, ZO0466204662\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,567573,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0215602156, ZO0336803368\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,717603,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0685306853, ZO0585305853, ZO0450504505, ZO0552405524\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,17,566986,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0360903609, ZO0030100301\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566735,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0632406324, ZO0060300603\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,9,567082,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0278802788, ZO0515605156\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,14,566881,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0419604196, ZO0559705597\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,20,566790,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0699206992, ZO0641306413\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,566706,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0521505215, ZO0130501305\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,50,566935,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0473704737, ZO0121501215\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,566985,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0044700447, ZO0502105021\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,38,566729,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0557305573, ZO0110401104\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,26,567095,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0339803398, ZO0098200982\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,724326,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0499404994, ZO0641606416, ZO0334303343, ZO0676706767\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,4,567806,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0517705177, ZO0569305693\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,18,567973,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0495104951, ZO0305903059\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,567341,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0674506745, ZO0219202192\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,567492,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0277302773, ZO0443004430\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567654,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0121301213, ZO0399403994\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,44,567403,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0138601386, ZO0259202592\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,567207,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0033600336, ZO0109401094\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing\\",EUR,13,567356,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0319503195, ZO0409904099\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,565855,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0417504175, ZO0535205352\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,19,565915,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0515005150, ZO0509805098\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,566343,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0185101851, ZO0052800528\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,26,566400,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0204702047, ZO0009600096\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,565776,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0343103431, ZO0345803458\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,566607,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0572205722, ZO0585205852\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565452,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0133601336, ZO0643906439\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,46,566051,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0025600256, ZO0270202702\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,565466,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0285402854, ZO0538605386\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,566553,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0435004350, ZO0544005440\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,565446,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0643206432, ZO0140101401\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,566053,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0284702847, ZO0299202992\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,565605,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0113301133\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,46,566170,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0324803248, ZO0703907039\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,566187,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0548905489, ZO0459404594\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,566125,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0433104331, ZO0549505495\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,566156,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0117901179\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,6,566100,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0013400134, ZO0667306673\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,566280,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0573205732, ZO0116701167\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,31,565708,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0253302533, ZO0605706057\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,565809,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0557905579, ZO0513705137\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,18,566256,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0227302273, ZO0668706687\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,27,565639,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0193901939, ZO0080400804\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,565684,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0507705077, ZO0409804098\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,565945,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0270602706, ZO0269502695\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,18,565988,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0074700747, ZO0645206452\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,15,565732,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0291402914, ZO0603006030\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,29,566042,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0451804518, ZO0127901279\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,25,566456,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0597105971, ZO0283702837\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,565542,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0224302243, ZO0359103591\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,566121,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0227202272, ZO0357003570\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,36,566101,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0691406914, ZO0617806178\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,566653,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0666506665, ZO0216602166\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,28,565838,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0343703437, ZO0207102071\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,6,565804,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0306803068, ZO0174601746\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,31,566247,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0384903849, ZO0403504035\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,37,566036,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0583605836, ZO0510605106\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,565459,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0242302423, ZO0676006760\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565819,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0031700317, ZO0157701577\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,17,731352,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0018200182, ZO0016100161, ZO0329703297, ZO0057800578\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,565667,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0618706187, ZO0388503885\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565900,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0266102661, ZO0169701697\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,566360,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0285102851, ZO0658306583\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,33,566416,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0396903969, ZO0607906079\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,46,565796,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0081500815, ZO0342603426\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,566261,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0577105771, ZO0289302893\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,565567,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0437604376, ZO0618906189\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,565596,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0332903329, ZO0159401594\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Women's Accessories\\",EUR,52,717206,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0390403904, ZO0608306083, ZO0690906909, ZO0394403944\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,715081,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0688806888, ZO0399003990, ZO0412404124, ZO0405304053\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,20,566428,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0136501365, ZO0339103391\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,45,566334,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0010800108, ZO0635706357\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,566391,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0228302283, ZO0167501675\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,715133,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0537005370, ZO0508605086, ZO0566605666, ZO0111301113\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,52,717057,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0623406234, ZO0404704047, ZO0384603846, ZO0476204762\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,22,566315,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0703707037, ZO0139601396\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565698,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0336503365, ZO0637006370\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,566167,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0623006230, ZO0419304193\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,566215,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0384903849, ZO0579305793\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,566070,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0046100461, ZO0151201512\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,16,566621,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0579605796, ZO0315803158\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,566284,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0541405414, ZO0588205882\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,566518,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0554605546, ZO0569005690\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,25,565580,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0395303953, ZO0386703867\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,565830,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0215702157, ZO0638806388\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,16,566454,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0547405474, ZO0401104011\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,30,566506,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0680806808, ZO0609306093\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,22,565948,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0190701907, ZO0654806548\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,565998,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0238802388, ZO0066600666\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565401,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0014800148, ZO0154501545\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,565728,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0486404864, ZO0248602486\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,5,565489,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0077200772, ZO0643006430\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,565366,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0684906849, ZO0575905759\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,25,720445,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0423004230, ZO0292702927, ZO0320003200, ZO0318303183\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,565768,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0458004580, ZO0273402734\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,565538,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0486804868, ZO0371603716\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,565404,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0048900489, ZO0228702287\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,715961,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0444904449, ZO0292502925, ZO0434604346, ZO0461804618\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,566382,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0503505035, ZO0240302403\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,565877,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0125401254, ZO0123701237\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,48,566364,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0512505125, ZO0525005250\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,48,565479,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0588805888, ZO0314903149\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,565360,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0448604486, ZO0450704507\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,39,565734,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0513205132, ZO0258202582\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,566514,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0539305393, ZO0522305223\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,18,565970,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0673406734, ZO0165601656\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing, Women's Accessories\\",EUR,27,723242,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0249702497, ZO0643306433, ZO0088900889, ZO0634406344\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,720399,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0386303863, ZO0561905619, ZO0397903979, ZO0590105901\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,566580,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0417304173, ZO0123001230\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,566671,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0427604276, ZO0113801138\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,52,566176,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0607206072, ZO0431404314\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,566146,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0646206462, ZO0146201462\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565760,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0504505045, ZO0223802238\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,565521,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0660406604, ZO0484504845\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,566320,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0105001050, ZO0652306523\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,566357,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0061600616, ZO0180701807\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,24,566415,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0261102611, ZO0667106671\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,566044,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0552605526, ZO0292702927\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,22,565473,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0365303653, ZO0235802358\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,18,565339,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0346503465, ZO0678406784\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,14,565591,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0683806838, ZO0429204292\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",EUR,5,730725,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0501605016, ZO0189601896, ZO0363003630, ZO0699306993\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,566443,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0160201602, ZO0261502615\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,51,566498,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0387103871, ZO0550005500\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,565985,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0436604366, ZO0280302803\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565640,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0631606316, ZO0045300453\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,49,565683,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0573205732, ZO0310303103\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,565767,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0414304143, ZO0425204252\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,566452,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0706307063, ZO0011300113\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,13,565982,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0410804108, ZO0309303093\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,726754,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0138001380, ZO0648006480, ZO0193501935, ZO0228402284\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,24,565723,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0302303023, ZO0246602466\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing\\",EUR,31,565896,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0466104661, ZO0444104441\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,52,718085,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0129001290, ZO0310103101, ZO0547805478, ZO0560805608\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,5,566248,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0678806788, ZO0186101861\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,565560,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0567505675, ZO0442104421\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,8,566186,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0522105221, ZO0459104591\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,566155,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0501005010, ZO0214002140\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,28,566628,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0195601956, ZO0098900989\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,9,566519,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0700907009, ZO0115801158\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,565697,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0498904989, ZO0641706417\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,45,566417,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0084900849, ZO0194701947\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,565722,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0656406564, ZO0495504955\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,565330,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0621606216, ZO0628806288\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,44,565381,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0060200602, ZO0076300763\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,565564,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0576305763, ZO0116801168\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,565392,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0616606166, ZO0592205922\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,6,565410,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0023600236, ZO0704307043\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,565504,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0653406534, ZO0049300493\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,44,565334,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0641706417, ZO0382303823\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,566079,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0663306633, ZO0687306873\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,566622,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0228402284, ZO0082300823\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,27,566650,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0049100491, ZO0194801948\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,566295,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0635606356, ZO0043100431\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566538,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0224402244, ZO0342403424\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,565918,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0155001550, ZO0072100721\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,565678,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0081800818, ZO0485604856\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,16,566564,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0107301073, ZO0293002930\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,565498,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0046600466, ZO0503305033\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,565793,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0712807128, ZO0007500075\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,566232,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0545205452, ZO0437304373\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,25,566259,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0694206942, ZO0553805538\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,566591,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0502405024, ZO0366003660\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,564670,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0531205312, ZO0684706847\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564710,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0263402634, ZO0499404994\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,564429,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0260702607, ZO0495804958\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,564479,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0409304093, ZO0436904369\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,564513,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0390003900, ZO0287902879\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,6,564885,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0303803038, ZO0192501925\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,565150,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0624906249, ZO0411604116\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,13,565206,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0316303163, ZO0401004010\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564759,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0218802188, ZO0492604926\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,564144,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0218602186, ZO0501005010\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,563909,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0452804528, ZO0453604536\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,28,564869,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0192401924, ZO0366703667\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,10,564619,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0470304703, ZO0406204062\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,34,564237,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0311203112, ZO0395703957\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,564269,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0281102811, ZO0555705557\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,564842,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0432004320, ZO0403504035\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,43,564893,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0322403224, ZO0227802278\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564215,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0147201472, ZO0152201522\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,564725,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0071700717, ZO0364303643\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,37,564733,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0384303843, ZO0273702737\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,564331,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0229402294, ZO0303303033\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,564350,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0444104441, ZO0476804768\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564398,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0328703287, ZO0351003510\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,564409,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0178501785, ZO0503805038\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,564024,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0534405344, ZO0619006190\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,48,564271,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0507905079, ZO0430804308\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,564676,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0108401084, ZO0139301393\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,564445,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0593805938, ZO0701407014\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,50,564241,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0605506055, ZO0547505475\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,564272,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0534405344, ZO0512105121\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,564844,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0553205532, ZO0526205262\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,564883,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0705607056, ZO0334703347\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,5,564307,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0246602466, ZO0195201952\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,564148,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0057900579, ZO0211602116\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,44,564009,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0487904879, ZO0027100271\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,564532,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0474704747, ZO0622006220\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565308,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0172401724, ZO0184901849\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,27,564339,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0082900829, ZO0347903479\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,37,564361,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0422304223, ZO0600506005\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,564394,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0269902699, ZO0667906679\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564030,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0179901799, ZO0637606376\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,564661,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0415004150, ZO0125501255\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,564706,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0709007090, ZO0362103621\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564460,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0655106551, ZO0349403494\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,22,564536,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0304603046, ZO0370603706\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,46,564559,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0015500155, ZO0650806508\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,564609,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0162401624, ZO0156001560\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,25,565138,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0615506155, ZO0445304453\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,565025,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0280802808, ZO0549005490\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,564000,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0364603646, ZO0018200182\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,34,564557,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0664606646, ZO0460404604\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,27,564604,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0237702377, ZO0304303043\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,23,564777,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0452704527, ZO0122201222\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,564812,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0266002660, ZO0031900319\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,715752,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0130801308, ZO0402604026, ZO0630506305, ZO0297402974\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,22,563964,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0001200012, ZO0251902519\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564315,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0221002210, ZO0263702637\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565237,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0323303233, ZO0172101721\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,34,565090,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0690306903, ZO0521005210\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,21,564649,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0405704057, ZO0411704117\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,564510,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0093600936, ZO0145301453\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,12,565222,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0102001020, ZO0252402524\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,29,565233,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0614906149, ZO0430404304\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,565084,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0549805498, ZO0541205412\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,564796,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0022100221, ZO0172301723\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,564627,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0211702117, ZO0499004990\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,29,564257,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0539205392, ZO0577705777\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,564701,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0585205852, ZO0418104181\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,8,564915,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0286502865, ZO0394703947\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,22,564954,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0362903629, ZO0048100481\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,565009,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0225302253, ZO0183101831\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,564065,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0711207112, ZO0646106461\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,46,563927,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0009800098, ZO0362803628\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,51,564937,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0520605206, ZO0432204322\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,564994,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0180601806, ZO0710007100\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,24,564070,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0234202342, ZO0245102451\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,563928,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0394103941\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,5,727071,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0091900919, ZO0660006600, ZO0197001970, ZO0074600746\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,50,565284,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0687206872, ZO0422304223\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,564380,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0050400504, ZO0660006600\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,18,565276,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0131501315, ZO0668806688\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,6,564819,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0374603746, ZO0697106971\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,38,717243,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0479104791, ZO0125301253, ZO0459004590, ZO0549905499\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,564140,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0221002210, ZO0268502685\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,564164,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0673506735, ZO0213002130\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564207,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0711807118, ZO0073100731\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,564735,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0509705097, ZO0120501205\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,565077,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0118701187, ZO0123901239\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,564274,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0542905429, ZO0423604236\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,565161,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0441404414, ZO0430504305\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,42,565039,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0489804898, ZO0695006950\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,723683,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0648206482, ZO0496104961, ZO0142601426, ZO0491504915\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,563967,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0493404934, ZO0640806408\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,564533,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0496704967, ZO0049700497\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,49,565266,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0255602556, ZO0468304683\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,4,564818,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0475004750, ZO0412304123\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,23,564932,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0557305573, ZO0607806078\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,18,564968,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0134101341, ZO0062400624\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,565002,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0354203542, ZO0338503385\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,48,564095,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0613806138, ZO0403504035\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,563924,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0539805398, ZO0554205542\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,564770,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0704907049, ZO0024700247\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,563965,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0045800458, ZO0503405034\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564957,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0171601716, ZO0214602146\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,41,564032,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0478404784, ZO0521905219\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,37,564075,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0622706227, ZO0525405254\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,34,563931,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0444304443, ZO0596505965\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,18,564940,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0026800268, ZO0003600036\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,564987,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0526805268, ZO0478104781\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,25,564080,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0415804158, ZO0460804608\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,8,564106,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0298002980, ZO0313103131\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,563947,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0348103481, ZO0164501645\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,725995,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0222102221, ZO0332103321, ZO0182701827, ZO0230502305\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,32,564756,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0556805568, ZO0481504815\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,565137,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0118501185, ZO0561905619\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,27,565173,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0203802038, ZO0014900149\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,565214,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0588705887\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,564804,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0259702597, ZO0640606406\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,43,565052,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0697006970, ZO0711407114\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,45,565091,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0324703247, ZO0088600886\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,565231,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0235202352, ZO0135001350\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,6,564190,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0243902439, ZO0208702087\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,564876,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0215502155, ZO0168101681\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,27,564902,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0698406984, ZO0704207042\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,564761,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0665006650, ZO0709407094\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,731788,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0486004860, ZO0177901779, ZO0680506805, ZO0340503405\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,564340,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0399703997, ZO0565805658\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,564395,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0236702367, ZO0660706607\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,45,564686,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0373303733, ZO0131201312\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,44,564446,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0093400934, ZO0679406794\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,43,564481,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0321603216, ZO0078000780\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,20,563953,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0376203762, ZO0303603036\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,565061,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681106811, ZO0286402864\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,565100,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0069000690, ZO0490004900\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,565263,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0582705827, ZO0111801118\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,563984,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0121301213, ZO0294102941\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,12,565262,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0303503035, ZO0197601976\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,28,565304,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0017800178, ZO0229602296\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,10,565123,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0316903169, ZO0400504005\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,48,565160,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0693306933, ZO0514605146\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,14,565224,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0406604066, ZO0576805768\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,564121,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0291902919, ZO0617206172\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,23,564166,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0607106071, ZO0470704707\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,564739,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0335603356, ZO0236502365\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,564016,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0436904369, ZO0290402904\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,564576,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681206812, ZO0441904419\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,43,564605,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0333103331, ZO0694806948\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,17,730663,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0697406974, ZO0370303703, ZO0368103681, ZO0013800138\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,34,564366,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681906819, ZO0549705497\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,44,564221,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0249702497, ZO0487404874\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,42,564174,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0032300323, ZO0236302363\\" +" +`; + +exports[`discover Discover CSV Export Generate CSV: archived search generates a report with discover:searchFieldsFromSource = true 1`] = ` +"\\"order_date\\",category,currency,\\"customer_id\\",\\"order_id\\",\\"day_of_week_i\\",\\"products.created_on\\",sku +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,12,570552,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0216402164, ZO0666306663\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,570520,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0618906189, ZO0289502895\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,570569,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0643506435, ZO0646406464\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,45,570133,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0320503205, ZO0049500495\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,4,570161,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0606606066, ZO0596305963\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,17,570200,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0025100251, ZO0101901019\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,732050,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0101201012, ZO0230902309, ZO0325603256, ZO0056400564\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,52,719675,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0448604486, ZO0686206862, ZO0395403954, ZO0528505285\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,26,570396,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0495604956, ZO0208802088\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,17,570037,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0321503215, ZO0200102001\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,569311,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0024600246, ZO0660706607\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,29,570632,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0432404324, ZO0313603136\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,569674,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0423104231, ZO0408804088\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,569716,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0146701467, ZO0212902129\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,569962,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0129901299, ZO0440704407\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,569821,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0066600666, ZO0049000490\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,569898,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0591805918, ZO0474004740\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,34,570232,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0682006820, ZO0399103991\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,25,721217,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0567705677, ZO0414204142, ZO0415904159, ZO0119801198\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,570111,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0253002530, ZO0117101171\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,569610,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0140001400, ZO0219302193\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,29,570087,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0308403084, ZO0623506235\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,570442,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0175501755, ZO0103601036\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,4,569548,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0587605876, ZO0463904639\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Women's Accessories\\",EUR,16,569577,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0464404644, ZO0128401284\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,569611,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0450604506, ZO0440304403\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,570480,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0286202862, ZO0694506945\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,570594,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0111901119, ZO0540605406\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,570077,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0433904339, ZO0627706277\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,24,570056,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0131801318, ZO0215802158\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,5,725669,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0234102341, ZO0353703537, ZO0265102651, ZO0149501495\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,18,570694,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0376703767, ZO0350603506\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,25,570542,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0623606236, ZO0565405654\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,42,570576,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0637906379, ZO0325103251\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Accessories, Men's Clothing\\",EUR,52,716588,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0318303183, ZO0310503105, ZO0584605846, ZO0609706097\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,25,719459,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0410004100, ZO0513605136, ZO0431404314, ZO0662906629\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,10,569531,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0664106641, ZO0549105491\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569569,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0070600706, ZO0488704887\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569614,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0226202262, ZO0647006470\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,20,570484,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0712407124, ZO0095600956\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,569679,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0433604336, ZO0275702757\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,570250,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0638906389, ZO0148001480\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,25,570303,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0573305733, ZO0513205132\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Women's Accessories\\",EUR,7,569746,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0484004840, ZO0605906059\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,569806,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0558305583\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,570353,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0413704137, ZO0559205592\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,570021,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0709807098, ZO0166301663\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,570502,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0280602806, ZO0408504085\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,570477,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0299202992, ZO0392403924\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,43,570263,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0041800418, ZO0194901949\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,18,570304,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0053000530, ZO0360203602\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,569743,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0610306103\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,5,569529,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0264102641, ZO0658706587\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes, Women's Accessories\\",EUR,38,714566,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0430204302, ZO0397303973, ZO0686806868, ZO0320403204\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,712856,3,\\"Dec 15, 2016 @ 00:00:00.000\\",ZO0263202632 +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing, Men's Accessories\\",EUR,52,713377,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0318803188, ZO0535005350, ZO0445504455, ZO0599605996\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,570472,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0478704787, ZO0591205912\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,50,570120,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0392903929, ZO0254802548\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,570177,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0532905329, ZO0524105241\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,570209,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0658306583, ZO0570705707\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,570254,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0495304953, ZO0634906349\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,20,569734,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0348703487, ZO0141401414\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,48,569814,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0602606026, ZO0298402984\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,32,570414,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0481704817, ZO0396503965\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,39,569436,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0386103861, ZO0451504515\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,41,570079,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0598505985, ZO0449304493\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,37,569637,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0300103001, ZO0688106881\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,570588,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0092000920, ZO0152001520\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,17,569567,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0366203662, ZO0361403614\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,569645,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0392803928, ZO0277102771\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,18,570658,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0003600036, ZO0016800168\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,712926,3,\\"Dec 15, 2016 @ 00:00:00.000\\",ZO0263002630 +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,570264,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0627206272, ZO0285702857\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,26,569424,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0175201752, ZO0206202062\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,4,569468,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0285202852, ZO0448304483\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,14,569505,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0608906089, ZO0478504785\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,569337,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0634106341, ZO0066900669\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,569362,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0292402924, ZO0681006810\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,569375,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0347603476, ZO0668806688\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,569387,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0593805938, ZO0125201252\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes, Women's Accessories\\",EUR,52,713556,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0592105921, ZO0421204212, ZO0400604006, ZO0319403194\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,569919,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0051200512, ZO0232602326\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,569768,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0231502315, ZO0131401314\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,570334,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0520205202, ZO0545205452\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,570374,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0674906749, ZO0073200732\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,570024,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0631506315, ZO0426804268\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,19,570143,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0482904829\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,730736,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0074200742, ZO0266602666, ZO0364503645, ZO0134601346\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,570075,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0621706217, ZO0114301143\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,43,569623,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0208302083, ZO0307603076\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,29,569546,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0559105591, ZO0563205632\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,570532,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0557405574, ZO0118601186\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,8,570586,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0694206942, ZO0596505965\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,569452,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0159301593, ZO0250502505\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,569496,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0659006590, ZO0103801038\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,14,569336,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0512505125, ZO0384103841\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,42,569370,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0358603586, ZO0641106411\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,45,569411,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0094200942, ZO0003700037\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,570663,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0152501525, ZO0104201042\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,570491,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0198901989, ZO0104701047\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,570608,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0478504785, ZO0663306633\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,20,569371,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0225702257, ZO0186601866\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,46,570065,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0027300273, ZO0698606986\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,569624,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0333803338, ZO0138901389\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,27,569953,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0021100211, ZO0193601936\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,8,569984,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0537205372, ZO0403504035\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,569822,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0271402714, ZO0047200472\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,20,569880,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0325303253, ZO0244002440\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,570234,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0707007070, ZO0016200162\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,46,570512,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0332003320, ZO0357103571\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,569422,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0102501025, ZO0063500635\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,30,569958,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0311903119, ZO0563305633\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,34,570003,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0298902989, ZO0694506945\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,22,569868,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0200702007, ZO0106501065\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,569710,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0053600536, ZO0239702397\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,570151,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0589105891, ZO0587705877\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,17,725499,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0678306783, ZO0305503055, ZO0369203692, ZO0006700067\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,31,569338,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0702507025, ZO0528105281\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,569392,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0516405164, ZO0532705327\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,712590,3,\\"Dec 15, 2016 @ 00:00:00.000\\",ZO0262202622 +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,31,569312,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0425104251, ZO0107901079\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,570643,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0618806188, ZO0119701197\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,44,570687,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0135501355, ZO0675806758\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,13,569939,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0471304713, ZO0528905289\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,45,569968,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0047300473, ZO0142401424\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,569995,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0125701257, ZO0664706647\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,570009,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0510705107, ZO0594605946\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,44,569834,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0076900769, ZO0151501515\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,42,569869,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0362803628, ZO0237802378\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,569900,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0644506445, ZO0104901049\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,570164,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0210002100, ZO0068200682\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,569761,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0166101661, ZO0337203372\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,570335,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0337703377, ZO0048500485\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,570372,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0124001240, ZO0560205602\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,570040,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0146901469, ZO0673806738\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,569985,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0554005540, ZO0403504035\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,569835,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0077800778, ZO0177301773\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569873,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0165701657, ZO0485004850\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,52,569905,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0599605996, ZO0403804038\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,6,570508,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0002600026, ZO0328703287\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,52,569699,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0398603986, ZO0521305213\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,570280,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0341703417, ZO0168701687\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Women's Accessories\\",EUR,29,569736,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0517305173, ZO0319703197\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,569777,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0254302543, ZO0289102891\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,569815,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0269602696, ZO0067400674\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,8,570350,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0460004600, ZO0569705697\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,4,569925,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0437004370, ZO0475204752\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,51,570061,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0604606046, ZO0416004160\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,569477,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0533305333, ZO0565105651\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,14,569510,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0312203122, ZO0115101151\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,570309,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0496504965, ZO0269202692\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569787,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0055900559, ZO0224002240\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,36,570388,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0405604056, ZO0604506045\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,569309,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0364103641, ZO0708807088\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,51,570620,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0422204222, ZO0256502565\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,570671,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0240702407, ZO0099400994\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,43,569652,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0665906659, ZO0240002400\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,50,569694,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0398703987, ZO0687806878\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,51,569469,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0434204342, ZO0600206002\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,20,569513,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0135701357, ZO0097600976\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,569356,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0010500105, ZO0172201722\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,568397,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0112101121, ZO0530405304\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,568044,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0630406304, ZO0120201202\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,44,568229,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0192201922, ZO0192801928\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,10,568292,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0534205342, ZO0599605996\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,568386,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0422404224, ZO0291702917\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,44,568023,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0075900759, ZO0489304893\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,42,568789,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0197501975, ZO0079300793\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,39,568331,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0385903859, ZO0516605166\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,568524,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0694706947\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,10,568589,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0114401144, ZO0564705647\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,568640,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0125901259, ZO0443204432\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,14,568682,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0680706807, ZO0392603926\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,569259,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0335503355, ZO0381003810\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,8,568793,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0312503125, ZO0545505455\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,31,568350,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0317303173, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,31,568531,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0482104821, ZO0447104471\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,29,568578,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0520005200, ZO0421104211\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,568609,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0570405704, ZO0256102561\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,568652,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0403304033, ZO0125901259\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,37,568068,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0583005830, ZO0602706027\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,568070,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0575605756, ZO0293302933\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,568106,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0068700687, ZO0101301013\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,568439,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0170601706, ZO0251502515\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,568507,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0431304313, ZO0523605236\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,568236,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0416604166, ZO0581605816\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,568275,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0330903309, ZO0214802148\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,568434,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0362203622, ZO0000300003\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,27,568458,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0164501645, ZO0195501955\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,44,568503,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0643306433, ZO0376203762\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing, Men's Shoes\\",EUR,25,714149,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0309503095, ZO0411904119, ZO0683306833, ZO0397103971\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,568232,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0282902829, ZO0566605666\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing\\",EUR,48,568269,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0318603186, ZO0407904079\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,568301,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0146401464, ZO0014700147\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,568469,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0659806598, ZO0070100701\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,568499,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0474604746, ZO0113801138\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,17,568083,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0200902009, ZO0092300923\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,52,569163,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0681106811, ZO0682706827\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,18,569214,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0490104901, ZO0087200872\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,11,568875,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0613606136, ZO0463804638\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,15,568943,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0445804458, ZO0686106861\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,23,569046,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0393103931, ZO0619906199\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,569103,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0636506365, ZO0345503455\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,33,568993,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0510505105, ZO0482604826\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,720661,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0423004230, ZO0471604716, ZO0315303153, ZO0445604456\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,569144,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0108101081, ZO0501105011\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,569198,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0464304643, ZO0581905819\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,568845,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0657906579, ZO0258102581\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,24,568894,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0141801418, ZO0206302063\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,568938,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0642806428, ZO0632506325\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,11,569045,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0315903159, ZO0461104611\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,30,569097,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0511605116, ZO0483004830\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,727370,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0680206802, ZO0321703217, ZO0049900499, ZO0029400294\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,49,568751,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0308703087, ZO0613106131\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,43,569010,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0090700907, ZO0265002650\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,25,568745,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0528305283, ZO0309203092\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories, Women's Clothing\\",EUR,5,728962,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0019800198, ZO0089200892, ZO0069700697, ZO0332303323\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,23,568069,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0530305303, ZO0528405284\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,732546,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0228602286, ZO0502605026, ZO0108901089, ZO0362503625\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,17,568218,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0227402274, ZO0079000790\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,568278,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0536705367, ZO0449804498\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,568428,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0408404084, ZO0422304223\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,568492,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0346103461, ZO0054100541\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,569262,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0609906099, ZO0614806148\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,569306,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0412004120, ZO0625406254\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,21,569223,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0444004440, ZO0596805968\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,568039,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0599705997, ZO0416704167\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,52,568117,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0315203152, ZO0406304063\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,568165,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0065600656, ZO0337003370\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,568393,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0374103741, ZO0242102421\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,567996,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0105401054, ZO0046200462\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,569173,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0452204522, ZO0631206312\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,49,569209,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0472304723, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,568865,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0294502945, ZO0560605606\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,23,568926,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0298302983, ZO0300003000\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,568955,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0068900689, ZO0076200762\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,43,569056,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0494804948, ZO0096000960\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,569083,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0099000990, ZO0631606316\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,717726,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0284902849, ZO0481204812, ZO0398403984, ZO0282402824\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,24,568149,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0342503425, ZO0675206752\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,568192,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0485504855, ZO0355603556\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,569183,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0641206412, ZO0165301653\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,568818,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0294802948, ZO0451404514\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,568854,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0616706167, ZO0255402554\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,4,568901,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0466704667, ZO0427104271\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,9,568954,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0399603996, ZO0685906859\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,45,569033,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0015700157, ZO0362503625\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,11,569091,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0258602586, ZO0552205522\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,4,569003,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0414704147, ZO0387503875\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,41,568707,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0513305133, ZO0253302533\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,568019,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0530805308, ZO0563905639\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,568182,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0338603386, ZO0641006410\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,569299,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0519605196, ZO0630806308\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,13,569123,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0609006090, ZO0441504415\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,728335,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0134701347, ZO0026200262, ZO0223102231, ZO0022900229\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,726874,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0362303623, ZO0035400354, ZO0705207052, ZO0504005040\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,569218,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0633206332, ZO0488604886\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,722613,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0618806188, ZO0442804428, ZO0530705307, ZO0410804108\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,568152,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0349303493, ZO0043900439\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,568212,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0536405364, ZO0688306883\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,568228,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0387103871, ZO0580005800\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,568455,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0413104131, ZO0392303923\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,567994,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0430904309, ZO0288402884\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,568045,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0160501605, ZO0069500695\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,568308,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0138701387, ZO0024600246\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,6,568515,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0159901599, ZO0238702387\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,721706,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0519005190, ZO0610206102, ZO0514405144, ZO0586505865\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,569250,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0228902289, ZO0005400054\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,568776,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0616906169, ZO0296902969\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,568014,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0523905239, ZO0556605566\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,568702,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0142801428, ZO0182801828\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,22,568128,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0087500875, ZO0007100071\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,568177,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0584505845, ZO0403804038\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,569178,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0177001770, ZO0260502605\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,28,568877,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0132401324, ZO0058200582\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,33,568898,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0542205422, ZO0517805178\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,42,568941,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0076600766, ZO0068800688\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,12,569027,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0245402454, ZO0060100601\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,28,569055,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0375903759, ZO0269402694\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,569107,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0339603396, ZO0504705047\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,25,714385,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0586805868, ZO0609106091, ZO0310903109, ZO0420104201\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,723213,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0297802978, ZO0456704567, ZO0572105721, ZO0280502805\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,568325,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0288202882, ZO0391803918\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,568360,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0480304803, ZO0274402744\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,569278,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0271802718, ZO0057100571\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,568816,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0146601466, ZO0108601086\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,21,568375,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0623606236, ZO0605306053\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,38,568559,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0599005990, ZO0626506265\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,45,568611,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0174701747, ZO0305103051\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,16,568638,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0388003880, ZO0478304783\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,20,568706,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0672206722, ZO0331903319\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories, Men's Clothing\\",EUR,25,716889,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0510505105, ZO0482404824, ZO0602306023, ZO0445904459\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,728580,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0156601566, ZO0498004980, ZO0070700707, ZO0086700867\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,568762,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0052200522, ZO0265602656\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,568571,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0034100341, ZO0343103431\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,568671,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0637406374, ZO0219002190\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,568774,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0037200372, ZO0369303693\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,568319,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0535105351, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,568363,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0629806298, ZO0467104671\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,568541,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0428904289, ZO0588205882\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,42,568586,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0232202322, ZO0208402084\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,568636,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0503905039, ZO0631806318\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,22,568674,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0192301923, ZO0011400114\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,9,567868,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0310403104, ZO0416604166\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,42,567446,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0322803228, ZO0002700027\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,7,567340,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0615606156, ZO0514905149\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,567736,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0663706637, ZO0620906209\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,567755,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0571405714, ZO0255402554\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,715455,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0477504775, ZO0613206132, ZO0585405854, ZO0110701107\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566768,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0217702177, ZO0331703317\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,45,566812,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0266902669, ZO0244202442\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,9,566680,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0316703167, ZO0393303933\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,566944,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0497004970, ZO0054900549\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566979,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0071900719, ZO0493404934\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,11,566734,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0691006910, ZO0314203142\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,567094,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0442904429, ZO0629706297\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,38,566892,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0589505895, ZO0575405754\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,567950,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0273002730, ZO0541105411\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,566826,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0575305753, ZO0540605406\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,567240,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0421004210, ZO0689006890\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,567290,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0442704427\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,24,567669,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0148301483, ZO0202902029\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,567365,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0008600086, ZO0266002660\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,566845,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0547905479, ZO0583305833\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,567048,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0566905669, ZO0564005640\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,567281,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0221402214, ZO0632806328\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,567119,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0711507115, ZO0350903509\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,567169,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0558805588, ZO0622206222\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,567869,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0565105651, ZO0443804438\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,567909,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0609606096, ZO0588905889\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,44,567524,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0096300963, ZO0377403774\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,567565,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0015600156, ZO0323603236\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,28,567019,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0151301513, ZO0204902049\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,567069,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0503805038, ZO0047500475\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,567935,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0116101161, ZO0574305743\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,566831,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0341103411, ZO0648406484\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,51,567543,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0608106081, ZO0296502965\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,567598,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0039400394, ZO0672906729\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,567876,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0705707057, ZO0047700477\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,6,567684,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0201202012, ZO0035000350\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,7,567790,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0522405224, ZO0405104051\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,32,567465,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0274502745, ZO0686006860\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,50,567256,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0461004610, ZO0702707027\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,13,716462,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0549505495, ZO0458504585, ZO0602506025, ZO0617506175\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,46,566775,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0671006710, ZO0708007080\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,567926,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0113301133, ZO0562105621\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,566829,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0100901009, ZO0235102351\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,37,567666,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0311403114, ZO0282002820\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,567383,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0647406474, ZO0330703307\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,567381,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0278402784, ZO0458304583\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,567437,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0275902759, ZO0545005450\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,14,567324,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0426604266, ZO0629406294\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,21,567504,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0606506065, ZO0277702777\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,42,567623,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0239802398, ZO0645406454\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,52,567400,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0605606056, ZO0588105881\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,43,566757,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0196201962, ZO0168601686\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,12,566884,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0490204902, ZO0025000250\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,567815,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0263602636, ZO0241002410\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,17,567177,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0197301973, ZO0180401804\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,733060,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0155601556, ZO0013600136, ZO0235702357, ZO0383203832\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,42,567486,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0058200582, ZO0365503655\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,567625,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0328603286, ZO0328803288\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,10,567224,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0128501285, ZO0606306063\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,22,567252,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0369803698, ZO0220502205\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,567735,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0129701297, ZO0518705187\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,22,567822,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0244802448, ZO0346303463\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,31,567852,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0523805238, ZO0596505965\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,8,566861,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0520305203, ZO0462204622\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,567042,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0243002430, ZO0103901039\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,731037,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0148801488, ZO0335003350, ZO0155301553, ZO0074300743\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,19,567729,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0395103951, ZO0296102961\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,567384,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0426704267, ZO0612006120\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,566690,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0449004490, ZO0118501185\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,49,566951,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0406604066, ZO0517405174\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,566982,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0149301493, ZO0099800998\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,50,566725,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0444404444, ZO0584205842\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,43,566856,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0216502165, ZO0327503275\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,567039,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0184101841, ZO0711207112\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,567068,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0038000380, ZO0711007110\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",EUR,5,732229,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0175701757, ZO0163801638, ZO0697506975, ZO0245602456\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,724806,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0643106431, ZO0033300333, ZO0696206962, ZO0651206512\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,567769,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0414004140, ZO0630106301\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,566772,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0152901529, ZO0019100191\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,567318,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0421104211, ZO0256202562\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,6,567615,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0013500135, ZO0174501745\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,37,567316,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0390403904, ZO0403004030\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,20,566896,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0242702427, ZO0090000900\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,50,567418,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0400404004, ZO0625006250\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,567462,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0644406444, ZO0709307093\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,567667,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0273802738, ZO0300303003\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,567703,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0037900379, ZO0134901349\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,567260,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0068100681, ZO0674106741\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,724844,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0707507075, ZO0246402464, ZO0226802268, ZO0343503435\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,45,567308,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0181601816, ZO0011000110\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,567404,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0107101071, ZO0537905379\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,31,567538,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0596905969, ZO0450804508\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,46,567593,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0655306553, ZO0208902089\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,15,567294,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0317403174, ZO0457204572\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,17,728256,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0371903719, ZO0352803528, ZO0137501375, ZO0229202292\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,567544,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0585005850, ZO0120301203\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,41,567592,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0535405354, ZO0291302913\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,44,566942,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0084000840, ZO0636606366\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,567015,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0558605586, ZO0527805278\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,28,567081,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0209702097, ZO0186301863\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567475,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0578805788, ZO0520405204\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,46,567631,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0101101011, ZO0667406674\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,567454,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0645406454, ZO0166001660\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,28,567855,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0657106571, ZO0084800848\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,567835,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0589405894, ZO0483304833\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,567889,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0282202822, ZO0393003930\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,566852,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0257002570, ZO0455404554\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,5,567037,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0206402064, ZO0365903659\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,721778,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0400004000, ZO0519305193, ZO0482004820, ZO0540305403\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,38,567143,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0573005730, ZO0313203132\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,567191,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0113901139, ZO0478904789\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,567135,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0528305283, ZO0549305493\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,727730,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0050600506, ZO0710907109, ZO0023300233, ZO0334603346\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,25,567939,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0127201272, ZO0425504255\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567970,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0441504415, ZO0691606916\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,567301,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0577605776, ZO0438104381\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,566801,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0279702797, ZO0573705737\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,566685,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0296902969, ZO0530205302\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,20,566924,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0673606736, ZO0161801618\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,11,567662,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0308903089, ZO0614306143\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,20,567708,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0090500905, ZO0466204662\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,567573,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0215602156, ZO0336803368\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,717603,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0685306853, ZO0585305853, ZO0450504505, ZO0552405524\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,17,566986,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0360903609, ZO0030100301\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566735,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0632406324, ZO0060300603\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,9,567082,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0278802788, ZO0515605156\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,14,566881,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0419604196, ZO0559705597\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,20,566790,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0699206992, ZO0641306413\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,566706,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0521505215, ZO0130501305\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,50,566935,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0473704737, ZO0121501215\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,566985,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0044700447, ZO0502105021\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,38,566729,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0557305573, ZO0110401104\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,26,567095,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0339803398, ZO0098200982\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,724326,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0499404994, ZO0641606416, ZO0334303343, ZO0676706767\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,4,567806,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0517705177, ZO0569305693\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,18,567973,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0495104951, ZO0305903059\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,567341,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0674506745, ZO0219202192\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,567492,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0277302773, ZO0443004430\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567654,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0121301213, ZO0399403994\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,44,567403,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0138601386, ZO0259202592\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,567207,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0033600336, ZO0109401094\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing\\",EUR,13,567356,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0319503195, ZO0409904099\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,565855,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0417504175, ZO0535205352\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,19,565915,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0515005150, ZO0509805098\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,566343,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0185101851, ZO0052800528\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,26,566400,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0204702047, ZO0009600096\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,565776,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0343103431, ZO0345803458\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,566607,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0572205722, ZO0585205852\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565452,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0133601336, ZO0643906439\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,46,566051,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0025600256, ZO0270202702\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,565466,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0285402854, ZO0538605386\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,566553,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0435004350, ZO0544005440\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,565446,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0643206432, ZO0140101401\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,566053,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0284702847, ZO0299202992\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,565605,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0113301133\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,46,566170,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0324803248, ZO0703907039\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,566187,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0548905489, ZO0459404594\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,566125,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0433104331, ZO0549505495\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,566156,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0117901179\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,6,566100,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0013400134, ZO0667306673\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,32,566280,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0573205732, ZO0116701167\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,31,565708,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0253302533, ZO0605706057\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,565809,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0557905579, ZO0513705137\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,18,566256,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0227302273, ZO0668706687\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,27,565639,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0193901939, ZO0080400804\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,565684,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0507705077, ZO0409804098\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,565945,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0270602706, ZO0269502695\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,18,565988,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0074700747, ZO0645206452\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,15,565732,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0291402914, ZO0603006030\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,29,566042,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0451804518, ZO0127901279\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,25,566456,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0597105971, ZO0283702837\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,565542,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0224302243, ZO0359103591\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,566121,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0227202272, ZO0357003570\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,36,566101,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0691406914, ZO0617806178\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,566653,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0666506665, ZO0216602166\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,28,565838,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0343703437, ZO0207102071\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,6,565804,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0306803068, ZO0174601746\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,31,566247,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0384903849, ZO0403504035\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,37,566036,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0583605836, ZO0510605106\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,565459,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0242302423, ZO0676006760\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565819,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0031700317, ZO0157701577\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,17,731352,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0018200182, ZO0016100161, ZO0329703297, ZO0057800578\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,565667,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0618706187, ZO0388503885\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565900,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0266102661, ZO0169701697\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,566360,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0285102851, ZO0658306583\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,33,566416,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0396903969, ZO0607906079\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,46,565796,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0081500815, ZO0342603426\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,34,566261,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0577105771, ZO0289302893\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,565567,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0437604376, ZO0618906189\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,565596,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0332903329, ZO0159401594\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Women's Accessories\\",EUR,52,717206,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0390403904, ZO0608306083, ZO0690906909, ZO0394403944\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,715081,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0688806888, ZO0399003990, ZO0412404124, ZO0405304053\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,20,566428,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0136501365, ZO0339103391\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,45,566334,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0010800108, ZO0635706357\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,566391,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0228302283, ZO0167501675\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,715133,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0537005370, ZO0508605086, ZO0566605666, ZO0111301113\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,52,717057,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0623406234, ZO0404704047, ZO0384603846, ZO0476204762\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,22,566315,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0703707037, ZO0139601396\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565698,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0336503365, ZO0637006370\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,15,566167,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0623006230, ZO0419304193\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,566215,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0384903849, ZO0579305793\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,566070,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0046100461, ZO0151201512\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,16,566621,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0579605796, ZO0315803158\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,566284,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0541405414, ZO0588205882\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,566518,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0554605546, ZO0569005690\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,25,565580,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0395303953, ZO0386703867\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,565830,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0215702157, ZO0638806388\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,16,566454,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0547405474, ZO0401104011\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,30,566506,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0680806808, ZO0609306093\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,22,565948,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0190701907, ZO0654806548\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,26,565998,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0238802388, ZO0066600666\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565401,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0014800148, ZO0154501545\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,565728,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0486404864, ZO0248602486\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,5,565489,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0077200772, ZO0643006430\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,565366,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0684906849, ZO0575905759\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Women's Accessories\\",EUR,25,720445,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0423004230, ZO0292702927, ZO0320003200, ZO0318303183\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,565768,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0458004580, ZO0273402734\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,565538,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0486804868, ZO0371603716\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,12,565404,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0048900489, ZO0228702287\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,715961,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0444904449, ZO0292502925, ZO0434604346, ZO0461804618\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,5,566382,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0503505035, ZO0240302403\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,49,565877,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0125401254, ZO0123701237\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,48,566364,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0512505125, ZO0525005250\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,48,565479,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0588805888, ZO0314903149\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,565360,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0448604486, ZO0450704507\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,39,565734,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0513205132, ZO0258202582\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,566514,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0539305393, ZO0522305223\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,18,565970,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0673406734, ZO0165601656\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing, Women's Accessories\\",EUR,27,723242,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0249702497, ZO0643306433, ZO0088900889, ZO0634406344\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,720399,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0386303863, ZO0561905619, ZO0397903979, ZO0590105901\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,566580,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0417304173, ZO0123001230\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,48,566671,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0427604276, ZO0113801138\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,52,566176,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0607206072, ZO0431404314\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,566146,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0646206462, ZO0146201462\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565760,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0504505045, ZO0223802238\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,565521,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0660406604, ZO0484504845\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,566320,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0105001050, ZO0652306523\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,566357,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0061600616, ZO0180701807\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,24,566415,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0261102611, ZO0667106671\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,566044,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0552605526, ZO0292702927\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,22,565473,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0365303653, ZO0235802358\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,18,565339,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0346503465, ZO0678406784\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,14,565591,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0683806838, ZO0429204292\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",EUR,5,730725,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0501605016, ZO0189601896, ZO0363003630, ZO0699306993\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,566443,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0160201602, ZO0261502615\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,51,566498,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0387103871, ZO0550005500\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,565985,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0436604366, ZO0280302803\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565640,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0631606316, ZO0045300453\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,49,565683,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0573205732, ZO0310303103\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,565767,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0414304143, ZO0425204252\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,566452,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0706307063, ZO0011300113\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,13,565982,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0410804108, ZO0309303093\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,726754,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0138001380, ZO0648006480, ZO0193501935, ZO0228402284\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,24,565723,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0302303023, ZO0246602466\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Men's Clothing\\",EUR,31,565896,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0466104661, ZO0444104441\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,52,718085,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0129001290, ZO0310103101, ZO0547805478, ZO0560805608\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,5,566248,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0678806788, ZO0186101861\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,565560,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0567505675, ZO0442104421\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,8,566186,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0522105221, ZO0459104591\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,566155,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0501005010, ZO0214002140\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,28,566628,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0195601956, ZO0098900989\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,9,566519,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0700907009, ZO0115801158\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,565697,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0498904989, ZO0641706417\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,45,566417,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0084900849, ZO0194701947\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,565722,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0656406564, ZO0495504955\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,36,565330,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0621606216, ZO0628806288\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,44,565381,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0060200602, ZO0076300763\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,39,565564,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0576305763, ZO0116801168\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,565392,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0616606166, ZO0592205922\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,6,565410,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0023600236, ZO0704307043\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,565504,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0653406534, ZO0049300493\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,44,565334,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0641706417, ZO0382303823\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,566079,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0663306633, ZO0687306873\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,566622,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0228402284, ZO0082300823\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,27,566650,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0049100491, ZO0194801948\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,566295,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0635606356, ZO0043100431\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,566538,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0224402244, ZO0342403424\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,565918,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0155001550, ZO0072100721\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,565678,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0081800818, ZO0485604856\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,16,566564,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0107301073, ZO0293002930\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,565498,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0046600466, ZO0503305033\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,565793,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0712807128, ZO0007500075\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,566232,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0545205452, ZO0437304373\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,25,566259,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0694206942, ZO0553805538\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,566591,\\"-\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0502405024, ZO0366003660\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,564670,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0531205312, ZO0684706847\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564710,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0263402634, ZO0499404994\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,564429,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0260702607, ZO0495804958\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,564479,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0409304093, ZO0436904369\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,564513,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0390003900, ZO0287902879\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,6,564885,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0303803038, ZO0192501925\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,565150,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0624906249, ZO0411604116\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,13,565206,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0316303163, ZO0401004010\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564759,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0218802188, ZO0492604926\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,17,564144,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0218602186, ZO0501005010\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,563909,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0452804528, ZO0453604536\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,28,564869,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0192401924, ZO0366703667\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,10,564619,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0470304703, ZO0406204062\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,34,564237,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0311203112, ZO0395703957\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,11,564269,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0281102811, ZO0555705557\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,564842,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0432004320, ZO0403504035\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,43,564893,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0322403224, ZO0227802278\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564215,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0147201472, ZO0152201522\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,564725,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0071700717, ZO0364303643\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,37,564733,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0384303843, ZO0273702737\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,564331,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0229402294, ZO0303303033\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,564350,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0444104441, ZO0476804768\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564398,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0328703287, ZO0351003510\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,22,564409,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0178501785, ZO0503805038\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,8,564024,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0534405344, ZO0619006190\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,48,564271,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0507905079, ZO0430804308\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,564676,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0108401084, ZO0139301393\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,19,564445,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0593805938, ZO0701407014\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing\\",EUR,50,564241,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0605506055, ZO0547505475\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,564272,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0534405344, ZO0512105121\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,564844,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0553205532, ZO0526205262\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,28,564883,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0705607056, ZO0334703347\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,5,564307,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0246602466, ZO0195201952\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,5,564148,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0057900579, ZO0211602116\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,44,564009,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0487904879, ZO0027100271\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,52,564532,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0474704747, ZO0622006220\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,565308,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0172401724, ZO0184901849\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,27,564339,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0082900829, ZO0347903479\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,37,564361,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0422304223, ZO0600506005\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,28,564394,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0269902699, ZO0667906679\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564030,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0179901799, ZO0637606376\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,564661,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0415004150, ZO0125501255\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,43,564706,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0709007090, ZO0362103621\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564460,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0655106551, ZO0349403494\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,22,564536,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0304603046, ZO0370603706\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,46,564559,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0015500155, ZO0650806508\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,18,564609,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0162401624, ZO0156001560\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,25,565138,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0615506155, ZO0445304453\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,51,565025,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0280802808, ZO0549005490\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,27,564000,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0364603646, ZO0018200182\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,34,564557,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0664606646, ZO0460404604\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,27,564604,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0237702377, ZO0304303043\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,23,564777,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0452704527, ZO0122201222\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,26,564812,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0266002660, ZO0031900319\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,715752,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0130801308, ZO0402604026, ZO0630506305, ZO0297402974\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,22,563964,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0001200012, ZO0251902519\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564315,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0221002210, ZO0263702637\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,565237,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0323303233, ZO0172101721\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,34,565090,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0690306903, ZO0521005210\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,21,564649,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0405704057, ZO0411704117\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,564510,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0093600936, ZO0145301453\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,12,565222,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0102001020, ZO0252402524\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,29,565233,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0614906149, ZO0430404304\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,31,565084,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0549805498, ZO0541205412\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,564796,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0022100221, ZO0172301723\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,26,564627,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0211702117, ZO0499004990\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,29,564257,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0539205392, ZO0577705777\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,564701,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0585205852, ZO0418104181\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,8,564915,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0286502865, ZO0394703947\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,22,564954,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0362903629, ZO0048100481\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,565009,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0225302253, ZO0183101831\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,564065,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0711207112, ZO0646106461\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,46,563927,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0009800098, ZO0362803628\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,51,564937,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0520605206, ZO0432204322\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,43,564994,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0180601806, ZO0710007100\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,24,564070,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0234202342, ZO0245102451\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,563928,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0394103941\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,5,727071,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0091900919, ZO0660006600, ZO0197001970, ZO0074600746\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,50,565284,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0687206872, ZO0422304223\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,564380,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0050400504, ZO0660006600\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,18,565276,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0131501315, ZO0668806688\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,6,564819,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0374603746, ZO0697106971\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,38,717243,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0479104791, ZO0125301253, ZO0459004590, ZO0549905499\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,45,564140,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0221002210, ZO0268502685\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,5,564164,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0673506735, ZO0213002130\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,564207,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0711807118, ZO0073100731\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,564735,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0509705097, ZO0120501205\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,19,565077,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0118701187, ZO0123901239\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,13,564274,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0542905429, ZO0423604236\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,30,565161,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0441404414, ZO0430504305\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,42,565039,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0489804898, ZO0695006950\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,723683,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0648206482, ZO0496104961, ZO0142601426, ZO0491504915\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,6,563967,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0493404934, ZO0640806408\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,46,564533,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0496704967, ZO0049700497\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,49,565266,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0255602556, ZO0468304683\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,4,564818,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0475004750, ZO0412304123\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,23,564932,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0557305573, ZO0607806078\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,18,564968,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0134101341, ZO0062400624\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,44,565002,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0354203542, ZO0338503385\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,48,564095,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0613806138, ZO0403504035\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,563924,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0539805398, ZO0554205542\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,564770,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0704907049, ZO0024700247\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,563965,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0045800458, ZO0503405034\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,24,564957,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0171601716, ZO0214602146\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,41,564032,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0478404784, ZO0521905219\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,37,564075,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0622706227, ZO0525405254\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,34,563931,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0444304443, ZO0596505965\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,18,564940,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0026800268, ZO0003600036\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,564987,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0526805268, ZO0478104781\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,25,564080,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0415804158, ZO0460804608\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Accessories\\",EUR,8,564106,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0298002980, ZO0313103131\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,26,563947,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0348103481, ZO0164501645\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,725995,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0222102221, ZO0332103321, ZO0182701827, ZO0230502305\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,32,564756,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0556805568, ZO0481504815\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,21,565137,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0118501185, ZO0561905619\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,27,565173,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0203802038, ZO0014900149\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,565214,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0588705887\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,20,564804,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0259702597, ZO0640606406\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Clothing\\",EUR,43,565052,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0697006970, ZO0711407114\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,45,565091,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0324703247, ZO0088600886\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,565231,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0235202352, ZO0135001350\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,6,564190,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0243902439, ZO0208702087\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,42,564876,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0215502155, ZO0168101681\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,27,564902,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0698406984, ZO0704207042\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,27,564761,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0665006650, ZO0709407094\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,27,731788,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0486004860, ZO0177901779, ZO0680506805, ZO0340503405\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,564340,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0399703997, ZO0565805658\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,24,564395,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0236702367, ZO0660706607\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes\\",EUR,45,564686,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0373303733, ZO0131201312\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,44,564446,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0093400934, ZO0679406794\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,43,564481,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0321603216, ZO0078000780\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Accessories\\",EUR,20,563953,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0376203762, ZO0303603036\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,565061,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681106811, ZO0286402864\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing\\",EUR,27,565100,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0069000690, ZO0490004900\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,7,565263,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0582705827, ZO0111801118\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,33,563984,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0121301213, ZO0294102941\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories\\",EUR,12,565262,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0303503035, ZO0197601976\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,28,565304,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0017800178, ZO0229602296\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,10,565123,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0316903169, ZO0400504005\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,48,565160,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0693306933, ZO0514605146\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,14,565224,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0406604066, ZO0576805768\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,9,564121,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0291902919, ZO0617206172\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories\\",EUR,23,564166,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0607106071, ZO0470704707\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,17,564739,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0335603356, ZO0236502365\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing\\",EUR,16,564016,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0436904369, ZO0290402904\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,564576,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681206812, ZO0441904419\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Accessories\\",EUR,43,564605,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0333103331, ZO0694806948\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Accessories, Women's Shoes\\",EUR,17,730663,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0697406974, ZO0370303703, ZO0368103681, ZO0013800138\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,34,564366,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681906819, ZO0549705497\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Shoes, Women's Clothing\\",EUR,44,564221,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0249702497, ZO0487404874\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Women's Clothing, Women's Shoes\\",EUR,42,564174,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0032300323, ZO0236302363\\" +" +`; + +exports[`discover Discover CSV Export Generate CSV: archived search generates a report with filtered data 1`] = ` +"\\"order_date\\",category,currency,\\"customer_id\\",\\"order_id\\",\\"day_of_week_i\\",\\"products.created_on\\",sku +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,52,719675,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0448604486, ZO0686206862, ZO0395403954, ZO0528505285\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,34,570232,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0682006820, ZO0399103991\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,570111,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0253002530, ZO0117101171\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,570480,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0286202862, ZO0694506945\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,25,719459,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0410004100, ZO0513605136, ZO0431404314, ZO0662906629\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,25,570303,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0573305733, ZO0513205132\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,569806,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0558305583\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,570477,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0299202992, ZO0392403924\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,569743,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0610306103\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes, Women's Accessories\\",EUR,38,714566,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0430204302, ZO0397303973, ZO0686806868, ZO0320403204\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,50,570120,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0392903929, ZO0254802548\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,32,570414,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0481704817, ZO0396503965\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,39,569436,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0386103861, ZO0451504515\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,37,569637,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0300103001, ZO0688106881\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,569645,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0392803928, ZO0277102771\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,569362,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0292402924, ZO0681006810\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes, Women's Accessories\\",EUR,52,713556,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0592105921, ZO0421204212, ZO0400604006, ZO0319403194\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,570334,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0520205202, ZO0545205452\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,19,570143,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0482904829\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,8,570586,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0694206942, ZO0596505965\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,14,569336,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0512505125, ZO0384103841\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,8,569984,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0537205372, ZO0403504035\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,34,570003,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0298902989, ZO0694506945\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,569392,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0516405164, ZO0532705327\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,31,569312,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0425104251, ZO0107901079\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,570009,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0510705107, ZO0594605946\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,569985,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0554005540, ZO0403504035\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,52,569905,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0599605996, ZO0403804038\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,52,569699,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0398603986, ZO0521305213\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Women's Accessories\\",EUR,29,569736,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0517305173, ZO0319703197\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,569777,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0254302543, ZO0289102891\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,36,570388,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0405604056, ZO0604506045\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,51,570620,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0422204222, ZO0256502565\\" +\\"Jun 26, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,50,569694,3,\\"Dec 15, 2016 @ 00:00:00.000, Dec 15, 2016 @ 00:00:00.000\\",\\"ZO0398703987, ZO0687806878\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,39,568331,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0385903859, ZO0516605166\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,568524,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0694706947\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,14,568682,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0680706807, ZO0392603926\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,31,568350,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0317303173, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,31,568531,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0482104821, ZO0447104471\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,29,568578,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0520005200, ZO0421104211\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,568609,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0570405704, ZO0256102561\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,568652,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0403304033, ZO0125901259\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Clothing, Men's Shoes\\",EUR,25,714149,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0309503095, ZO0411904119, ZO0683306833, ZO0397103971\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,52,569163,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0681106811, ZO0682706827\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,15,568943,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0445804458, ZO0686106861\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,23,569046,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0393103931, ZO0619906199\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,33,568993,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0510505105, ZO0482604826\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,568845,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0657906579, ZO0258102581\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,30,569097,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0511605116, ZO0483004830\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,52,568117,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0315203152, ZO0406304063\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,49,569209,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0472304723, ZO0403504035\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,717726,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0284902849, ZO0481204812, ZO0398403984, ZO0282402824\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,568854,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0616706167, ZO0255402554\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,9,568954,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0399603996, ZO0685906859\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,11,569091,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0258602586, ZO0552205522\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,4,569003,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0414704147, ZO0387503875\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,41,568707,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0513305133, ZO0253302533\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,569299,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0519605196, ZO0630806308\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,568212,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0536405364, ZO0688306883\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,568228,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0387103871, ZO0580005800\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,568455,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0413104131, ZO0392303923\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,721706,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0519005190, ZO0610206102, ZO0514405144, ZO0586505865\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,568177,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0584505845, ZO0403804038\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,33,568898,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0542205422, ZO0517805178\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,568325,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0288202882, ZO0391803918\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,16,568638,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0388003880, ZO0478304783\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories, Men's Clothing\\",EUR,25,716889,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0510505105, ZO0482404824, ZO0602306023, ZO0445904459\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,568319,2,\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"ZO0535105351, ZO0403504035\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,7,567340,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0615606156, ZO0514905149\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,567755,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0571405714, ZO0255402554\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,9,566680,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0316703167, ZO0393303933\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,11,566734,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0691006910, ZO0314203142\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,567240,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0421004210, ZO0689006890\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,567290,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0442704427\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,7,567790,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0522405224, ZO0405104051\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,32,567465,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0274502745, ZO0686006860\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,567735,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0129701297, ZO0518705187\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,8,566861,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0520305203, ZO0462204622\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,19,567729,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0395103951, ZO0296102961\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,49,566951,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0406604066, ZO0517405174\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,567318,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0421104211, ZO0256202562\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,37,567316,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0390403904, ZO0403004030\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,50,567418,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0400404004, ZO0625006250\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,567404,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0107101071, ZO0537905379\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567475,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0578805788, ZO0520405204\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,567835,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0589405894, ZO0483304833\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,29,567889,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0282202822, ZO0393003930\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,566852,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0257002570, ZO0455404554\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,721778,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0400004000, ZO0519305193, ZO0482004820, ZO0540305403\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567970,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0441504415, ZO0691606916\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,11,567662,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0308903089, ZO0614306143\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,717603,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0685306853, ZO0585305853, ZO0450504505, ZO0552405524\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,9,567082,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0278802788, ZO0515605156\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,566706,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0521505215, ZO0130501305\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,4,567806,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0517705177, ZO0569305693\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,14,567654,1,\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"ZO0121301213, ZO0399403994\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,19,565915,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0515005150, ZO0509805098\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,13,565605,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0113301133\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,31,565708,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0253302533, ZO0605706057\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,30,565809,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0557905579, ZO0513705137\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,38,565684,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0507705077, ZO0409804098\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,36,566101,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0691406914, ZO0617806178\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,31,566247,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0384903849, ZO0403504035\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,37,566036,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0583605836, ZO0510605106\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,11,565667,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0618706187, ZO0388503885\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,33,566416,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0396903969, ZO0607906079\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Women's Accessories\\",EUR,52,717206,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0390403904, ZO0608306083, ZO0690906909, ZO0394403944\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,715081,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0688806888, ZO0399003990, ZO0412404124, ZO0405304053\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,715133,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0537005370, ZO0508605086, ZO0566605666, ZO0111301113\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,52,717057,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0623406234, ZO0404704047, ZO0384603846, ZO0476204762\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,9,566215,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0384903849, ZO0579305793\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,25,565580,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0395303953, ZO0386703867\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,16,566454,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0547405474, ZO0401104011\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,30,566506,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0680806808, ZO0609306093\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,565366,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0684906849, ZO0575905759\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,48,566364,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0512505125, ZO0525005250\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,39,565734,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0513205132, ZO0258202582\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,19,566514,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0539305393, ZO0522305223\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,720399,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0386303863, ZO0561905619, ZO0397903979, ZO0590105901\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,14,565591,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0683806838, ZO0429204292\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,51,566498,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0387103871, ZO0550005500\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,8,566186,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0522105221, ZO0459104591\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,566079,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0663306633, ZO0687306873\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,16,566564,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0107301073, ZO0293002930\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,25,566259,0,\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"ZO0694206942, ZO0553805538\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,23,564670,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0531205312, ZO0684706847\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,52,564513,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0390003900, ZO0287902879\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,13,565206,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0316303163, ZO0401004010\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,10,564619,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0470304703, ZO0406204062\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,34,564237,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0311203112, ZO0395703957\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,39,564842,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0432004320, ZO0403504035\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,37,564733,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0384303843, ZO0273702737\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,48,564271,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0507905079, ZO0430804308\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,50,564272,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0534405344, ZO0512105121\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,715752,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0130801308, ZO0402604026, ZO0630506305, ZO0297402974\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,34,565090,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0690306903, ZO0521005210\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,21,564649,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0405704057, ZO0411704117\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,8,564915,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0286502865, ZO0394703947\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,51,564937,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0520605206, ZO0432204322\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,13,563928,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0424104241, ZO0394103941\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,50,565284,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0687206872, ZO0422304223\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,30,564735,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0509705097, ZO0120501205\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Accessories\\",EUR,49,565266,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0255602556, ZO0468304683\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,48,564095,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0613806138, ZO0403504035\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,41,564032,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0478404784, ZO0521905219\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Clothing, Men's Shoes\\",EUR,32,564756,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0556805568, ZO0481504815\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,33,565214,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0403504035, ZO0588705887\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,10,564340,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0399703997, ZO0565805658\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,49,565061,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681106811, ZO0286402864\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Accessories, Men's Shoes\\",EUR,10,565123,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0316903169, ZO0400504005\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes\\",EUR,48,565160,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0693306933, ZO0514605146\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,14,565224,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0406604066, ZO0576805768\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,41,564576,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681206812, ZO0441904419\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",\\"Men's Shoes, Men's Clothing\\",EUR,34,564366,6,\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"ZO0681906819, ZO0549705497\\" +" +`; + +exports[`discover Discover CSV Export Generate CSV: new search generates a large export 1`] = ` +"\\"_id\\",\\"_index\\",\\"_score\\",category,\\"category.keyword\\",currency,\\"customer_first_name\\",\\"customer_first_name.keyword\\",\\"customer_full_name\\",\\"customer_full_name.keyword\\",\\"customer_gender\\",\\"customer_id\\",\\"customer_last_name\\",\\"customer_last_name.keyword\\",\\"customer_phone\\",\\"day_of_week\\",\\"day_of_week_i\\",email,\\"geoip.city_name\\",\\"geoip.continent_name\\",\\"geoip.country_iso_code\\",\\"geoip.location\\",\\"geoip.region_name\\",manufacturer,\\"manufacturer.keyword\\",\\"order_date\\",\\"order_id\\",\\"products._id\\",\\"products._id.keyword\\",\\"products.base_price\\",\\"products.base_unit_price\\",\\"products.category\\",\\"products.category.keyword\\",\\"products.created_on\\",\\"products.discount_amount\\",\\"products.discount_percentage\\",\\"products.manufacturer\\",\\"products.manufacturer.keyword\\",\\"products.min_price\\",\\"products.price\\",\\"products.product_id\\",\\"products.product_name\\",\\"products.product_name.keyword\\",\\"products.quantity\\",\\"products.sku\\",\\"products.tax_amount\\",\\"products.taxful_price\\",\\"products.taxless_price\\",\\"products.unit_discount_amount\\",sku,\\"taxful_total_price\\",\\"taxless_total_price\\",\\"total_quantity\\",\\"total_unique_products\\",type,user +3AMtOW0BH63Xcmy432DJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Boone\\",\\"Sultan Al Boone\\",MALE,19,Boone,Boone,\\"(empty)\\",Saturday,5,\\"sultan al@boone-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Jul 12, 2019 @ 00:00:00.000\\",716724,\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"42.375, 33, 10.344, 6.109\\",\\"80, 60, 21.984, 11.992\\",\\"23,975, 6,338, 14,116, 15,290\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"0, 0, 0, 0\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",174,174,4,4,order,sultan +9gMtOW0BH63Xcmy432DJ,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Pia,Pia,\\"Pia Richards\\",\\"Pia Richards\\",FEMALE,45,Richards,Richards,\\"(empty)\\",Saturday,5,\\"pia@richards-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jul 12, 2019 @ 00:00:00.000\\",591503,\\"sold_product_591503_14761, sold_product_591503_11632\\",\\"sold_product_591503_14761, sold_product_591503_11632\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"10.703, 9.867\\",\\"20.984, 20.984\\",\\"14,761, 11,632\\",\\"Classic heels - blue, Summer dress - coral/pink\\",\\"Classic heels - blue, Summer dress - coral/pink\\",\\"1, 1\\",\\"ZO0006400064, ZO0150601506\\",\\"0, 0\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"0, 0\\",\\"ZO0006400064, ZO0150601506\\",\\"41.969\\",\\"41.969\\",2,2,order,pia +BgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Meyer\\",\\"Brigitte Meyer\\",FEMALE,12,Meyer,Meyer,\\"(empty)\\",Saturday,5,\\"brigitte@meyer-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jul 12, 2019 @ 00:00:00.000\\",591709,\\"sold_product_591709_20734, sold_product_591709_7539\\",\\"sold_product_591709_20734, sold_product_591709_7539\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"3.6, 17.484\\",\\"7.988, 33\\",\\"20,734, 7,539\\",\\"Basic T-shirt - dark blue, Summer dress - scarab\\",\\"Basic T-shirt - dark blue, Summer dress - scarab\\",\\"1, 1\\",\\"ZO0638206382, ZO0038800388\\",\\"0, 0\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"0, 0\\",\\"ZO0638206382, ZO0038800388\\",\\"40.969\\",\\"40.969\\",2,2,order,brigitte +KQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Mccarthy\\",\\"Abd Mccarthy\\",MALE,52,Mccarthy,Mccarthy,\\"(empty)\\",Saturday,5,\\"abd@mccarthy-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Govern" +`; + +exports[`discover Discover CSV Export Generate CSV: new search generates a large export 2`] = ` +"es\\",\\"21, 6.109\\",\\"42, 11.992\\",\\"13,181, 23,660\\",\\"Briefcase - navy, Sports shirt - Seashell\\",\\"Briefcase - navy, Sports shirt - Seashell\\",\\"1, 1\\",\\"ZO0466704667, ZO0617306173\\",\\"0, 0\\",\\"42, 11.992\\",\\"42, 11.992\\",\\"0, 0\\",\\"ZO0466704667, ZO0617306173\\",\\"53.969\\",\\"53.969\\",2,2,order,kamal +7QMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Graves\\",\\"Elyssa Graves\\",FEMALE,27,Graves,Graves,\\"(empty)\\",Thursday,3,\\"elyssa@graves-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 12, 2019 @ 00:00:00.000\\",551204,\\"sold_product_551204_16805, sold_product_551204_12896\\",\\"sold_product_551204_16805, sold_product_551204_12896\\",\\"13.992, 20.984\\",\\"13.992, 20.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 1, 2016 @ 00:00:00.000, Dec 1, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"7.129, 9.656\\",\\"13.992, 20.984\\",\\"16,805, 12,896\\",\\"Bustier - white, Across body bag - cognac\\",\\"Bustier - white, Across body bag - cognac\\",\\"1, 1\\",\\"ZO0212602126, ZO0200702007\\",\\"0, 0\\",\\"13.992, 20.984\\",\\"13.992, 20.984\\",\\"0, 0\\",\\"ZO0212602126, ZO0200702007\\",\\"34.969\\",\\"34.969\\",2,2,order,elyssa +7gMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Pia,Pia,\\"Pia Rose\\",\\"Pia Rose\\",FEMALE,45,Rose,Rose,\\"(empty)\\",Thursday,3,\\"pia@rose-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Primemaster\\",\\"Oceanavigations, Primemaster\\",\\"Jun 12, 2019 @ 00:00:00.000\\",550466,\\"sold_product_550466_19198, sold_product_550466_16409\\",\\"sold_product_550466_19198, sold_product_550466_16409\\",\\"50, 100\\",\\"50, 100\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 1, 2016 @ 00:00:00.000, Dec 1, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Primemaster\\",\\"Oceanavigations, Primemaster\\",\\"24, 52\\",\\"50, 100\\",\\"19,198, 16,409\\",\\"Summer dress - grey, Boots - passion\\",\\"Summer dress - grey, Boots - passion\\",\\"1, 1\\",\\"ZO0260702607, ZO0363203632\\",\\"0, 0\\",\\"50, 100\\",\\"50, 100\\",\\"0, 0\\",\\"ZO0260702607, ZO0363203632\\",150,150,2,2,order,pia +7wMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Boone\\",\\"Wagdi Boone\\",MALE,15,Boone,Boone,\\"(empty)\\",Thursday,3,\\"wagdi@boone-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",Elitelligence,Elitelligence,\\"Jun 12, 2019 @ 00:00:00.000\\",550503,\\"sold_product_550503_13211, sold_product_550503_24369\\",\\"sold_product_550503_13211, sold_product_550503_24369\\",\\"34, 11.992\\",\\"34, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 1, 2016 @ 00:00:00.000, Dec 1, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"15.641, 6.109\\",\\"34, 11.992\\",\\"13,211, 24,369\\",\\"Tracksuit top - black, Print T-shirt - khaki\\",\\"Tracksuit top - black, Print T-shirt - khaki\\",\\"1, 1\\",\\"ZO0587505875, ZO0566405664\\",\\"0, 0\\",\\"34, 11.992\\",\\"34, 11.992\\",\\"0, 0\\",\\"ZO0587505875, ZO0566405664\\",\\"45.969\\",\\"45.969\\",2,2,order,wagdi +8AMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Hale\\",\\"Elyssa Hale\\",FEMALE,27,Hale,Hale,\\"(empty)\\",Thursday,3,\\"elyssa@hale-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"Jun 12, 2019 @ 00:00:00.000\\",550538,\\"sold_product_550538_15047, sold_product_550538_18189\\",\\"sold_product_550538_15047, sold_product_550538_18189\\",\\"75, 60\\",\\"75, 60\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 1, 2016 @ 00:00:00.000, Dec 1, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"34.5, 28.797\\",\\"75, 60\\",\\"15,047, 18,189\\",\\"Handbag - black, Ankle boots - grey\\",\\"Handbag - black, Ankle boots - grey\\",\\"1, 1\\",\\"ZO0699406994, ZO0246202462\\",\\"0, 0\\",\\"75, 60\\",\\"75, 60\\",\\"0, 0\\",\\"ZO0699406994, ZO0246202462\\",135,135,2,2,order,elyssa +8QMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Love\\",\\"Jackson Love\\",MALE,13,Love,Love,\\"(empty)\\",Thursday,3,\\"jackson@love-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 12, 2019 @ 00:00:00.000\\",550568,\\"sold_product_550568_17210, sold_product_550568_12524\\",\\"sold_product_550568_17210, sold_product_550568_12524\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 1, 2016 @ 00:00:00.000, Dec 1, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"25, 12.492\\",\\"50, 24.984\\",\\"17,210, 12,524\\",\\"Casual lace-ups - navy, Jumper - dark grey multicolor\\",\\"Casual lace-ups - navy, Jumper - dark grey multicolor\\",\\"1, 1\\",\\"ZO0388403884, ZO0447604476\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0388403884, ZO0447604476\\",75,75,2,2,order,jackson +" +`; + +exports[`discover Discover CSV Export Generate CSV: new search generates a report from a new search with data: default 1`] = ` +"\\"_id\\",\\"_index\\",\\"_score\\",category,\\"category.keyword\\",currency,\\"customer_first_name\\",\\"customer_first_name.keyword\\",\\"customer_full_name\\",\\"customer_full_name.keyword\\",\\"customer_gender\\",\\"customer_id\\",\\"customer_last_name\\",\\"customer_last_name.keyword\\",\\"customer_phone\\",\\"day_of_week\\",\\"day_of_week_i\\",email,\\"geoip.city_name\\",\\"geoip.continent_name\\",\\"geoip.country_iso_code\\",\\"geoip.location\\",\\"geoip.region_name\\",manufacturer,\\"manufacturer.keyword\\",\\"order_date\\",\\"order_id\\",\\"products._id\\",\\"products._id.keyword\\",\\"products.base_price\\",\\"products.base_unit_price\\",\\"products.category\\",\\"products.category.keyword\\",\\"products.created_on\\",\\"products.discount_amount\\",\\"products.discount_percentage\\",\\"products.manufacturer\\",\\"products.manufacturer.keyword\\",\\"products.min_price\\",\\"products.price\\",\\"products.product_id\\",\\"products.product_name\\",\\"products.product_name.keyword\\",\\"products.quantity\\",\\"products.sku\\",\\"products.tax_amount\\",\\"products.taxful_price\\",\\"products.taxless_price\\",\\"products.unit_discount_amount\\",sku,\\"taxful_total_price\\",\\"taxless_total_price\\",\\"total_quantity\\",\\"total_unique_products\\",type,user +9AMtOW0BH63Xcmy432DJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Bradley\\",\\"Boris Bradley\\",MALE,36,Bradley,Bradley,\\"(empty)\\",Wednesday,2,\\"boris@bradley-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568397,\\"sold_product_568397_24419, sold_product_568397_20207\\",\\"sold_product_568397_24419, sold_product_568397_20207\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"17.484, 13.922\\",\\"33, 28.984\\",\\"24,419, 20,207\\",\\"Cargo trousers - oliv, Trousers - black\\",\\"Cargo trousers - oliv, Trousers - black\\",\\"1, 1\\",\\"ZO0112101121, ZO0530405304\\",\\"0, 0\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"0, 0\\",\\"ZO0112101121, ZO0530405304\\",\\"61.969\\",\\"61.969\\",2,2,order,boris +9QMtOW0BH63Xcmy432DJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Oliver,Oliver,\\"Oliver Hubbard\\",\\"Oliver Hubbard\\",MALE,7,Hubbard,Hubbard,\\"(empty)\\",Wednesday,2,\\"oliver@hubbard-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Spritechnologies, Microlutions\\",\\"Spritechnologies, Microlutions\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568044,\\"sold_product_568044_12799, sold_product_568044_18008\\",\\"sold_product_568044_12799, sold_product_568044_18008\\",\\"14.992, 16.984\\",\\"14.992, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Microlutions\\",\\"Spritechnologies, Microlutions\\",\\"6.898, 8.828\\",\\"14.992, 16.984\\",\\"12,799, 18,008\\",\\"Undershirt - dark grey multicolor, Long sleeved top - purple\\",\\"Undershirt - dark grey multicolor, Long sleeved top - purple\\",\\"1, 1\\",\\"ZO0630406304, ZO0120201202\\",\\"0, 0\\",\\"14.992, 16.984\\",\\"14.992, 16.984\\",\\"0, 0\\",\\"ZO0630406304, ZO0120201202\\",\\"31.984\\",\\"31.984\\",2,2,order,oliver +OAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Betty,Betty,\\"Betty Reese\\",\\"Betty Reese\\",FEMALE,44,Reese,Reese,\\"(empty)\\",Wednesday,2,\\"betty@reese-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 25, 2019 @ 00:00:00.000\\",568229,\\"sold_product_568229_24991, sold_product_568229_12039\\",\\"sold_product_568229_24991, sold_product_568229_12039\\",\\"11.992, 10.992\\",\\"11.992, 10.992\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"6.352, 5.82\\",\\"11.992, 10.992\\",\\"24,991, 12,039\\",\\"Scarf - rose/white, Scarf - nude/black/turquoise\\",\\"Scarf - rose/white, Scarf - nude/black/turquoise\\",\\"1, 1\\",\\"ZO0192201922, ZO0192801928\\",\\"0, 0\\",\\"11.992, 10.992\\",\\"11.992, 10.992\\",\\"0, 0\\",\\"ZO0192201922, ZO0192801928\\",\\"22.984\\",\\"22.984\\",2,2,order,betty +OQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Recip,Recip,\\"Recip Salazar\\",\\"Recip Salazar\\",MALE,10,Salazar,Salazar,\\"(empty)\\",Wednesday,2,\\"recip@salazar-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,Elitelligence,Elitelligence,\\"Jun 25, 2019 @ 00:00:00.000\\",568292,\\"sold_product_568292_23627, sold_product_568292_11149\\",\\"sold_product_568292_23627, sold_product_568292_11149\\",\\"24.984, 10.992\\",\\"24.984, 10.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"12.492, 5.059\\",\\"24.984, 10.992\\",\\"23,627, 11,149\\",\\"Slim fit jeans - grey, Sunglasses - black\\",\\"Slim fit jeans - grey, Sunglasses - black\\",\\"1, 1\\",\\"ZO0534205342, ZO0599605996\\",\\"0, 0\\",\\"24.984, 10.992\\",\\"24.984, 10.992\\",\\"0, 0\\",\\"ZO0534205342, ZO0599605996\\",\\"35.969\\",\\"35.969\\",2,2,order,recip +jwMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Harper\\",\\"Jackson Harper\\",MALE,13,Harper,Harper,\\"(empty)\\",Wednesday,2,\\"jackson@harper-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568386,\\"sold_product_568386_11959, sold_product_568386_2774\\",\\"sold_product_568386_11959, sold_product_568386_2774\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"12.742, 45.875\\",\\"24.984, 85\\",\\"11,959, 2,774\\",\\"SLIM FIT - Formal shirt - lila, Classic coat - black\\",\\"SLIM FIT - Formal shirt - lila, Classic coat - black\\",\\"1, 1\\",\\"ZO0422404224, ZO0291702917\\",\\"0, 0\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"0, 0\\",\\"ZO0422404224, ZO0291702917\\",110,110,2,2,order,jackson +kAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Betty,Betty,\\"Betty Brewer\\",\\"Betty Brewer\\",FEMALE,44,Brewer,Brewer,\\"(empty)\\",Wednesday,2,\\"betty@brewer-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568023,\\"sold_product_568023_22309, sold_product_568023_22315\\",\\"sold_product_568023_22309, sold_product_568023_22315\\",\\"11.992, 16.984\\",\\"11.992, 16.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"5.879, 8.656\\",\\"11.992, 16.984\\",\\"22,309, 22,315\\",\\"Wallet - brown, Summer dress - black\\",\\"Wallet - brown, Summer dress - black\\",\\"1, 1\\",\\"ZO0075900759, ZO0489304893\\",\\"0, 0\\",\\"11.992, 16.984\\",\\"11.992, 16.984\\",\\"0, 0\\",\\"ZO0075900759, ZO0489304893\\",\\"28.984\\",\\"28.984\\",2,2,order,betty +9wMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Selena,Selena,\\"Selena Hernandez\\",\\"Selena Hernandez\\",FEMALE,42,Hernandez,Hernandez,\\"(empty)\\",Wednesday,2,\\"selena@hernandez-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568789,\\"sold_product_568789_11481, sold_product_568789_17046\\",\\"sold_product_568789_11481, sold_product_568789_17046\\",\\"24.984, 30.984\\",\\"24.984, 30.984\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"12.492, 15.797\\",\\"24.984, 30.984\\",\\"11,481, 17,046\\",\\"Tote bag - black, SET - Watch - rose gold-coloured\\",\\"Tote bag - black, SET - Watch - rose gold-coloured\\",\\"1, 1\\",\\"ZO0197501975, ZO0079300793\\",\\"0, 0\\",\\"24.984, 30.984\\",\\"24.984, 30.984\\",\\"0, 0\\",\\"ZO0197501975, ZO0079300793\\",\\"55.969\\",\\"55.969\\",2,2,order,selena +\\"-AMtOW0BH63Xcmy432HJ\\",ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Kamal,Kamal,\\"Kamal Greene\\",\\"Kamal Greene\\",MALE,39,Greene,Greene,\\"(empty)\\",Wednesday,2,\\"kamal@greene-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568331,\\"sold_product_568331_11375, sold_product_568331_14190\\",\\"sold_product_568331_11375, sold_product_568331_14190\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"19.734, 13.344\\",\\"42, 28.984\\",\\"11,375, 14,190\\",\\"Lace-ups - Midnight Blue, Trainers - grey\\",\\"Lace-ups - Midnight Blue, Trainers - grey\\",\\"1, 1\\",\\"ZO0385903859, ZO0516605166\\",\\"0, 0\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"0, 0\\",\\"ZO0385903859, ZO0516605166\\",71,71,2,2,order,kamal +\\"-QMtOW0BH63Xcmy432HJ\\",ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Kamal,Kamal,\\"Kamal Ryan\\",\\"Kamal Ryan\\",MALE,39,Ryan,Ryan,\\"(empty)\\",Wednesday,2,\\"kamal@ryan-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568524,\\"sold_product_568524_17644, sold_product_568524_12625\\",\\"sold_product_568524_17644, sold_product_568524_12625\\",\\"60, 60\\",\\"60, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"29.406, 31.188\\",\\"60, 60\\",\\"17,644, 12,625\\",\\"Suit jacket - dark blue, T-bar sandals - cognac\\",\\"Suit jacket - dark blue, T-bar sandals - cognac\\",\\"1, 1\\",\\"ZO0424104241, ZO0694706947\\",\\"0, 0\\",\\"60, 60\\",\\"60, 60\\",\\"0, 0\\",\\"ZO0424104241, ZO0694706947\\",120,120,2,2,order,kamal +\\"-gMtOW0BH63Xcmy432HJ\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Recip,Recip,\\"Recip Reese\\",\\"Recip Reese\\",MALE,10,Reese,Reese,\\"(empty)\\",Wednesday,2,\\"recip@reese-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568589,\\"sold_product_568589_19575, sold_product_568589_21053\\",\\"sold_product_568589_19575, sold_product_568589_21053\\",\\"65, 10.992\\",\\"65, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"35.094, 5.391\\",\\"65, 10.992\\",\\"19,575, 21,053\\",\\"Short coat - oliv, Print T-shirt - white/blue\\",\\"Short coat - oliv, Print T-shirt - white/blue\\",\\"1, 1\\",\\"ZO0114401144, ZO0564705647\\",\\"0, 0\\",\\"65, 10.992\\",\\"65, 10.992\\",\\"0, 0\\",\\"ZO0114401144, ZO0564705647\\",76,76,2,2,order,recip +\\"-wMtOW0BH63Xcmy432HJ\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Oliver,Oliver,\\"Oliver Pope\\",\\"Oliver Pope\\",MALE,7,Pope,Pope,\\"(empty)\\",Wednesday,2,\\"oliver@pope-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568640,\\"sold_product_568640_20196, sold_product_568640_12339\\",\\"sold_product_568640_20196, sold_product_568640_12339\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"13.344, 10.906\\",\\"28.984, 20.984\\",\\"20,196, 12,339\\",\\"Sweatshirt - bright white, Polo shirt - grey multicolor\\",\\"Sweatshirt - bright white, Polo shirt - grey multicolor\\",\\"1, 1\\",\\"ZO0125901259, ZO0443204432\\",\\"0, 0\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"0, 0\\",\\"ZO0125901259, ZO0443204432\\",\\"49.969\\",\\"49.969\\",2,2,order,oliver +\\"_AMtOW0BH63Xcmy432HJ\\",ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Irwin,Irwin,\\"Irwin Henderson\\",\\"Irwin Henderson\\",MALE,14,Henderson,Henderson,\\"(empty)\\",Wednesday,2,\\"irwin@henderson-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568682,\\"sold_product_568682_21985, sold_product_568682_15522\\",\\"sold_product_568682_21985, sold_product_568682_15522\\",\\"60, 42\\",\\"60, 42\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"28.797, 19.734\\",\\"60, 42\\",\\"21,985, 15,522\\",\\"Smart lace-ups - black, Smart lace-ups - cognac\\",\\"Smart lace-ups - black, Smart lace-ups - cognac\\",\\"1, 1\\",\\"ZO0680706807, ZO0392603926\\",\\"0, 0\\",\\"60, 42\\",\\"60, 42\\",\\"0, 0\\",\\"ZO0680706807, ZO0392603926\\",102,102,2,2,order,irwin +XQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Miller\\",\\"Rabbia Al Miller\\",FEMALE,5,Miller,Miller,\\"(empty)\\",Wednesday,2,\\"rabbia al@miller-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Gnomehouse, Low Tide Media\\",\\"Gnomehouse, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569259,\\"sold_product_569259_18845, sold_product_569259_21703\\",\\"sold_product_569259_18845, sold_product_569259_21703\\",\\"55, 60\\",\\"55, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Low Tide Media\\",\\"Gnomehouse, Low Tide Media\\",\\"25.844, 28.203\\",\\"55, 60\\",\\"18,845, 21,703\\",\\"Summer dress - navy blazer, Ankle boots - tan \\",\\"Summer dress - navy blazer, Ankle boots - tan \\",\\"1, 1\\",\\"ZO0335503355, ZO0381003810\\",\\"0, 0\\",\\"55, 60\\",\\"55, 60\\",\\"0, 0\\",\\"ZO0335503355, ZO0381003810\\",115,115,2,2,order,rabbia +HAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Washington\\",\\"Hicham Washington\\",MALE,8,Washington,Washington,\\"(empty)\\",Wednesday,2,\\"hicham@washington-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568793,\\"sold_product_568793_17004, sold_product_568793_20936\\",\\"sold_product_568793_17004, sold_product_568793_20936\\",\\"33, 7.988\\",\\"33, 7.988\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"18.141, 4.23\\",\\"33, 7.988\\",\\"17,004, 20,936\\",\\"Watch - dark brown, Basic T-shirt - dark blue\\",\\"Watch - dark brown, Basic T-shirt - dark blue\\",\\"1, 1\\",\\"ZO0312503125, ZO0545505455\\",\\"0, 0\\",\\"33, 7.988\\",\\"33, 7.988\\",\\"0, 0\\",\\"ZO0312503125, ZO0545505455\\",\\"40.969\\",\\"40.969\\",2,2,order,hicham +HQMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Youssef,Youssef,\\"Youssef Porter\\",\\"Youssef Porter\\",MALE,31,Porter,Porter,\\"(empty)\\",Wednesday,2,\\"youssef@porter-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568350,\\"sold_product_568350_14392, sold_product_568350_24934\\",\\"sold_product_568350_14392, sold_product_568350_24934\\",\\"42, 50\\",\\"42, 50\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"21.406, 22.5\\",\\"42, 50\\",\\"14,392, 24,934\\",\\"Zantos - Wash bag - black, Lace-up boots - resin coffee\\",\\"Zantos - Wash bag - black, Lace-up boots - resin coffee\\",\\"1, 1\\",\\"ZO0317303173, ZO0403504035\\",\\"0, 0\\",\\"42, 50\\",\\"42, 50\\",\\"0, 0\\",\\"ZO0317303173, ZO0403504035\\",92,92,2,2,order,youssef +HgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Moss\\",\\"Youssef Moss\\",MALE,31,Moss,Moss,\\"(empty)\\",Wednesday,2,\\"youssef@moss-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"(empty), Low Tide Media\\",\\"(empty), Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568531,\\"sold_product_568531_12837, sold_product_568531_13153\\",\\"sold_product_568531_12837, sold_product_568531_13153\\",\\"165, 24.984\\",\\"165, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"(empty), Low Tide Media\\",\\"(empty), Low Tide Media\\",\\"77.563, 12\\",\\"165, 24.984\\",\\"12,837, 13,153\\",\\"Smart lace-ups - cognac, Cardigan - grey\\",\\"Smart lace-ups - cognac, Cardigan - grey\\",\\"1, 1\\",\\"ZO0482104821, ZO0447104471\\",\\"0, 0\\",\\"165, 24.984\\",\\"165, 24.984\\",\\"0, 0\\",\\"ZO0482104821, ZO0447104471\\",190,190,2,2,order,youssef +HwMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Robert,Robert,\\"Robert Cross\\",\\"Robert Cross\\",MALE,29,Cross,Cross,\\"(empty)\\",Wednesday,2,\\"robert@cross-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568578,\\"sold_product_568578_17925, sold_product_568578_16500\\",\\"sold_product_568578_17925, sold_product_568578_16500\\",\\"47, 33\\",\\"47, 33\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"24.438, 16.813\\",\\"47, 33\\",\\"17,925, 16,500\\",\\"Boots - tan, Casual Cuffed Pants\\",\\"Boots - tan, Casual Cuffed Pants\\",\\"1, 1\\",\\"ZO0520005200, ZO0421104211\\",\\"0, 0\\",\\"47, 33\\",\\"47, 33\\",\\"0, 0\\",\\"ZO0520005200, ZO0421104211\\",80,80,2,2,order,robert +IAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Phil,Phil,\\"Phil Cunningham\\",\\"Phil Cunningham\\",MALE,50,Cunningham,Cunningham,\\"(empty)\\",Wednesday,2,\\"phil@cunningham-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568609,\\"sold_product_568609_11893, sold_product_568609_2361\\",\\"sold_product_568609_11893, sold_product_568609_2361\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"5.172, 30\\",\\"10.992, 60\\",\\"11,893, 2,361\\",\\"Polo shirt - dark blue, Lace-up boots - dark brown\\",\\"Polo shirt - dark blue, Lace-up boots - dark brown\\",\\"1, 1\\",\\"ZO0570405704, ZO0256102561\\",\\"0, 0\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"0, 0\\",\\"ZO0570405704, ZO0256102561\\",71,71,2,2,order,phil +IQMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Thad,Thad,\\"Thad Carr\\",\\"Thad Carr\\",MALE,30,Carr,Carr,\\"(empty)\\",Wednesday,2,\\"thad@carr-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568652,\\"sold_product_568652_23582, sold_product_568652_20196\\",\\"sold_product_568652_23582, sold_product_568652_20196\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"24, 13.344\\",\\"50, 28.984\\",\\"23,582, 20,196\\",\\"Boots - black, Sweatshirt - bright white\\",\\"Boots - black, Sweatshirt - bright white\\",\\"1, 1\\",\\"ZO0403304033, ZO0125901259\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0403304033, ZO0125901259\\",79,79,2,2,order,thad +TAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Muniz,Muniz,\\"Muniz Jackson\\",\\"Muniz Jackson\\",MALE,37,Jackson,Jackson,\\"(empty)\\",Wednesday,2,\\"muniz@jackson-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Elitelligence,Elitelligence,\\"Jun 25, 2019 @ 00:00:00.000\\",568068,\\"sold_product_568068_12333, sold_product_568068_15128\\",\\"sold_product_568068_12333, sold_product_568068_15128\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"7.648, 5.059\\",\\"16.984, 10.992\\",\\"12,333, 15,128\\",\\"Tracksuit top - black, Wallet - brown\\",\\"Tracksuit top - black, Wallet - brown\\",\\"1, 1\\",\\"ZO0583005830, ZO0602706027\\",\\"0, 0\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"0, 0\\",\\"ZO0583005830, ZO0602706027\\",\\"27.984\\",\\"27.984\\",2,2,order,muniz +jgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,George,George,\\"George Pope\\",\\"George Pope\\",MALE,32,Pope,Pope,\\"(empty)\\",Wednesday,2,\\"george@pope-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568070,\\"sold_product_568070_14421, sold_product_568070_13685\\",\\"sold_product_568070_14421, sold_product_568070_13685\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"10.703, 8.328\\",\\"20.984, 16.984\\",\\"14,421, 13,685\\",\\"Jumper - mottled grey/camel/khaki, Print T-shirt - grey multicolor\\",\\"Jumper - mottled grey/camel/khaki, Print T-shirt - grey multicolor\\",\\"1, 1\\",\\"ZO0575605756, ZO0293302933\\",\\"0, 0\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"0, 0\\",\\"ZO0575605756, ZO0293302933\\",\\"37.969\\",\\"37.969\\",2,2,order,george +jwMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Duncan\\",\\"Selena Duncan\\",FEMALE,42,Duncan,Duncan,\\"(empty)\\",Wednesday,2,\\"selena@duncan-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568106,\\"sold_product_568106_8745, sold_product_568106_15742\\",\\"sold_product_568106_8745, sold_product_568106_15742\\",\\"33, 8.992\\",\\"33, 8.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"17.156, 4.941\\",\\"33, 8.992\\",\\"8,745, 15,742\\",\\"Cardigan - mottled brown, Tights - dark navy\\",\\"Cardigan - mottled brown, Tights - dark navy\\",\\"1, 1\\",\\"ZO0068700687, ZO0101301013\\",\\"0, 0\\",\\"33, 8.992\\",\\"33, 8.992\\",\\"0, 0\\",\\"ZO0068700687, ZO0101301013\\",\\"41.969\\",\\"41.969\\",2,2,order,selena +swMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Jensen\\",\\"Wilhemina St. Jensen\\",FEMALE,17,Jensen,Jensen,\\"(empty)\\",Wednesday,2,\\"wilhemina st.@jensen-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568439,\\"sold_product_568439_16712, sold_product_568439_5602\\",\\"sold_product_568439_16712, sold_product_568439_5602\\",\\"20.984, 100\\",\\"20.984, 100\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"9.656, 46\\",\\"20.984, 100\\",\\"16,712, 5,602\\",\\"Blouse - black/pink/blue, Winter boots - black\\",\\"Blouse - black/pink/blue, Winter boots - black\\",\\"1, 1\\",\\"ZO0170601706, ZO0251502515\\",\\"0, 0\\",\\"20.984, 100\\",\\"20.984, 100\\",\\"0, 0\\",\\"ZO0170601706, ZO0251502515\\",121,121,2,2,order,wilhemina +tAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Lawrence\\",\\"Thad Lawrence\\",MALE,30,Lawrence,Lawrence,\\"(empty)\\",Wednesday,2,\\"thad@lawrence-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568507,\\"sold_product_568507_6098, sold_product_568507_24890\\",\\"sold_product_568507_6098, sold_product_568507_24890\\",\\"75, 18.984\\",\\"75, 18.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"41.25, 10.438\\",\\"75, 18.984\\",\\"6,098, 24,890\\",\\"Parka - black, Shirt - mottled grey\\",\\"Parka - black, Shirt - mottled grey\\",\\"1, 1\\",\\"ZO0431304313, ZO0523605236\\",\\"0, 0\\",\\"75, 18.984\\",\\"75, 18.984\\",\\"0, 0\\",\\"ZO0431304313, ZO0523605236\\",94,94,2,2,order,thad +KgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Daniels\\",\\"Marwan Daniels\\",MALE,51,Daniels,Daniels,\\"(empty)\\",Wednesday,2,\\"marwan@daniels-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568236,\\"sold_product_568236_6221, sold_product_568236_11869\\",\\"sold_product_568236_6221, sold_product_568236_11869\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"15.07, 10.906\\",\\"28.984, 20.984\\",\\"6,221, 11,869\\",\\"Shirt - dark blue, Sweatshirt - grey multicolor\\",\\"Shirt - dark blue, Sweatshirt - grey multicolor\\",\\"1, 1\\",\\"ZO0416604166, ZO0581605816\\",\\"0, 0\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"0, 0\\",\\"ZO0416604166, ZO0581605816\\",\\"49.969\\",\\"49.969\\",2,2,order,marwan +KwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Meyer\\",\\"Brigitte Meyer\\",FEMALE,12,Meyer,Meyer,\\"(empty)\\",Wednesday,2,\\"brigitte@meyer-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568275,\\"sold_product_568275_17190, sold_product_568275_15978\\",\\"sold_product_568275_17190, sold_product_568275_15978\\",\\"60, 6.988\\",\\"60, 6.988\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"27, 3.43\\",\\"60, 6.988\\",\\"17,190, 15,978\\",\\"Pleated skirt - grey, 2 PACK - Socks - black \\",\\"Pleated skirt - grey, 2 PACK - Socks - black \\",\\"1, 1\\",\\"ZO0330903309, ZO0214802148\\",\\"0, 0\\",\\"60, 6.988\\",\\"60, 6.988\\",\\"0, 0\\",\\"ZO0330903309, ZO0214802148\\",67,67,2,2,order,brigitte +LAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Padilla\\",\\"Elyssa Padilla\\",FEMALE,27,Padilla,Padilla,\\"(empty)\\",Wednesday,2,\\"elyssa@padilla-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568434,\\"sold_product_568434_15265, sold_product_568434_22206\\",\\"sold_product_568434_15265, sold_product_568434_22206\\",\\"145, 14.992\\",\\"145, 14.992\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"78.313, 7.051\\",\\"145, 14.992\\",\\"15,265, 22,206\\",\\"High heeled boots - brown, Ballet pumps - navy\\",\\"High heeled boots - brown, Ballet pumps - navy\\",\\"1, 1\\",\\"ZO0362203622, ZO0000300003\\",\\"0, 0\\",\\"145, 14.992\\",\\"145, 14.992\\",\\"0, 0\\",\\"ZO0362203622, ZO0000300003\\",160,160,2,2,order,elyssa +LQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Dawson\\",\\"Elyssa Dawson\\",FEMALE,27,Dawson,Dawson,\\"(empty)\\",Wednesday,2,\\"elyssa@dawson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 25, 2019 @ 00:00:00.000\\",568458,\\"sold_product_568458_19261, sold_product_568458_24302\\",\\"sold_product_568458_19261, sold_product_568458_24302\\",\\"13.992, 10.992\\",\\"13.992, 10.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"7, 5.711\\",\\"13.992, 10.992\\",\\"19,261, 24,302\\",\\"Vest - black, Snood - dark grey/light grey\\",\\"Vest - black, Snood - dark grey/light grey\\",\\"1, 1\\",\\"ZO0164501645, ZO0195501955\\",\\"0, 0\\",\\"13.992, 10.992\\",\\"13.992, 10.992\\",\\"0, 0\\",\\"ZO0164501645, ZO0195501955\\",\\"24.984\\",\\"24.984\\",2,2,order,elyssa +LgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Betty,Betty,\\"Betty Bryant\\",\\"Betty Bryant\\",FEMALE,44,Bryant,Bryant,\\"(empty)\\",Wednesday,2,\\"betty@bryant-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568503,\\"sold_product_568503_12451, sold_product_568503_22678\\",\\"sold_product_568503_12451, sold_product_568503_22678\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"3.68, 31.188\\",\\"7.988, 60\\",\\"12,451, 22,678\\",\\"Vest - black, Ankle boots - Midnight Blue\\",\\"Vest - black, Ankle boots - Midnight Blue\\",\\"1, 1\\",\\"ZO0643306433, ZO0376203762\\",\\"0, 0\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"0, 0\\",\\"ZO0643306433, ZO0376203762\\",68,68,2,2,order,betty +fQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing, Men's Shoes\\",\\"Men's Accessories, Men's Clothing, Men's Shoes\\",EUR,Tariq,Tariq,\\"Tariq Salazar\\",\\"Tariq Salazar\\",MALE,25,Salazar,Salazar,\\"(empty)\\",Wednesday,2,\\"tariq@salazar-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Oceanavigations, Low Tide Media, Angeldale\\",\\"Oceanavigations, Low Tide Media, Angeldale\\",\\"Jun 25, 2019 @ 00:00:00.000\\",714149,\\"sold_product_714149_19588, sold_product_714149_6158, sold_product_714149_1422, sold_product_714149_18002\\",\\"sold_product_714149_19588, sold_product_714149_6158, sold_product_714149_1422, sold_product_714149_18002\\",\\"13.992, 22.984, 65, 42\\",\\"13.992, 22.984, 65, 42\\",\\"Men's Accessories, Men's Clothing, Men's Shoes, Men's Shoes\\",\\"Men's Accessories, Men's Clothing, Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, Low Tide Media, Angeldale, Low Tide Media\\",\\"Oceanavigations, Low Tide Media, Angeldale, Low Tide Media\\",\\"7.41, 11.492, 33.781, 21.406\\",\\"13.992, 22.984, 65, 42\\",\\"19,588, 6,158, 1,422, 18,002\\",\\"Belt - black, Shirt - black, Lace-ups - cognac, Boots - brown\\",\\"Belt - black, Shirt - black, Lace-ups - cognac, Boots - brown\\",\\"1, 1, 1, 1\\",\\"ZO0309503095, ZO0411904119, ZO0683306833, ZO0397103971\\",\\"0, 0, 0, 0\\",\\"13.992, 22.984, 65, 42\\",\\"13.992, 22.984, 65, 42\\",\\"0, 0, 0, 0\\",\\"ZO0309503095, ZO0411904119, ZO0683306833, ZO0397103971\\",144,144,4,4,order,tariq +QAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Wise\\",\\"Wagdi Wise\\",MALE,15,Wise,Wise,\\"(empty)\\",Wednesday,2,\\"wagdi@wise-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568232,\\"sold_product_568232_18129, sold_product_568232_19774\\",\\"sold_product_568232_18129, sold_product_568232_19774\\",\\"37, 11.992\\",\\"37, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"18.859, 5.879\\",\\"37, 11.992\\",\\"18,129, 19,774\\",\\"Trousers - grey, Print T-shirt - black/orange\\",\\"Trousers - grey, Print T-shirt - black/orange\\",\\"1, 1\\",\\"ZO0282902829, ZO0566605666\\",\\"0, 0\\",\\"37, 11.992\\",\\"37, 11.992\\",\\"0, 0\\",\\"ZO0282902829, ZO0566605666\\",\\"48.969\\",\\"48.969\\",2,2,order,wagdi +QQMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Reyes\\",\\"Robbie Reyes\\",MALE,48,Reyes,Reyes,\\"(empty)\\",Wednesday,2,\\"robbie@reyes-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568269,\\"sold_product_568269_19175, sold_product_568269_2764\\",\\"sold_product_568269_19175, sold_product_568269_2764\\",\\"33, 135\\",\\"33, 135\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"15.844, 67.5\\",\\"33, 135\\",\\"19,175, 2,764\\",\\"Watch - dark brown, Suit - dark blue\\",\\"Watch - dark brown, Suit - dark blue\\",\\"1, 1\\",\\"ZO0318603186, ZO0407904079\\",\\"0, 0\\",\\"33, 135\\",\\"33, 135\\",\\"0, 0\\",\\"ZO0318603186, ZO0407904079\\",168,168,2,2,order,robbie +QgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Yasmine,Yasmine,\\"Yasmine Stokes\\",\\"Yasmine Stokes\\",FEMALE,43,Stokes,Stokes,\\"(empty)\\",Wednesday,2,\\"yasmine@stokes-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568301,\\"sold_product_568301_20011, sold_product_568301_20152\\",\\"sold_product_568301_20011, sold_product_568301_20152\\",\\"33, 42\\",\\"33, 42\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"15.844, 22.25\\",\\"33, 42\\",\\"20,011, 20,152\\",\\"Jumpsuit - black, Platform boots - dark blue\\",\\"Jumpsuit - black, Platform boots - dark blue\\",\\"1, 1\\",\\"ZO0146401464, ZO0014700147\\",\\"0, 0\\",\\"33, 42\\",\\"33, 42\\",\\"0, 0\\",\\"ZO0146401464, ZO0014700147\\",75,75,2,2,order,yasmine +QwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Ryan\\",\\"Clarice Ryan\\",FEMALE,18,Ryan,Ryan,\\"(empty)\\",Wednesday,2,\\"clarice@ryan-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568469,\\"sold_product_568469_10902, sold_product_568469_8739\\",\\"sold_product_568469_10902, sold_product_568469_8739\\",\\"26.984, 28.984\\",\\"26.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"13.758, 15.938\\",\\"26.984, 28.984\\",\\"10,902, 8,739\\",\\"Pyjamas - black, Jumper - anthractie multicolor\\",\\"Pyjamas - black, Jumper - anthractie multicolor\\",\\"1, 1\\",\\"ZO0659806598, ZO0070100701\\",\\"0, 0\\",\\"26.984, 28.984\\",\\"26.984, 28.984\\",\\"0, 0\\",\\"ZO0659806598, ZO0070100701\\",\\"55.969\\",\\"55.969\\",2,2,order,clarice +RAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Shaw\\",\\"Sultan Al Shaw\\",MALE,19,Shaw,Shaw,\\"(empty)\\",Wednesday,2,\\"sultan al@shaw-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568499,\\"sold_product_568499_23865, sold_product_568499_17752\\",\\"sold_product_568499_23865, sold_product_568499_17752\\",\\"11.992, 37\\",\\"11.992, 37\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"5.879, 17.391\\",\\"11.992, 37\\",\\"23,865, 17,752\\",\\"2 PACK - Basic T-shirt - dark grey multicolor, Slim fit jeans - black denim\\",\\"2 PACK - Basic T-shirt - dark grey multicolor, Slim fit jeans - black denim\\",\\"1, 1\\",\\"ZO0474604746, ZO0113801138\\",\\"0, 0\\",\\"11.992, 37\\",\\"11.992, 37\\",\\"0, 0\\",\\"ZO0474604746, ZO0113801138\\",\\"48.969\\",\\"48.969\\",2,2,order,sultan +UQMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Austin\\",\\"Wilhemina St. Austin\\",FEMALE,17,Austin,Austin,\\"(empty)\\",Wednesday,2,\\"wilhemina st.@austin-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568083,\\"sold_product_568083_14459, sold_product_568083_18901\\",\\"sold_product_568083_14459, sold_product_568083_18901\\",\\"11.992, 16.984\\",\\"11.992, 16.984\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"5.762, 8.328\\",\\"11.992, 16.984\\",\\"14,459, 18,901\\",\\"Across body bag - cognac, Clutch - white/black\\",\\"Across body bag - cognac, Clutch - white/black\\",\\"1, 1\\",\\"ZO0200902009, ZO0092300923\\",\\"0, 0\\",\\"11.992, 16.984\\",\\"11.992, 16.984\\",\\"0, 0\\",\\"ZO0200902009, ZO0092300923\\",\\"28.984\\",\\"28.984\\",2,2,order,wilhemina +VAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Abd,Abd,\\"Abd Lamb\\",\\"Abd Lamb\\",MALE,52,Lamb,Lamb,\\"(empty)\\",Wednesday,2,\\"abd@lamb-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Angeldale,Angeldale,\\"Jun 25, 2019 @ 00:00:00.000\\",569163,\\"sold_product_569163_1774, sold_product_569163_23724\\",\\"sold_product_569163_1774, sold_product_569163_23724\\",\\"60, 75\\",\\"60, 75\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Angeldale\\",\\"Angeldale, Angeldale\\",\\"27.594, 37.5\\",\\"60, 75\\",\\"1,774, 23,724\\",\\"Lace-ups - cognac, Lace-ups - bordeaux\\",\\"Lace-ups - cognac, Lace-ups - bordeaux\\",\\"1, 1\\",\\"ZO0681106811, ZO0682706827\\",\\"0, 0\\",\\"60, 75\\",\\"60, 75\\",\\"0, 0\\",\\"ZO0681106811, ZO0682706827\\",135,135,2,2,order,abd +VQMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Clarice,Clarice,\\"Clarice Potter\\",\\"Clarice Potter\\",FEMALE,18,Potter,Potter,\\"(empty)\\",Wednesday,2,\\"clarice@potter-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569214,\\"sold_product_569214_15372, sold_product_569214_13660\\",\\"sold_product_569214_15372, sold_product_569214_13660\\",\\"20.984, 25.984\\",\\"20.984, 25.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"10.703, 13.25\\",\\"20.984, 25.984\\",\\"15,372, 13,660\\",\\"Jersey dress - khaki, Across body bag - brown\\",\\"Jersey dress - khaki, Across body bag - brown\\",\\"1, 1\\",\\"ZO0490104901, ZO0087200872\\",\\"0, 0\\",\\"20.984, 25.984\\",\\"20.984, 25.984\\",\\"0, 0\\",\\"ZO0490104901, ZO0087200872\\",\\"46.969\\",\\"46.969\\",2,2,order,clarice +VgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Lawrence\\",\\"Fitzgerald Lawrence\\",MALE,11,Lawrence,Lawrence,\\"(empty)\\",Wednesday,2,\\"fitzgerald@lawrence-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568875,\\"sold_product_568875_22460, sold_product_568875_12482\\",\\"sold_product_568875_22460, sold_product_568875_12482\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"3.92, 30\\",\\"7.988, 60\\",\\"22,460, 12,482\\",\\"3 PACK - Socks - white, Across body bag - black\\",\\"3 PACK - Socks - white, Across body bag - black\\",\\"1, 1\\",\\"ZO0613606136, ZO0463804638\\",\\"0, 0\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"0, 0\\",\\"ZO0613606136, ZO0463804638\\",68,68,2,2,order,fuzzy +VwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Wagdi,Wagdi,\\"Wagdi Griffin\\",\\"Wagdi Griffin\\",MALE,15,Griffin,Griffin,\\"(empty)\\",Wednesday,2,\\"wagdi@griffin-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568943,\\"sold_product_568943_22910, sold_product_568943_1665\\",\\"sold_product_568943_22910, sold_product_568943_1665\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"13.242, 31.203\\",\\"24.984, 65\\",\\"22,910, 1,665\\",\\"Cardigan - black, Boots - light brown\\",\\"Cardigan - black, Boots - light brown\\",\\"1, 1\\",\\"ZO0445804458, ZO0686106861\\",\\"0, 0\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"0, 0\\",\\"ZO0445804458, ZO0686106861\\",90,90,2,2,order,wagdi +WAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Yahya,Yahya,\\"Yahya Dennis\\",\\"Yahya Dennis\\",MALE,23,Dennis,Dennis,\\"(empty)\\",Wednesday,2,\\"yahya@dennis-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569046,\\"sold_product_569046_15527, sold_product_569046_3489\\",\\"sold_product_569046_15527, sold_product_569046_3489\\",\\"33, 22.984\\",\\"33, 22.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"15.844, 12.18\\",\\"33, 22.984\\",\\"15,527, 3,489\\",\\"Lace-ups - black, Tights - black\\",\\"Lace-ups - black, Tights - black\\",\\"1, 1\\",\\"ZO0393103931, ZO0619906199\\",\\"0, 0\\",\\"33, 22.984\\",\\"33, 22.984\\",\\"0, 0\\",\\"ZO0393103931, ZO0619906199\\",\\"55.969\\",\\"55.969\\",2,2,order,yahya +WQMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Cortez\\",\\"Brigitte Cortez\\",FEMALE,12,Cortez,Cortez,\\"(empty)\\",Wednesday,2,\\"brigitte@cortez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569103,\\"sold_product_569103_23059, sold_product_569103_19509\\",\\"sold_product_569103_23059, sold_product_569103_19509\\",\\"21.984, 28.984\\",\\"21.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"11.648, 15.648\\",\\"21.984, 28.984\\",\\"23,059, 19,509\\",\\"Jumper dress - bordeaux, Blouse - dark red\\",\\"Jumper dress - bordeaux, Blouse - dark red\\",\\"1, 1\\",\\"ZO0636506365, ZO0345503455\\",\\"0, 0\\",\\"21.984, 28.984\\",\\"21.984, 28.984\\",\\"0, 0\\",\\"ZO0636506365, ZO0345503455\\",\\"50.969\\",\\"50.969\\",2,2,order,brigitte +WgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Morgan\\",\\"Abdulraheem Al Morgan\\",MALE,33,Morgan,Morgan,\\"(empty)\\",Wednesday,2,\\"abdulraheem al@morgan-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568993,\\"sold_product_568993_21293, sold_product_568993_13143\\",\\"sold_product_568993_21293, sold_product_568993_13143\\",\\"24.984, 155\\",\\"24.984, 155\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"12.742, 79.063\\",\\"24.984, 155\\",\\"21,293, 13,143\\",\\"Trainers - white, Slip-ons - black\\",\\"Trainers - white, Slip-ons - black\\",\\"1, 1\\",\\"ZO0510505105, ZO0482604826\\",\\"0, 0\\",\\"24.984, 155\\",\\"24.984, 155\\",\\"0, 0\\",\\"ZO0510505105, ZO0482604826\\",180,180,2,2,order,abdulraheem +EAMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Lloyd\\",\\"Sultan Al Lloyd\\",MALE,19,Lloyd,Lloyd,\\"(empty)\\",Wednesday,2,\\"sultan al@lloyd-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",720661,\\"sold_product_720661_22855, sold_product_720661_15602, sold_product_720661_15204, sold_product_720661_22811\\",\\"sold_product_720661_22855, sold_product_720661_15602, sold_product_720661_15204, sold_product_720661_22811\\",\\"22.984, 42, 42, 24.984\\",\\"22.984, 42, 42, 24.984\\",\\"Men's Clothing, Men's Accessories, Men's Accessories, Men's Clothing\\",\\"Men's Clothing, Men's Accessories, Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Low Tide Media, Oceanavigations, Low Tide Media\\",\\"Low Tide Media, Low Tide Media, Oceanavigations, Low Tide Media\\",\\"10.813, 21.828, 21.406, 11.5\\",\\"22.984, 42, 42, 24.984\\",\\"22,855, 15,602, 15,204, 22,811\\",\\"Shorts - black, Weekend bag - black , Weekend bag - black, Cardigan - beige multicolor\\",\\"Shorts - black, Weekend bag - black , Weekend bag - black, Cardigan - beige multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0423004230, ZO0471604716, ZO0315303153, ZO0445604456\\",\\"0, 0, 0, 0\\",\\"22.984, 42, 42, 24.984\\",\\"22.984, 42, 42, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0423004230, ZO0471604716, ZO0315303153, ZO0445604456\\",132,132,4,4,order,sultan +RQMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Perkins\\",\\"Betty Perkins\\",FEMALE,44,Perkins,Perkins,\\"(empty)\\",Wednesday,2,\\"betty@perkins-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Microlutions, Champion Arts\\",\\"Microlutions, Champion Arts\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569144,\\"sold_product_569144_9379, sold_product_569144_15599\\",\\"sold_product_569144_9379, sold_product_569144_15599\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Champion Arts\\",\\"Microlutions, Champion Arts\\",\\"16.813, 15.648\\",\\"33, 28.984\\",\\"9,379, 15,599\\",\\"Trousers - black, Tracksuit top - dark grey multicolor\\",\\"Trousers - black, Tracksuit top - dark grey multicolor\\",\\"1, 1\\",\\"ZO0108101081, ZO0501105011\\",\\"0, 0\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"0, 0\\",\\"ZO0108101081, ZO0501105011\\",\\"61.969\\",\\"61.969\\",2,2,order,betty +RgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Mullins\\",\\"Muniz Mullins\\",MALE,37,Mullins,Mullins,\\"(empty)\\",Wednesday,2,\\"muniz@mullins-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569198,\\"sold_product_569198_13676, sold_product_569198_6033\\",\\"sold_product_569198_13676, sold_product_569198_6033\\",\\"28.984, 18.984\\",\\"28.984, 18.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"15.938, 9.117\\",\\"28.984, 18.984\\",\\"13,676, 6,033\\",\\"Across body bag - brown , Sweatshirt - white\\",\\"Across body bag - brown , Sweatshirt - white\\",\\"1, 1\\",\\"ZO0464304643, ZO0581905819\\",\\"0, 0\\",\\"28.984, 18.984\\",\\"28.984, 18.984\\",\\"0, 0\\",\\"ZO0464304643, ZO0581905819\\",\\"47.969\\",\\"47.969\\",2,2,order,muniz +RwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Yahya,Yahya,\\"Yahya Brady\\",\\"Yahya Brady\\",MALE,23,Brady,Brady,\\"(empty)\\",Wednesday,2,\\"yahya@brady-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Spherecords, Oceanavigations\\",\\"Spherecords, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568845,\\"sold_product_568845_11493, sold_product_568845_18854\\",\\"sold_product_568845_11493, sold_product_568845_18854\\",\\"20.984, 85\\",\\"20.984, 85\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Oceanavigations\\",\\"Spherecords, Oceanavigations\\",\\"10.078, 46.75\\",\\"20.984, 85\\",\\"11,493, 18,854\\",\\"Tracksuit bottoms - light grey multicolor, Boots - Midnight Blue\\",\\"Tracksuit bottoms - light grey multicolor, Boots - Midnight Blue\\",\\"1, 1\\",\\"ZO0657906579, ZO0258102581\\",\\"0, 0\\",\\"20.984, 85\\",\\"20.984, 85\\",\\"0, 0\\",\\"ZO0657906579, ZO0258102581\\",106,106,2,2,order,yahya +SAMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,rania,rania,\\"rania Byrd\\",\\"rania Byrd\\",FEMALE,24,Byrd,Byrd,\\"(empty)\\",Wednesday,2,\\"rania@byrd-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Pyramidustries,Pyramidustries,\\"Jun 25, 2019 @ 00:00:00.000\\",568894,\\"sold_product_568894_21617, sold_product_568894_16951\\",\\"sold_product_568894_21617, sold_product_568894_16951\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"21, 11.117\\",\\"42, 20.984\\",\\"21,617, 16,951\\",\\"Cowboy/Biker boots - black, Clutch - black\\",\\"Cowboy/Biker boots - black, Clutch - black\\",\\"1, 1\\",\\"ZO0141801418, ZO0206302063\\",\\"0, 0\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"0, 0\\",\\"ZO0141801418, ZO0206302063\\",\\"62.969\\",\\"62.969\\",2,2,order,rani +SQMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Carpenter\\",\\"rania Carpenter\\",FEMALE,24,Carpenter,Carpenter,\\"(empty)\\",Wednesday,2,\\"rania@carpenter-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Spherecords,Spherecords,\\"Jun 25, 2019 @ 00:00:00.000\\",568938,\\"sold_product_568938_18398, sold_product_568938_19241\\",\\"sold_product_568938_18398, sold_product_568938_19241\\",\\"10.992, 16.984\\",\\"10.992, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Spherecords\\",\\"Spherecords, Spherecords\\",\\"5.391, 9.172\\",\\"10.992, 16.984\\",\\"18,398, 19,241\\",\\"Vest - black, Tracksuit bottoms - navy\\",\\"Vest - black, Tracksuit bottoms - navy\\",\\"1, 1\\",\\"ZO0642806428, ZO0632506325\\",\\"0, 0\\",\\"10.992, 16.984\\",\\"10.992, 16.984\\",\\"0, 0\\",\\"ZO0642806428, ZO0632506325\\",\\"27.984\\",\\"27.984\\",2,2,order,rani +SgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Accessories\\",\\"Men's Accessories\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Meyer\\",\\"Fitzgerald Meyer\\",MALE,11,Meyer,Meyer,\\"(empty)\\",Wednesday,2,\\"fitzgerald@meyer-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569045,\\"sold_product_569045_17857, sold_product_569045_12592\\",\\"sold_product_569045_17857, sold_product_569045_12592\\",\\"85, 14.992\\",\\"85, 14.992\\",\\"Men's Accessories, Men's Accessories\\",\\"Men's Accessories, Men's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"39.938, 7.051\\",\\"85, 14.992\\",\\"17,857, 12,592\\",\\"Laptop bag - black, Belt - dark brown \\",\\"Laptop bag - black, Belt - dark brown \\",\\"1, 1\\",\\"ZO0315903159, ZO0461104611\\",\\"0, 0\\",\\"85, 14.992\\",\\"85, 14.992\\",\\"0, 0\\",\\"ZO0315903159, ZO0461104611\\",100,100,2,2,order,fuzzy +SwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Thad,Thad,\\"Thad Munoz\\",\\"Thad Munoz\\",MALE,30,Munoz,Munoz,\\"(empty)\\",Wednesday,2,\\"thad@munoz-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569097,\\"sold_product_569097_20740, sold_product_569097_12607\\",\\"sold_product_569097_20740, sold_product_569097_12607\\",\\"33, 155\\",\\"33, 155\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"14.852, 83.688\\",\\"33, 155\\",\\"20,740, 12,607\\",\\"High-top trainers - beige, Smart slip-ons - black\\",\\"High-top trainers - beige, Smart slip-ons - black\\",\\"1, 1\\",\\"ZO0511605116, ZO0483004830\\",\\"0, 0\\",\\"33, 155\\",\\"33, 155\\",\\"0, 0\\",\\"ZO0511605116, ZO0483004830\\",188,188,2,2,order,thad +dwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Franklin\\",\\"Elyssa Franklin\\",FEMALE,27,Franklin,Franklin,\\"(empty)\\",Wednesday,2,\\"elyssa@franklin-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Angeldale, Gnomehouse, Tigress Enterprises\\",\\"Angeldale, Gnomehouse, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",727370,\\"sold_product_727370_24280, sold_product_727370_20519, sold_product_727370_18829, sold_product_727370_16904\\",\\"sold_product_727370_24280, sold_product_727370_20519, sold_product_727370_18829, sold_product_727370_16904\\",\\"85, 50, 37, 33\\",\\"85, 50, 37, 33\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Shoes\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Gnomehouse, Tigress Enterprises, Tigress Enterprises\\",\\"Angeldale, Gnomehouse, Tigress Enterprises, Tigress Enterprises\\",\\"45.875, 24.5, 17.391, 15.508\\",\\"85, 50, 37, 33\\",\\"24,280, 20,519, 18,829, 16,904\\",\\"Boots - black, Classic heels - Midnight Blue, Jersey dress - Blue Violety/black, Trainers - black\\",\\"Boots - black, Classic heels - Midnight Blue, Jersey dress - Blue Violety/black, Trainers - black\\",\\"1, 1, 1, 1\\",\\"ZO0680206802, ZO0321703217, ZO0049900499, ZO0029400294\\",\\"0, 0, 0, 0\\",\\"85, 50, 37, 33\\",\\"85, 50, 37, 33\\",\\"0, 0, 0, 0\\",\\"ZO0680206802, ZO0321703217, ZO0049900499, ZO0029400294\\",205,205,4,4,order,elyssa +kwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Frances,Frances,\\"Frances Davidson\\",\\"Frances Davidson\\",FEMALE,49,Davidson,Davidson,\\"(empty)\\",Wednesday,2,\\"frances@davidson-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568751,\\"sold_product_568751_22085, sold_product_568751_22963\\",\\"sold_product_568751_22085, sold_product_568751_22963\\",\\"11.992, 7.988\\",\\"11.992, 7.988\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"6.352, 4.148\\",\\"11.992, 7.988\\",\\"22,085, 22,963\\",\\"Hat - black, 3 PACK - Socks - grey/white/black\\",\\"Hat - black, 3 PACK - Socks - grey/white/black\\",\\"1, 1\\",\\"ZO0308703087, ZO0613106131\\",\\"0, 0\\",\\"11.992, 7.988\\",\\"11.992, 7.988\\",\\"0, 0\\",\\"ZO0308703087, ZO0613106131\\",\\"19.984\\",\\"19.984\\",2,2,order,frances +oQMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Nash\\",\\"Yasmine Nash\\",FEMALE,43,Nash,Nash,\\"(empty)\\",Wednesday,2,\\"yasmine@nash-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569010,\\"sold_product_569010_17948, sold_product_569010_22803\\",\\"sold_product_569010_17948, sold_product_569010_22803\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"15.359, 17.484\\",\\"28.984, 33\\",\\"17,948, 22,803\\",\\"Tote bag - old rose, Blouse - red\\",\\"Tote bag - old rose, Blouse - red\\",\\"1, 1\\",\\"ZO0090700907, ZO0265002650\\",\\"0, 0\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"0, 0\\",\\"ZO0090700907, ZO0265002650\\",\\"61.969\\",\\"61.969\\",2,2,order,yasmine +uwMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",EUR,Tariq,Tariq,\\"Tariq Rivera\\",\\"Tariq Rivera\\",MALE,25,Rivera,Rivera,\\"(empty)\\",Wednesday,2,\\"tariq@rivera-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568745,\\"sold_product_568745_24487, sold_product_568745_17279\\",\\"sold_product_568745_24487, sold_product_568745_17279\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"10.906, 6.109\\",\\"20.984, 11.992\\",\\"24,487, 17,279\\",\\"Chinos - grey, Hat - navy\\",\\"Chinos - grey, Hat - navy\\",\\"1, 1\\",\\"ZO0528305283, ZO0309203092\\",\\"0, 0\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"0, 0\\",\\"ZO0528305283, ZO0309203092\\",\\"32.969\\",\\"32.969\\",2,2,order,tariq +AwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories, Women's Clothing\\",\\"Women's Shoes, Women's Accessories, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Simpson\\",\\"Rabbia Al Simpson\\",FEMALE,5,Simpson,Simpson,\\"(empty)\\",Wednesday,2,\\"rabbia al@simpson-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 25, 2019 @ 00:00:00.000\\",728962,\\"sold_product_728962_24881, sold_product_728962_18382, sold_product_728962_14470, sold_product_728962_18450\\",\\"sold_product_728962_24881, sold_product_728962_18382, sold_product_728962_14470, sold_product_728962_18450\\",\\"42, 24.984, 28.984, 50\\",\\"42, 24.984, 28.984, 50\\",\\"Women's Shoes, Women's Accessories, Women's Clothing, Women's Clothing\\",\\"Women's Shoes, Women's Accessories, Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Tigress Enterprises, Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Tigress Enterprises, Tigress Enterprises, Gnomehouse\\",\\"20.578, 12.992, 15.648, 22.5\\",\\"42, 24.984, 28.984, 50\\",\\"24,881, 18,382, 14,470, 18,450\\",\\"Ankle boots - black, Across body bag - taupe/black/pink, Cardigan - tan, Summer dress - flame scarlet\\",\\"Ankle boots - black, Across body bag - taupe/black/pink, Cardigan - tan, Summer dress - flame scarlet\\",\\"1, 1, 1, 1\\",\\"ZO0019800198, ZO0089200892, ZO0069700697, ZO0332303323\\",\\"0, 0, 0, 0\\",\\"42, 24.984, 28.984, 50\\",\\"42, 24.984, 28.984, 50\\",\\"0, 0, 0, 0\\",\\"ZO0019800198, ZO0089200892, ZO0069700697, ZO0332303323\\",146,146,4,4,order,rabbia +XAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yahya,Yahya,\\"Yahya Love\\",\\"Yahya Love\\",MALE,23,Love,Love,\\"(empty)\\",Wednesday,2,\\"yahya@love-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Elitelligence,Elitelligence,\\"Jun 25, 2019 @ 00:00:00.000\\",568069,\\"sold_product_568069_14245, sold_product_568069_19287\\",\\"sold_product_568069_14245, sold_product_568069_19287\\",\\"28.984, 21.984\\",\\"28.984, 21.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"13.922, 10.563\\",\\"28.984, 21.984\\",\\"14,245, 19,287\\",\\"Trousers - grey, Chinos - dark blue\\",\\"Trousers - grey, Chinos - dark blue\\",\\"1, 1\\",\\"ZO0530305303, ZO0528405284\\",\\"0, 0\\",\\"28.984, 21.984\\",\\"28.984, 21.984\\",\\"0, 0\\",\\"ZO0530305303, ZO0528405284\\",\\"50.969\\",\\"50.969\\",2,2,order,yahya +jQMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Massey\\",\\"Rabbia Al Massey\\",FEMALE,5,Massey,Massey,\\"(empty)\\",Wednesday,2,\\"rabbia al@massey-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises MAMA, Champion Arts, Microlutions, Primemaster\\",\\"Tigress Enterprises MAMA, Champion Arts, Microlutions, Primemaster\\",\\"Jun 25, 2019 @ 00:00:00.000\\",732546,\\"sold_product_732546_17971, sold_product_732546_18249, sold_product_732546_18483, sold_product_732546_18726\\",\\"sold_product_732546_17971, sold_product_732546_18249, sold_product_732546_18483, sold_product_732546_18726\\",\\"36, 24.984, 20.984, 140\\",\\"36, 24.984, 20.984, 140\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises MAMA, Champion Arts, Microlutions, Primemaster\\",\\"Tigress Enterprises MAMA, Champion Arts, Microlutions, Primemaster\\",\\"19.063, 13.742, 10.078, 64.375\\",\\"36, 24.984, 20.984, 140\\",\\"17,971, 18,249, 18,483, 18,726\\",\\"Jersey dress - navy/offwhite, Hoodie - off-white, Print T-shirt - olive night, High heeled boots - stone\\",\\"Jersey dress - navy/offwhite, Hoodie - off-white, Print T-shirt - olive night, High heeled boots - stone\\",\\"1, 1, 1, 1\\",\\"ZO0228602286, ZO0502605026, ZO0108901089, ZO0362503625\\",\\"0, 0, 0, 0\\",\\"36, 24.984, 20.984, 140\\",\\"36, 24.984, 20.984, 140\\",\\"0, 0, 0, 0\\",\\"ZO0228602286, ZO0502605026, ZO0108901089, ZO0362503625\\",222,222,4,4,order,rabbia +BwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Simpson\\",\\"Wilhemina St. Simpson\\",FEMALE,17,Simpson,Simpson,\\"(empty)\\",Wednesday,2,\\"wilhemina st.@simpson-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Pyramidustries active, Tigress Enterprises\\",\\"Pyramidustries active, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568218,\\"sold_product_568218_10736, sold_product_568218_16297\\",\\"sold_product_568218_10736, sold_product_568218_16297\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Tigress Enterprises\\",\\"Pyramidustries active, Tigress Enterprises\\",\\"16.172, 9.344\\",\\"33, 16.984\\",\\"10,736, 16,297\\",\\"Tracksuit top - grey multicolor , Watch - nude\\",\\"Tracksuit top - grey multicolor , Watch - nude\\",\\"1, 1\\",\\"ZO0227402274, ZO0079000790\\",\\"0, 0\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"0, 0\\",\\"ZO0227402274, ZO0079000790\\",\\"49.969\\",\\"49.969\\",2,2,order,wilhemina +CAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Perkins\\",\\"Robbie Perkins\\",MALE,48,Perkins,Perkins,\\"(empty)\\",Wednesday,2,\\"robbie@perkins-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568278,\\"sold_product_568278_6696, sold_product_568278_21136\\",\\"sold_product_568278_6696, sold_product_568278_21136\\",\\"33, 33\\",\\"33, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"15.844, 17.813\\",\\"33, 33\\",\\"6,696, 21,136\\",\\"Slim fit jeans - dark blue, Jumper - dark blue\\",\\"Slim fit jeans - dark blue, Jumper - dark blue\\",\\"1, 1\\",\\"ZO0536705367, ZO0449804498\\",\\"0, 0\\",\\"33, 33\\",\\"33, 33\\",\\"0, 0\\",\\"ZO0536705367, ZO0449804498\\",66,66,2,2,order,robbie +CQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Ruiz\\",\\"Boris Ruiz\\",MALE,36,Ruiz,Ruiz,\\"(empty)\\",Wednesday,2,\\"boris@ruiz-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568428,\\"sold_product_568428_22274, sold_product_568428_12864\\",\\"sold_product_568428_22274, sold_product_568428_12864\\",\\"65, 22.984\\",\\"65, 22.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"34.438, 11.719\\",\\"65, 22.984\\",\\"22,274, 12,864\\",\\"Suit jacket - black, SLIM FIT - Formal shirt - black\\",\\"Suit jacket - black, SLIM FIT - Formal shirt - black\\",\\"1, 1\\",\\"ZO0408404084, ZO0422304223\\",\\"0, 0\\",\\"65, 22.984\\",\\"65, 22.984\\",\\"0, 0\\",\\"ZO0408404084, ZO0422304223\\",88,88,2,2,order,boris +CgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Hopkins\\",\\"Abigail Hopkins\\",FEMALE,46,Hopkins,Hopkins,\\"(empty)\\",Wednesday,2,\\"abigail@hopkins-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568492,\\"sold_product_568492_21002, sold_product_568492_19078\\",\\"sold_product_568492_21002, sold_product_568492_19078\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"17.156, 8.828\\",\\"33, 16.984\\",\\"21,002, 19,078\\",\\"Shirt - Dark Turquoise, Print T-shirt - black\\",\\"Shirt - Dark Turquoise, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0346103461, ZO0054100541\\",\\"0, 0\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"0, 0\\",\\"ZO0346103461, ZO0054100541\\",\\"49.969\\",\\"49.969\\",2,2,order,abigail +GgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Greene\\",\\"Abdulraheem Al Greene\\",MALE,33,Greene,Greene,\\"(empty)\\",Wednesday,2,\\"abdulraheem al@greene-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569262,\\"sold_product_569262_11467, sold_product_569262_11510\\",\\"sold_product_569262_11467, sold_product_569262_11510\\",\\"12.992, 10.992\\",\\"12.992, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"6.109, 5.82\\",\\"12.992, 10.992\\",\\"11,467, 11,510\\",\\"3 PACK - Shorts - black/royal/mint, Sports shirt - black\\",\\"3 PACK - Shorts - black/royal/mint, Sports shirt - black\\",\\"1, 1\\",\\"ZO0609906099, ZO0614806148\\",\\"0, 0\\",\\"12.992, 10.992\\",\\"12.992, 10.992\\",\\"0, 0\\",\\"ZO0609906099, ZO0614806148\\",\\"23.984\\",\\"23.984\\",2,2,order,abdulraheem +GwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Mckenzie\\",\\"Abd Mckenzie\\",MALE,52,Mckenzie,Mckenzie,\\"(empty)\\",Wednesday,2,\\"abd@mckenzie-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569306,\\"sold_product_569306_13753, sold_product_569306_19486\\",\\"sold_product_569306_13753, sold_product_569306_19486\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"13.742, 44.188\\",\\"24.984, 85\\",\\"13,753, 19,486\\",\\"Formal shirt - white/blue, Snowboard jacket - black\\",\\"Formal shirt - white/blue, Snowboard jacket - black\\",\\"1, 1\\",\\"ZO0412004120, ZO0625406254\\",\\"0, 0\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"0, 0\\",\\"ZO0412004120, ZO0625406254\\",110,110,2,2,order,abd +0gMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Yuri,Yuri,\\"Yuri Perry\\",\\"Yuri Perry\\",MALE,21,Perry,Perry,\\"(empty)\\",Wednesday,2,\\"yuri@perry-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569223,\\"sold_product_569223_12715, sold_product_569223_20466\\",\\"sold_product_569223_12715, sold_product_569223_20466\\",\\"18.984, 7.988\\",\\"18.984, 7.988\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"8.742, 4.23\\",\\"18.984, 7.988\\",\\"12,715, 20,466\\",\\"Polo shirt - off-white, Hat - black\\",\\"Polo shirt - off-white, Hat - black\\",\\"1, 1\\",\\"ZO0444004440, ZO0596805968\\",\\"0, 0\\",\\"18.984, 7.988\\",\\"18.984, 7.988\\",\\"0, 0\\",\\"ZO0444004440, ZO0596805968\\",\\"26.984\\",\\"26.984\\",2,2,order,yuri +GAMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Perkins\\",\\"Muniz Perkins\\",MALE,37,Perkins,Perkins,\\"(empty)\\",Wednesday,2,\\"muniz@perkins-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568039,\\"sold_product_568039_13197, sold_product_568039_11137\\",\\"sold_product_568039_13197, sold_product_568039_11137\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.172, 15.359\\",\\"10.992, 28.984\\",\\"13,197, 11,137\\",\\"Sunglasses - black/silver-coloured, Shirt - white\\",\\"Sunglasses - black/silver-coloured, Shirt - white\\",\\"1, 1\\",\\"ZO0599705997, ZO0416704167\\",\\"0, 0\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"0, 0\\",\\"ZO0599705997, ZO0416704167\\",\\"39.969\\",\\"39.969\\",2,2,order,muniz +YgMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Abd,Abd,\\"Abd Parker\\",\\"Abd Parker\\",MALE,52,Parker,Parker,\\"(empty)\\",Wednesday,2,\\"abd@parker-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568117,\\"sold_product_568117_13602, sold_product_568117_20020\\",\\"sold_product_568117_13602, sold_product_568117_20020\\",\\"20.984, 60\\",\\"20.984, 60\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"10.289, 28.797\\",\\"20.984, 60\\",\\"13,602, 20,020\\",\\"Across body bag - dark brown, Boots - navy\\",\\"Across body bag - dark brown, Boots - navy\\",\\"1, 1\\",\\"ZO0315203152, ZO0406304063\\",\\"0, 0\\",\\"20.984, 60\\",\\"20.984, 60\\",\\"0, 0\\",\\"ZO0315203152, ZO0406304063\\",81,81,2,2,order,abd +YwMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Figueroa\\",\\"Clarice Figueroa\\",FEMALE,18,Figueroa,Figueroa,\\"(empty)\\",Wednesday,2,\\"clarice@figueroa-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568165,\\"sold_product_568165_22895, sold_product_568165_20510\\",\\"sold_product_568165_22895, sold_product_568165_20510\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"13.492, 28.797\\",\\"24.984, 60\\",\\"22,895, 20,510\\",\\"Vest - moroccan blue, Dress - navy blazer\\",\\"Vest - moroccan blue, Dress - navy blazer\\",\\"1, 1\\",\\"ZO0065600656, ZO0337003370\\",\\"0, 0\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"0, 0\\",\\"ZO0065600656, ZO0337003370\\",85,85,2,2,order,clarice +hQMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Mccarthy\\",\\"Elyssa Mccarthy\\",FEMALE,27,Mccarthy,Mccarthy,\\"(empty)\\",Wednesday,2,\\"elyssa@mccarthy-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568393,\\"sold_product_568393_5224, sold_product_568393_18968\\",\\"sold_product_568393_5224, sold_product_568393_18968\\",\\"85, 50\\",\\"85, 50\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"41.656, 25\\",\\"85, 50\\",\\"5,224, 18,968\\",\\"Boots - cognac, High heeled sandals - black\\",\\"Boots - cognac, High heeled sandals - black\\",\\"1, 1\\",\\"ZO0374103741, ZO0242102421\\",\\"0, 0\\",\\"85, 50\\",\\"85, 50\\",\\"0, 0\\",\\"ZO0374103741, ZO0242102421\\",135,135,2,2,order,elyssa +1QMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Cunningham\\",\\"Gwen Cunningham\\",FEMALE,26,Cunningham,Cunningham,\\"(empty)\\",Wednesday,2,\\"gwen@cunningham-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",567996,\\"sold_product_567996_21740, sold_product_567996_20451\\",\\"sold_product_567996_21740, sold_product_567996_20451\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"11.25, 15.648\\",\\"24.984, 28.984\\",\\"21,740, 20,451\\",\\"Print T-shirt - scarab, Jersey dress - port royal\\",\\"Print T-shirt - scarab, Jersey dress - port royal\\",\\"1, 1\\",\\"ZO0105401054, ZO0046200462\\",\\"0, 0\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"0, 0\\",\\"ZO0105401054, ZO0046200462\\",\\"53.969\\",\\"53.969\\",2,2,order,gwen +BwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Carr\\",\\"Marwan Carr\\",MALE,51,Carr,Carr,\\"(empty)\\",Wednesday,2,\\"marwan@carr-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569173,\\"sold_product_569173_17602, sold_product_569173_2924\\",\\"sold_product_569173_17602, sold_product_569173_2924\\",\\"24.984, 37\\",\\"24.984, 37\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"11.75, 18.125\\",\\"24.984, 37\\",\\"17,602, 2,924\\",\\"Jumper - mulitcoloured/dark blue, Tracksuit - navy blazer\\",\\"Jumper - mulitcoloured/dark blue, Tracksuit - navy blazer\\",\\"1, 1\\",\\"ZO0452204522, ZO0631206312\\",\\"0, 0\\",\\"24.984, 37\\",\\"24.984, 37\\",\\"0, 0\\",\\"ZO0452204522, ZO0631206312\\",\\"61.969\\",\\"61.969\\",2,2,order,marwan +CAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Frances,Frances,\\"Frances Wells\\",\\"Frances Wells\\",FEMALE,49,Wells,Wells,\\"(empty)\\",Wednesday,2,\\"frances@wells-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569209,\\"sold_product_569209_16819, sold_product_569209_24934\\",\\"sold_product_569209_16819, sold_product_569209_24934\\",\\"42, 50\\",\\"42, 50\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"19.734, 22.5\\",\\"42, 50\\",\\"16,819, 24,934\\",\\"Weekend bag - cognac, Lace-up boots - resin coffee\\",\\"Weekend bag - cognac, Lace-up boots - resin coffee\\",\\"1, 1\\",\\"ZO0472304723, ZO0403504035\\",\\"0, 0\\",\\"42, 50\\",\\"42, 50\\",\\"0, 0\\",\\"ZO0472304723, ZO0403504035\\",92,92,2,2,order,frances +CQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Gibbs\\",\\"Jackson Gibbs\\",MALE,13,Gibbs,Gibbs,\\"(empty)\\",Wednesday,2,\\"jackson@gibbs-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568865,\\"sold_product_568865_15772, sold_product_568865_13481\\",\\"sold_product_568865_15772, sold_product_568865_13481\\",\\"11.992, 10.992\\",\\"11.992, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"6.23, 5.281\\",\\"11.992, 10.992\\",\\"15,772, 13,481\\",\\"Print T-shirt - white, Print T-shirt - white\\",\\"Print T-shirt - white, Print T-shirt - white\\",\\"1, 1\\",\\"ZO0294502945, ZO0560605606\\",\\"0, 0\\",\\"11.992, 10.992\\",\\"11.992, 10.992\\",\\"0, 0\\",\\"ZO0294502945, ZO0560605606\\",\\"22.984\\",\\"22.984\\",2,2,order,jackson +CgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yahya,Yahya,\\"Yahya Holland\\",\\"Yahya Holland\\",MALE,23,Holland,Holland,\\"(empty)\\",Wednesday,2,\\"yahya@holland-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Oceanavigations,Oceanavigations,\\"Jun 25, 2019 @ 00:00:00.000\\",568926,\\"sold_product_568926_19082, sold_product_568926_17588\\",\\"sold_product_568926_19082, sold_product_568926_17588\\",\\"70, 20.984\\",\\"70, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"37.094, 10.906\\",\\"70, 20.984\\",\\"19,082, 17,588\\",\\"Jumper - ecru, Sweatshirt - mustard\\",\\"Jumper - ecru, Sweatshirt - mustard\\",\\"1, 1\\",\\"ZO0298302983, ZO0300003000\\",\\"0, 0\\",\\"70, 20.984\\",\\"70, 20.984\\",\\"0, 0\\",\\"ZO0298302983, ZO0300003000\\",91,91,2,2,order,yahya +CwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Haynes\\",\\"Selena Haynes\\",FEMALE,42,Haynes,Haynes,\\"(empty)\\",Wednesday,2,\\"selena@haynes-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568955,\\"sold_product_568955_7789, sold_product_568955_11911\\",\\"sold_product_568955_7789, sold_product_568955_11911\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"15.359, 6\\",\\"28.984, 11.992\\",\\"7,789, 11,911\\",\\"Cardigan - blue grey, Leggings - black/white\\",\\"Cardigan - blue grey, Leggings - black/white\\",\\"1, 1\\",\\"ZO0068900689, ZO0076200762\\",\\"0, 0\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"0, 0\\",\\"ZO0068900689, ZO0076200762\\",\\"40.969\\",\\"40.969\\",2,2,order,selena +DAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Yasmine,Yasmine,\\"Yasmine Roberson\\",\\"Yasmine Roberson\\",FEMALE,43,Roberson,Roberson,\\"(empty)\\",Wednesday,2,\\"yasmine@roberson-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569056,\\"sold_product_569056_18276, sold_product_569056_16315\\",\\"sold_product_569056_18276, sold_product_569056_16315\\",\\"10.992, 33\\",\\"10.992, 33\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"5.82, 16.813\\",\\"10.992, 33\\",\\"18,276, 16,315\\",\\"Print T-shirt - dark grey, Handbag - taupe\\",\\"Print T-shirt - dark grey, Handbag - taupe\\",\\"1, 1\\",\\"ZO0494804948, ZO0096000960\\",\\"0, 0\\",\\"10.992, 33\\",\\"10.992, 33\\",\\"0, 0\\",\\"ZO0494804948, ZO0096000960\\",\\"43.969\\",\\"43.969\\",2,2,order,yasmine +DQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Hudson\\",\\"Yasmine Hudson\\",FEMALE,43,Hudson,Hudson,\\"(empty)\\",Wednesday,2,\\"yasmine@hudson-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569083,\\"sold_product_569083_17188, sold_product_569083_11983\\",\\"sold_product_569083_17188, sold_product_569083_11983\\",\\"13.992, 24.984\\",\\"13.992, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"7.551, 12.492\\",\\"13.992, 24.984\\",\\"17,188, 11,983\\",\\"Bustier - dark blue, Summer dress - red\\",\\"Bustier - dark blue, Summer dress - red\\",\\"1, 1\\",\\"ZO0099000990, ZO0631606316\\",\\"0, 0\\",\\"13.992, 24.984\\",\\"13.992, 24.984\\",\\"0, 0\\",\\"ZO0099000990, ZO0631606316\\",\\"38.969\\",\\"38.969\\",2,2,order,yasmine +EgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Conner\\",\\"Jackson Conner\\",MALE,13,Conner,Conner,\\"(empty)\\",Wednesday,2,\\"jackson@conner-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, (empty), Low Tide Media\\",\\"Oceanavigations, (empty), Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",717726,\\"sold_product_717726_23932, sold_product_717726_12833, sold_product_717726_20363, sold_product_717726_13390\\",\\"sold_product_717726_23932, sold_product_717726_12833, sold_product_717726_20363, sold_product_717726_13390\\",\\"28.984, 155, 50, 24.984\\",\\"28.984, 155, 50, 24.984\\",\\"Men's Clothing, Men's Shoes, Men's Shoes, Men's Clothing\\",\\"Men's Clothing, Men's Shoes, Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, (empty), Low Tide Media, Oceanavigations\\",\\"Oceanavigations, (empty), Low Tide Media, Oceanavigations\\",\\"13.922, 79.063, 24, 12\\",\\"28.984, 155, 50, 24.984\\",\\"23,932, 12,833, 20,363, 13,390\\",\\"SVEN - Jeans Tapered Fit - light blue, Smart lace-ups - cognac, Boots - Lime, Chinos - military green\\",\\"SVEN - Jeans Tapered Fit - light blue, Smart lace-ups - cognac, Boots - Lime, Chinos - military green\\",\\"1, 1, 1, 1\\",\\"ZO0284902849, ZO0481204812, ZO0398403984, ZO0282402824\\",\\"0, 0, 0, 0\\",\\"28.984, 155, 50, 24.984\\",\\"28.984, 155, 50, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0284902849, ZO0481204812, ZO0398403984, ZO0282402824\\",259,259,4,4,order,jackson +QwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,rania,rania,\\"rania Chapman\\",\\"rania Chapman\\",FEMALE,24,Chapman,Chapman,\\"(empty)\\",Wednesday,2,\\"rania@chapman-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Gnomehouse, Angeldale\\",\\"Gnomehouse, Angeldale\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568149,\\"sold_product_568149_12205, sold_product_568149_24905\\",\\"sold_product_568149_12205, sold_product_568149_24905\\",\\"33, 80\\",\\"33, 80\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Angeldale\\",\\"Gnomehouse, Angeldale\\",\\"15.18, 42.375\\",\\"33, 80\\",\\"12,205, 24,905\\",\\"Jacket - black, Lace-up boots - black\\",\\"Jacket - black, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0342503425, ZO0675206752\\",\\"0, 0\\",\\"33, 80\\",\\"33, 80\\",\\"0, 0\\",\\"ZO0342503425, ZO0675206752\\",113,113,2,2,order,rani +RAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Howell\\",\\"Rabbia Al Howell\\",FEMALE,5,Howell,Howell,\\"(empty)\\",Wednesday,2,\\"rabbia al@howell-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Crystal Lighting, Gnomehouse\\",\\"Crystal Lighting, Gnomehouse\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568192,\\"sold_product_568192_23290, sold_product_568192_11670\\",\\"sold_product_568192_23290, sold_product_568192_11670\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Crystal Lighting, Gnomehouse\\",\\"Crystal Lighting, Gnomehouse\\",\\"10.703, 9.867\\",\\"20.984, 20.984\\",\\"23,290, 11,670\\",\\"Wool jumper - dark blue, Hat - beige\\",\\"Wool jumper - dark blue, Hat - beige\\",\\"1, 1\\",\\"ZO0485504855, ZO0355603556\\",\\"0, 0\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"0, 0\\",\\"ZO0485504855, ZO0355603556\\",\\"41.969\\",\\"41.969\\",2,2,order,rabbia +YQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Gibbs\\",\\"Elyssa Gibbs\\",FEMALE,27,Gibbs,Gibbs,\\"(empty)\\",Wednesday,2,\\"elyssa@gibbs-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569183,\\"sold_product_569183_12081, sold_product_569183_8623\\",\\"sold_product_569183_12081, sold_product_569183_8623\\",\\"10.992, 17.984\\",\\"10.992, 17.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"5.172, 8.102\\",\\"10.992, 17.984\\",\\"12,081, 8,623\\",\\"Long sleeved top - dark brown, Long sleeved top - red ochre\\",\\"Long sleeved top - dark brown, Long sleeved top - red ochre\\",\\"1, 1\\",\\"ZO0641206412, ZO0165301653\\",\\"0, 0\\",\\"10.992, 17.984\\",\\"10.992, 17.984\\",\\"0, 0\\",\\"ZO0641206412, ZO0165301653\\",\\"28.984\\",\\"28.984\\",2,2,order,elyssa +YgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Kamal,Kamal,\\"Kamal Mckinney\\",\\"Kamal Mckinney\\",MALE,39,Mckinney,Mckinney,\\"(empty)\\",Wednesday,2,\\"kamal@mckinney-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568818,\\"sold_product_568818_12415, sold_product_568818_24390\\",\\"sold_product_568818_12415, sold_product_568818_24390\\",\\"18.984, 16.984\\",\\"18.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"9.313, 8.828\\",\\"18.984, 16.984\\",\\"12,415, 24,390\\",\\"Polo shirt - mottled grey, Jumper - dark brown multicolor\\",\\"Polo shirt - mottled grey, Jumper - dark brown multicolor\\",\\"1, 1\\",\\"ZO0294802948, ZO0451404514\\",\\"0, 0\\",\\"18.984, 16.984\\",\\"18.984, 16.984\\",\\"0, 0\\",\\"ZO0294802948, ZO0451404514\\",\\"35.969\\",\\"35.969\\",2,2,order,kamal +YwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Robert,Robert,\\"Robert Rivera\\",\\"Robert Rivera\\",MALE,29,Rivera,Rivera,\\"(empty)\\",Wednesday,2,\\"robert@rivera-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Spritechnologies, Oceanavigations\\",\\"Spritechnologies, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568854,\\"sold_product_568854_12479, sold_product_568854_1820\\",\\"sold_product_568854_12479, sold_product_568854_1820\\",\\"10.992, 75\\",\\"10.992, 75\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Oceanavigations\\",\\"Spritechnologies, Oceanavigations\\",\\"5.059, 36.75\\",\\"10.992, 75\\",\\"12,479, 1,820\\",\\"Print T-shirt - black, Smart slip-ons - oro\\",\\"Print T-shirt - black, Smart slip-ons - oro\\",\\"1, 1\\",\\"ZO0616706167, ZO0255402554\\",\\"0, 0\\",\\"10.992, 75\\",\\"10.992, 75\\",\\"0, 0\\",\\"ZO0616706167, ZO0255402554\\",86,86,2,2,order,robert +ZAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al Carpenter\\",\\"Ahmed Al Carpenter\\",MALE,4,Carpenter,Carpenter,\\"(empty)\\",Wednesday,2,\\"ahmed al@carpenter-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568901,\\"sold_product_568901_13181, sold_product_568901_23144\\",\\"sold_product_568901_13181, sold_product_568901_23144\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"21, 15.359\\",\\"42, 28.984\\",\\"13,181, 23,144\\",\\"Briefcase - navy, Slim fit jeans - grey\\",\\"Briefcase - navy, Slim fit jeans - grey\\",\\"1, 1\\",\\"ZO0466704667, ZO0427104271\\",\\"0, 0\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"0, 0\\",\\"ZO0466704667, ZO0427104271\\",71,71,2,2,order,ahmed +ZQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Mostafa,Mostafa,\\"Mostafa Hansen\\",\\"Mostafa Hansen\\",MALE,9,Hansen,Hansen,\\"(empty)\\",Wednesday,2,\\"mostafa@hansen-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568954,\\"sold_product_568954_591, sold_product_568954_1974\\",\\"sold_product_568954_591, sold_product_568954_1974\\",\\"65, 60\\",\\"65, 60\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"29.906, 28.203\\",\\"65, 60\\",\\"591, 1,974\\",\\"Lace-up boots - black barro, Lace-up boots - black\\",\\"Lace-up boots - black barro, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0399603996, ZO0685906859\\",\\"0, 0\\",\\"65, 60\\",\\"65, 60\\",\\"0, 0\\",\\"ZO0399603996, ZO0685906859\\",125,125,2,2,order,mostafa +ZgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Pia,Pia,\\"Pia Palmer\\",\\"Pia Palmer\\",FEMALE,45,Palmer,Palmer,\\"(empty)\\",Wednesday,2,\\"pia@palmer-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Primemaster\\",\\"Tigress Enterprises, Primemaster\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569033,\\"sold_product_569033_7233, sold_product_569033_18726\\",\\"sold_product_569033_7233, sold_product_569033_18726\\",\\"50, 140\\",\\"50, 140\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Primemaster\\",\\"Tigress Enterprises, Primemaster\\",\\"26.484, 64.375\\",\\"50, 140\\",\\"7,233, 18,726\\",\\"Over-the-knee boots - cognac, High heeled boots - stone\\",\\"Over-the-knee boots - cognac, High heeled boots - stone\\",\\"1, 1\\",\\"ZO0015700157, ZO0362503625\\",\\"0, 0\\",\\"50, 140\\",\\"50, 140\\",\\"0, 0\\",\\"ZO0015700157, ZO0362503625\\",190,190,2,2,order,pia +ZwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Mcdonald\\",\\"Fitzgerald Mcdonald\\",MALE,11,Mcdonald,Mcdonald,\\"(empty)\\",Wednesday,2,\\"fitzgerald@mcdonald-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569091,\\"sold_product_569091_13103, sold_product_569091_12677\\",\\"sold_product_569091_13103, sold_product_569091_12677\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"17.156, 8.492\\",\\"33, 16.984\\",\\"13,103, 12,677\\",\\"T-bar sandals - black, Long sleeved top - black\\",\\"T-bar sandals - black, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0258602586, ZO0552205522\\",\\"0, 0\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"0, 0\\",\\"ZO0258602586, ZO0552205522\\",\\"49.969\\",\\"49.969\\",2,2,order,fuzzy +aAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al Gibbs\\",\\"Ahmed Al Gibbs\\",MALE,4,Gibbs,Gibbs,\\"(empty)\\",Wednesday,2,\\"ahmed al@gibbs-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569003,\\"sold_product_569003_13719, sold_product_569003_12174\\",\\"sold_product_569003_13719, sold_product_569003_12174\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"13.242, 27\\",\\"24.984, 60\\",\\"13,719, 12,174\\",\\"Shirt - blue/grey, Smart lace-ups - Dark Red\\",\\"Shirt - blue/grey, Smart lace-ups - Dark Red\\",\\"1, 1\\",\\"ZO0414704147, ZO0387503875\\",\\"0, 0\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"0, 0\\",\\"ZO0414704147, ZO0387503875\\",85,85,2,2,order,ahmed +bQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Jim,Jim,\\"Jim Potter\\",\\"Jim Potter\\",MALE,41,Potter,Potter,\\"(empty)\\",Wednesday,2,\\"jim@potter-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568707,\\"sold_product_568707_24723, sold_product_568707_24246\\",\\"sold_product_568707_24723, sold_product_568707_24246\\",\\"33, 65\\",\\"33, 65\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"17.484, 33.781\\",\\"33, 65\\",\\"24,723, 24,246\\",\\"High-top trainers - multicolor, Lace-up boots - black\\",\\"High-top trainers - multicolor, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0513305133, ZO0253302533\\",\\"0, 0\\",\\"33, 65\\",\\"33, 65\\",\\"0, 0\\",\\"ZO0513305133, ZO0253302533\\",98,98,2,2,order,jim +eQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,George,George,\\"George Underwood\\",\\"George Underwood\\",MALE,32,Underwood,Underwood,\\"(empty)\\",Wednesday,2,\\"george@underwood-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Elitelligence,Elitelligence,\\"Jun 25, 2019 @ 00:00:00.000\\",568019,\\"sold_product_568019_17179, sold_product_568019_20306\\",\\"sold_product_568019_17179, sold_product_568019_20306\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"15.07, 5.52\\",\\"28.984, 11.992\\",\\"17,179, 20,306\\",\\"Chinos - black, Long sleeved top - mottled dark grey\\",\\"Chinos - black, Long sleeved top - mottled dark grey\\",\\"1, 1\\",\\"ZO0530805308, ZO0563905639\\",\\"0, 0\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"0, 0\\",\\"ZO0530805308, ZO0563905639\\",\\"40.969\\",\\"40.969\\",2,2,order,george +qQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Ruiz\\",\\"Yasmine Ruiz\\",FEMALE,43,Ruiz,Ruiz,\\"(empty)\\",Wednesday,2,\\"yasmine@ruiz-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568182,\\"sold_product_568182_18562, sold_product_568182_21438\\",\\"sold_product_568182_18562, sold_product_568182_21438\\",\\"42, 10.992\\",\\"42, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"18.906, 5.711\\",\\"42, 10.992\\",\\"18,562, 21,438\\",\\"Jersey dress - black, Long sleeved top - light grey multicolor\\",\\"Jersey dress - black, Long sleeved top - light grey multicolor\\",\\"1, 1\\",\\"ZO0338603386, ZO0641006410\\",\\"0, 0\\",\\"42, 10.992\\",\\"42, 10.992\\",\\"0, 0\\",\\"ZO0338603386, ZO0641006410\\",\\"52.969\\",\\"52.969\\",2,2,order,yasmine +CwMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jim,Jim,\\"Jim Munoz\\",\\"Jim Munoz\\",MALE,41,Munoz,Munoz,\\"(empty)\\",Wednesday,2,\\"jim@munoz-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569299,\\"sold_product_569299_18493, sold_product_569299_22273\\",\\"sold_product_569299_18493, sold_product_569299_22273\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"15.18, 5.93\\",\\"33, 10.992\\",\\"18,493, 22,273\\",\\"Lace-up boots - camel, Shorts - black\\",\\"Lace-up boots - camel, Shorts - black\\",\\"1, 1\\",\\"ZO0519605196, ZO0630806308\\",\\"0, 0\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"0, 0\\",\\"ZO0519605196, ZO0630806308\\",\\"43.969\\",\\"43.969\\",2,2,order,jim +DAMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Watkins\\",\\"Jackson Watkins\\",MALE,13,Watkins,Watkins,\\"(empty)\\",Wednesday,2,\\"jackson@watkins-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569123,\\"sold_product_569123_15429, sold_product_569123_23856\\",\\"sold_product_569123_15429, sold_product_569123_23856\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"10.703, 5.398\\",\\"20.984, 11.992\\",\\"15,429, 23,856\\",\\"Rucksack - black, Polo shirt - dark grey multicolor\\",\\"Rucksack - black, Polo shirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0609006090, ZO0441504415\\",\\"0, 0\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"0, 0\\",\\"ZO0609006090, ZO0441504415\\",\\"32.969\\",\\"32.969\\",2,2,order,jackson +kAMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Austin\\",\\"Elyssa Austin\\",FEMALE,27,Austin,Austin,\\"(empty)\\",Wednesday,2,\\"elyssa@austin-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises, Pyramidustries active\\",\\"Pyramidustries, Tigress Enterprises, Pyramidustries active\\",\\"Jun 25, 2019 @ 00:00:00.000\\",728335,\\"sold_product_728335_15156, sold_product_728335_21016, sold_product_728335_24932, sold_product_728335_18891\\",\\"sold_product_728335_15156, sold_product_728335_21016, sold_product_728335_24932, sold_product_728335_18891\\",\\"24.984, 33, 21.984, 33\\",\\"24.984, 33, 21.984, 33\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Shoes\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Tigress Enterprises, Pyramidustries active, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises, Pyramidustries active, Tigress Enterprises\\",\\"12.992, 15.844, 12.094, 18.141\\",\\"24.984, 33, 21.984, 33\\",\\"15,156, 21,016, 24,932, 18,891\\",\\"Classic heels - light blue, Ankle boots - black, Tights - grey multicolor, Ankle boots - black\\",\\"Classic heels - light blue, Ankle boots - black, Tights - grey multicolor, Ankle boots - black\\",\\"1, 1, 1, 1\\",\\"ZO0134701347, ZO0026200262, ZO0223102231, ZO0022900229\\",\\"0, 0, 0, 0\\",\\"24.984, 33, 21.984, 33\\",\\"24.984, 33, 21.984, 33\\",\\"0, 0, 0, 0\\",\\"ZO0134701347, ZO0026200262, ZO0223102231, ZO0022900229\\",\\"112.938\\",\\"112.938\\",4,4,order,elyssa +mgMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Powell\\",\\"Rabbia Al Powell\\",FEMALE,5,Powell,Powell,\\"(empty)\\",Wednesday,2,\\"rabbia al@powell-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Primemaster, Tigress Enterprises, Spherecords Maternity, Champion Arts\\",\\"Primemaster, Tigress Enterprises, Spherecords Maternity, Champion Arts\\",\\"Jun 25, 2019 @ 00:00:00.000\\",726874,\\"sold_product_726874_12603, sold_product_726874_14008, sold_product_726874_16407, sold_product_726874_23268\\",\\"sold_product_726874_12603, sold_product_726874_14008, sold_product_726874_16407, sold_product_726874_23268\\",\\"140, 37, 13.992, 42\\",\\"140, 37, 13.992, 42\\",\\"Women's Shoes, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Shoes, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Primemaster, Tigress Enterprises, Spherecords Maternity, Champion Arts\\",\\"Primemaster, Tigress Enterprises, Spherecords Maternity, Champion Arts\\",\\"70, 18.5, 7, 19.734\\",\\"140, 37, 13.992, 42\\",\\"12,603, 14,008, 16,407, 23,268\\",\\"Boots - Midnight Blue, Summer dress - rose/black, Maxi skirt - mid grey multicolor, Light jacket - black/off-white\\",\\"Boots - Midnight Blue, Summer dress - rose/black, Maxi skirt - mid grey multicolor, Light jacket - black/off-white\\",\\"1, 1, 1, 1\\",\\"ZO0362303623, ZO0035400354, ZO0705207052, ZO0504005040\\",\\"0, 0, 0, 0\\",\\"140, 37, 13.992, 42\\",\\"140, 37, 13.992, 42\\",\\"0, 0, 0, 0\\",\\"ZO0362303623, ZO0035400354, ZO0705207052, ZO0504005040\\",233,233,4,4,order,rabbia +vAMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Benson\\",\\"Stephanie Benson\\",FEMALE,6,Benson,Benson,\\"(empty)\\",Wednesday,2,\\"stephanie@benson-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569218,\\"sold_product_569218_18040, sold_product_569218_14398\\",\\"sold_product_569218_18040, sold_product_569218_14398\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"12.25, 10.906\\",\\"24.984, 20.984\\",\\"18,040, 14,398\\",\\"Trousers - black, Tracksuit bottoms - dark grey\\",\\"Trousers - black, Tracksuit bottoms - dark grey\\",\\"1, 1\\",\\"ZO0633206332, ZO0488604886\\",\\"0, 0\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"0, 0\\",\\"ZO0633206332, ZO0488604886\\",\\"45.969\\",\\"45.969\\",2,2,order,stephanie +0wMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Nash\\",\\"Jackson Nash\\",MALE,13,Nash,Nash,\\"(empty)\\",Wednesday,2,\\"jackson@nash-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Spritechnologies, Low Tide Media, Elitelligence\\",\\"Spritechnologies, Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",722613,\\"sold_product_722613_11046, sold_product_722613_11747, sold_product_722613_16568, sold_product_722613_15828\\",\\"sold_product_722613_11046, sold_product_722613_11747, sold_product_722613_16568, sold_product_722613_15828\\",\\"20.984, 20.984, 28.984, 10.992\\",\\"20.984, 20.984, 28.984, 10.992\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spritechnologies, Low Tide Media, Elitelligence, Low Tide Media\\",\\"Spritechnologies, Low Tide Media, Elitelligence, Low Tide Media\\",\\"9.453, 10.906, 15.938, 5.172\\",\\"20.984, 20.984, 28.984, 10.992\\",\\"11,046, 11,747, 16,568, 15,828\\",\\"Tracksuit bottoms - black, Polo shirt - blue, Chinos - dark blue, Tie - black\\",\\"Tracksuit bottoms - black, Polo shirt - blue, Chinos - dark blue, Tie - black\\",\\"1, 1, 1, 1\\",\\"ZO0618806188, ZO0442804428, ZO0530705307, ZO0410804108\\",\\"0, 0, 0, 0\\",\\"20.984, 20.984, 28.984, 10.992\\",\\"20.984, 20.984, 28.984, 10.992\\",\\"0, 0, 0, 0\\",\\"ZO0618806188, ZO0442804428, ZO0530705307, ZO0410804108\\",\\"81.938\\",\\"81.938\\",4,4,order,jackson +1AMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Kim\\",\\"Sonya Kim\\",FEMALE,28,Kim,Kim,\\"(empty)\\",Wednesday,2,\\"sonya@kim-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568152,\\"sold_product_568152_16870, sold_product_568152_17608\\",\\"sold_product_568152_16870, sold_product_568152_17608\\",\\"37, 28.984\\",\\"37, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"17.391, 14.211\\",\\"37, 28.984\\",\\"16,870, 17,608\\",\\"Blouse - multicolored, Summer dress - black/berry\\",\\"Blouse - multicolored, Summer dress - black/berry\\",\\"1, 1\\",\\"ZO0349303493, ZO0043900439\\",\\"0, 0\\",\\"37, 28.984\\",\\"37, 28.984\\",\\"0, 0\\",\\"ZO0349303493, ZO0043900439\\",66,66,2,2,order,sonya +1QMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Irwin,Irwin,\\"Irwin Hampton\\",\\"Irwin Hampton\\",MALE,14,Hampton,Hampton,\\"(empty)\\",Wednesday,2,\\"irwin@hampton-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568212,\\"sold_product_568212_19457, sold_product_568212_1471\\",\\"sold_product_568212_19457, sold_product_568212_1471\\",\\"25.984, 60\\",\\"25.984, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"12.219, 30\\",\\"25.984, 60\\",\\"19,457, 1,471\\",\\"Slim fit jeans - khaki, Lace-up boots - tan\\",\\"Slim fit jeans - khaki, Lace-up boots - tan\\",\\"1, 1\\",\\"ZO0536405364, ZO0688306883\\",\\"0, 0\\",\\"25.984, 60\\",\\"25.984, 60\\",\\"0, 0\\",\\"ZO0536405364, ZO0688306883\\",86,86,2,2,order,irwin +5AMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Gomez\\",\\"Abdulraheem Al Gomez\\",MALE,33,Gomez,Gomez,\\"(empty)\\",Wednesday,2,\\"abdulraheem al@gomez-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568228,\\"sold_product_568228_17075, sold_product_568228_21129\\",\\"sold_product_568228_17075, sold_product_568228_21129\\",\\"60, 22.984\\",\\"60, 22.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"31.797, 11.039\\",\\"60, 22.984\\",\\"17,075, 21,129\\",\\"Smart lace-ups - cognac, Jumper - khaki\\",\\"Smart lace-ups - cognac, Jumper - khaki\\",\\"1, 1\\",\\"ZO0387103871, ZO0580005800\\",\\"0, 0\\",\\"60, 22.984\\",\\"60, 22.984\\",\\"0, 0\\",\\"ZO0387103871, ZO0580005800\\",83,83,2,2,order,abdulraheem +5QMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Robert,Robert,\\"Robert Lloyd\\",\\"Robert Lloyd\\",MALE,29,Lloyd,Lloyd,\\"(empty)\\",Wednesday,2,\\"robert@lloyd-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568455,\\"sold_product_568455_13779, sold_product_568455_15022\\",\\"sold_product_568455_13779, sold_product_568455_15022\\",\\"22.984, 60\\",\\"22.984, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"11.273, 30.594\\",\\"22.984, 60\\",\\"13,779, 15,022\\",\\"Formal shirt - light blue, Lace-ups - cognac\\",\\"Formal shirt - light blue, Lace-ups - cognac\\",\\"1, 1\\",\\"ZO0413104131, ZO0392303923\\",\\"0, 0\\",\\"22.984, 60\\",\\"22.984, 60\\",\\"0, 0\\",\\"ZO0413104131, ZO0392303923\\",83,83,2,2,order,robert +7wMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Evans\\",\\"Abdulraheem Al Evans\\",MALE,33,Evans,Evans,\\"(empty)\\",Wednesday,2,\\"abdulraheem al@evans-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",567994,\\"sold_product_567994_12464, sold_product_567994_14037\\",\\"sold_product_567994_12464, sold_product_567994_14037\\",\\"75, 140\\",\\"75, 140\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"33.75, 68.625\\",\\"75, 140\\",\\"12,464, 14,037\\",\\"Short coat - dark grey, Leather jacket - black\\",\\"Short coat - dark grey, Leather jacket - black\\",\\"1, 1\\",\\"ZO0430904309, ZO0288402884\\",\\"0, 0\\",\\"75, 140\\",\\"75, 140\\",\\"0, 0\\",\\"ZO0430904309, ZO0288402884\\",215,215,2,2,order,abdulraheem +CAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Hayes\\",\\"Elyssa Hayes\\",FEMALE,27,Hayes,Hayes,\\"(empty)\\",Wednesday,2,\\"elyssa@hayes-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568045,\\"sold_product_568045_16186, sold_product_568045_24601\\",\\"sold_product_568045_16186, sold_product_568045_24601\\",\\"11.992, 28.984\\",\\"11.992, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"5.762, 14.492\\",\\"11.992, 28.984\\",\\"16,186, 24,601\\",\\"Print T-shirt - white, Cardigan - white/black\\",\\"Print T-shirt - white, Cardigan - white/black\\",\\"1, 1\\",\\"ZO0160501605, ZO0069500695\\",\\"0, 0\\",\\"11.992, 28.984\\",\\"11.992, 28.984\\",\\"0, 0\\",\\"ZO0160501605, ZO0069500695\\",\\"40.969\\",\\"40.969\\",2,2,order,elyssa +VQMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Bryant\\",\\"Elyssa Bryant\\",FEMALE,27,Bryant,Bryant,\\"(empty)\\",Wednesday,2,\\"elyssa@bryant-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568308,\\"sold_product_568308_15499, sold_product_568308_17990\\",\\"sold_product_568308_15499, sold_product_568308_17990\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"29.906, 12.992\\",\\"65, 24.984\\",\\"15,499, 17,990\\",\\"Over-the-knee boots - black, Ankle boots - cognac\\",\\"Over-the-knee boots - black, Ankle boots - cognac\\",\\"1, 1\\",\\"ZO0138701387, ZO0024600246\\",\\"0, 0\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"0, 0\\",\\"ZO0138701387, ZO0024600246\\",90,90,2,2,order,elyssa +VgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Stephanie,Stephanie,\\"Stephanie Chapman\\",\\"Stephanie Chapman\\",FEMALE,6,Chapman,Chapman,\\"(empty)\\",Wednesday,2,\\"stephanie@chapman-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568515,\\"sold_product_568515_19990, sold_product_568515_18594\\",\\"sold_product_568515_19990, sold_product_568515_18594\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"5.762, 34.438\\",\\"11.992, 65\\",\\"19,990, 18,594\\",\\"Vest - Forest Green, Classic heels - black\\",\\"Vest - Forest Green, Classic heels - black\\",\\"1, 1\\",\\"ZO0159901599, ZO0238702387\\",\\"0, 0\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"0, 0\\",\\"ZO0159901599, ZO0238702387\\",77,77,2,2,order,stephanie +dgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Marshall\\",\\"Eddie Marshall\\",MALE,38,Marshall,Marshall,\\"(empty)\\",Wednesday,2,\\"eddie@marshall-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Elitelligence,Elitelligence,\\"Jun 25, 2019 @ 00:00:00.000\\",721706,\\"sold_product_721706_21844, sold_product_721706_11106, sold_product_721706_1850, sold_product_721706_22242\\",\\"sold_product_721706_21844, sold_product_721706_11106, sold_product_721706_1850, sold_product_721706_22242\\",\\"33, 10.992, 28.984, 24.984\\",\\"33, 10.992, 28.984, 24.984\\",\\"Men's Shoes, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Elitelligence, Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence, Elitelligence, Elitelligence\\",\\"17.484, 5.711, 14.211, 12.992\\",\\"33, 10.992, 28.984, 24.984\\",\\"21,844, 11,106, 1,850, 22,242\\",\\"Lace-up boots - red, 2 PACK - Shorts - black/stripe, Trainers - black/grey, Sweatshirt - black\\",\\"Lace-up boots - red, 2 PACK - Shorts - black/stripe, Trainers - black/grey, Sweatshirt - black\\",\\"1, 1, 1, 1\\",\\"ZO0519005190, ZO0610206102, ZO0514405144, ZO0586505865\\",\\"0, 0, 0, 0\\",\\"33, 10.992, 28.984, 24.984\\",\\"33, 10.992, 28.984, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0519005190, ZO0610206102, ZO0514405144, ZO0586505865\\",\\"97.938\\",\\"97.938\\",4,4,order,eddie +fQMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Roberson\\",\\"Wilhemina St. Roberson\\",FEMALE,17,Roberson,Roberson,\\"(empty)\\",Wednesday,2,\\"wilhemina st.@roberson-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569250,\\"sold_product_569250_22975, sold_product_569250_16886\\",\\"sold_product_569250_22975, sold_product_569250_16886\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"17.484, 14.781\\",\\"33, 28.984\\",\\"22,975, 16,886\\",\\"Jersey dress - Medium Sea Green, Wedges - black\\",\\"Jersey dress - Medium Sea Green, Wedges - black\\",\\"1, 1\\",\\"ZO0228902289, ZO0005400054\\",\\"0, 0\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"0, 0\\",\\"ZO0228902289, ZO0005400054\\",\\"61.969\\",\\"61.969\\",2,2,order,wilhemina +3wMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Washington\\",\\"Thad Washington\\",MALE,30,Washington,Washington,\\"(empty)\\",Wednesday,2,\\"thad@washington-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spritechnologies, Oceanavigations\\",\\"Spritechnologies, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568776,\\"sold_product_568776_22271, sold_product_568776_18957\\",\\"sold_product_568776_22271, sold_product_568776_18957\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Oceanavigations\\",\\"Spritechnologies, Oceanavigations\\",\\"5.711, 11.75\\",\\"10.992, 24.984\\",\\"22,271, 18,957\\",\\"Sports shirt - dark green, Jumper - black\\",\\"Sports shirt - dark green, Jumper - black\\",\\"1, 1\\",\\"ZO0616906169, ZO0296902969\\",\\"0, 0\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"0, 0\\",\\"ZO0616906169, ZO0296902969\\",\\"35.969\\",\\"35.969\\",2,2,order,thad +\\"-wMtOW0BH63Xcmy4524Z\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Samir,Samir,\\"Samir Moran\\",\\"Samir Moran\\",MALE,34,Moran,Moran,\\"(empty)\\",Wednesday,2,\\"samir@moran-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,Elitelligence,Elitelligence,\\"Jun 25, 2019 @ 00:00:00.000\\",568014,\\"sold_product_568014_6401, sold_product_568014_19633\\",\\"sold_product_568014_6401, sold_product_568014_19633\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"10.078, 6.352\\",\\"20.984, 11.992\\",\\"6,401, 19,633\\",\\"Shirt - Blue Violety, Long sleeved top - white and red\\",\\"Shirt - Blue Violety, Long sleeved top - white and red\\",\\"1, 1\\",\\"ZO0523905239, ZO0556605566\\",\\"0, 0\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"0, 0\\",\\"ZO0523905239, ZO0556605566\\",\\"32.969\\",\\"32.969\\",2,2,order,samir +8wMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Riley\\",\\"Elyssa Riley\\",FEMALE,27,Riley,Riley,\\"(empty)\\",Wednesday,2,\\"elyssa@riley-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 25, 2019 @ 00:00:00.000\\",568702,\\"sold_product_568702_18286, sold_product_568702_14025\\",\\"sold_product_568702_18286, sold_product_568702_14025\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"16.5, 11.5\\",\\"33, 24.984\\",\\"18,286, 14,025\\",\\"Ankle boots - black, Blazer - black\\",\\"Ankle boots - black, Blazer - black\\",\\"1, 1\\",\\"ZO0142801428, ZO0182801828\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0142801428, ZO0182801828\\",\\"57.969\\",\\"57.969\\",2,2,order,elyssa +HwMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Diane,Diane,\\"Diane Lloyd\\",\\"Diane Lloyd\\",FEMALE,22,Lloyd,Lloyd,\\"(empty)\\",Wednesday,2,\\"diane@lloyd-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568128,\\"sold_product_568128_11766, sold_product_568128_22927\\",\\"sold_product_568128_11766, sold_product_568128_22927\\",\\"24.984, 34\\",\\"24.984, 34\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"12.992, 17.672\\",\\"24.984, 34\\",\\"11,766, 22,927\\",\\"Tote bag - berry, Lace-ups - black\\",\\"Tote bag - berry, Lace-ups - black\\",\\"1, 1\\",\\"ZO0087500875, ZO0007100071\\",\\"0, 0\\",\\"24.984, 34\\",\\"24.984, 34\\",\\"0, 0\\",\\"ZO0087500875, ZO0007100071\\",\\"58.969\\",\\"58.969\\",2,2,order,diane +IAMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Fleming\\",\\"Jackson Fleming\\",MALE,13,Fleming,Fleming,\\"(empty)\\",Wednesday,2,\\"jackson@fleming-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568177,\\"sold_product_568177_15382, sold_product_568177_18515\\",\\"sold_product_568177_15382, sold_product_568177_18515\\",\\"37, 65\\",\\"37, 65\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"19.594, 31.844\\",\\"37, 65\\",\\"15,382, 18,515\\",\\"Tracksuit top - mottled grey, Lace-up boots - tan\\",\\"Tracksuit top - mottled grey, Lace-up boots - tan\\",\\"1, 1\\",\\"ZO0584505845, ZO0403804038\\",\\"0, 0\\",\\"37, 65\\",\\"37, 65\\",\\"0, 0\\",\\"ZO0584505845, ZO0403804038\\",102,102,2,2,order,jackson +cwMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Franklin\\",\\"rania Franklin\\",FEMALE,24,Franklin,Franklin,\\"(empty)\\",Wednesday,2,\\"rania@franklin-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569178,\\"sold_product_569178_15398, sold_product_569178_23456\\",\\"sold_product_569178_15398, sold_product_569178_23456\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"15.359, 25.484\\",\\"28.984, 50\\",\\"15,398, 23,456\\",\\"Jumper - offwhite, Maxi dress - black/white\\",\\"Jumper - offwhite, Maxi dress - black/white\\",\\"1, 1\\",\\"ZO0177001770, ZO0260502605\\",\\"0, 0\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"0, 0\\",\\"ZO0177001770, ZO0260502605\\",79,79,2,2,order,rani +dAMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Griffin\\",\\"Sonya Griffin\\",FEMALE,28,Griffin,Griffin,\\"(empty)\\",Wednesday,2,\\"sonya@griffin-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568877,\\"sold_product_568877_19521, sold_product_568877_19378\\",\\"sold_product_568877_19521, sold_product_568877_19378\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"11.5, 13.492\\",\\"24.984, 24.984\\",\\"19,521, 19,378\\",\\"Classic heels - cognac, Long sleeved top - winternude\\",\\"Classic heels - cognac, Long sleeved top - winternude\\",\\"1, 1\\",\\"ZO0132401324, ZO0058200582\\",\\"0, 0\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"0, 0\\",\\"ZO0132401324, ZO0058200582\\",\\"49.969\\",\\"49.969\\",2,2,order,sonya +dQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Little\\",\\"Abdulraheem Al Little\\",MALE,33,Little,Little,\\"(empty)\\",Wednesday,2,\\"abdulraheem al@little-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Elitelligence,Elitelligence,\\"Jun 25, 2019 @ 00:00:00.000\\",568898,\\"sold_product_568898_11865, sold_product_568898_21764\\",\\"sold_product_568898_11865, sold_product_568898_21764\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"25.984, 15.359\\",\\"50, 28.984\\",\\"11,865, 21,764\\",\\"Down jacket - gru00fcn, Trainers - black\\",\\"Down jacket - gru00fcn, Trainers - black\\",\\"1, 1\\",\\"ZO0542205422, ZO0517805178\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0542205422, ZO0517805178\\",79,79,2,2,order,abdulraheem +dgMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Selena,Selena,\\"Selena Padilla\\",\\"Selena Padilla\\",FEMALE,42,Padilla,Padilla,\\"(empty)\\",Wednesday,2,\\"selena@padilla-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568941,\\"sold_product_568941_14120, sold_product_568941_8820\\",\\"sold_product_568941_14120, sold_product_568941_8820\\",\\"11.992, 28.984\\",\\"11.992, 28.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"5.641, 13.344\\",\\"11.992, 28.984\\",\\"14,120, 8,820\\",\\"3 PACK - Belt - black/red/gunmetal, Jumper - peacoat/light blue\\",\\"3 PACK - Belt - black/red/gunmetal, Jumper - peacoat/light blue\\",\\"1, 1\\",\\"ZO0076600766, ZO0068800688\\",\\"0, 0\\",\\"11.992, 28.984\\",\\"11.992, 28.984\\",\\"0, 0\\",\\"ZO0076600766, ZO0068800688\\",\\"40.969\\",\\"40.969\\",2,2,order,selena +dwMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Ramsey\\",\\"Brigitte Ramsey\\",FEMALE,12,Ramsey,Ramsey,\\"(empty)\\",Wednesday,2,\\"brigitte@ramsey-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569027,\\"sold_product_569027_15733, sold_product_569027_20410\\",\\"sold_product_569027_15733, sold_product_569027_20410\\",\\"75, 18.984\\",\\"75, 18.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"36, 9.492\\",\\"75, 18.984\\",\\"15,733, 20,410\\",\\"Boots - tan, Long sleeved top - black\\",\\"Boots - tan, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0245402454, ZO0060100601\\",\\"0, 0\\",\\"75, 18.984\\",\\"75, 18.984\\",\\"0, 0\\",\\"ZO0245402454, ZO0060100601\\",94,94,2,2,order,brigitte +eAMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Morgan\\",\\"Sonya Morgan\\",FEMALE,28,Morgan,Morgan,\\"(empty)\\",Wednesday,2,\\"sonya@morgan-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569055,\\"sold_product_569055_12453, sold_product_569055_13828\\",\\"sold_product_569055_12453, sold_product_569055_13828\\",\\"60, 33\\",\\"60, 33\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"31.797, 15.18\\",\\"60, 33\\",\\"12,453, 13,828\\",\\"Ankle boots - Midnight Blue, Jumper - white/black\\",\\"Ankle boots - Midnight Blue, Jumper - white/black\\",\\"1, 1\\",\\"ZO0375903759, ZO0269402694\\",\\"0, 0\\",\\"60, 33\\",\\"60, 33\\",\\"0, 0\\",\\"ZO0375903759, ZO0269402694\\",93,93,2,2,order,sonya +eQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Hubbard\\",\\"Pia Hubbard\\",FEMALE,45,Hubbard,Hubbard,\\"(empty)\\",Wednesday,2,\\"pia@hubbard-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Gnomehouse, Champion Arts\\",\\"Gnomehouse, Champion Arts\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569107,\\"sold_product_569107_24376, sold_product_569107_8430\\",\\"sold_product_569107_24376, sold_product_569107_8430\\",\\"60, 60\\",\\"60, 60\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Champion Arts\\",\\"Gnomehouse, Champion Arts\\",\\"27, 30.594\\",\\"60, 60\\",\\"24,376, 8,430\\",\\"Fun and Flowery Dress, Winter coat - red\\",\\"Fun and Flowery Dress, Winter coat - red\\",\\"1, 1\\",\\"ZO0339603396, ZO0504705047\\",\\"0, 0\\",\\"60, 60\\",\\"60, 60\\",\\"0, 0\\",\\"ZO0339603396, ZO0504705047\\",120,120,2,2,order,pia +iQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Tariq,Tariq,\\"Tariq Clayton\\",\\"Tariq Clayton\\",MALE,25,Clayton,Clayton,\\"(empty)\\",Wednesday,2,\\"tariq@clayton-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Oceanavigations, Low Tide Media\\",\\"Elitelligence, Oceanavigations, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",714385,\\"sold_product_714385_13039, sold_product_714385_16435, sold_product_714385_15502, sold_product_714385_6719\\",\\"sold_product_714385_13039, sold_product_714385_16435, sold_product_714385_15502, sold_product_714385_6719\\",\\"24.984, 21.984, 33, 28.984\\",\\"24.984, 21.984, 33, 28.984\\",\\"Men's Clothing, Men's Accessories, Men's Accessories, Men's Clothing\\",\\"Men's Clothing, Men's Accessories, Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Elitelligence, Oceanavigations, Low Tide Media\\",\\"Elitelligence, Elitelligence, Oceanavigations, Low Tide Media\\",\\"12.492, 12.094, 15.844, 15.359\\",\\"24.984, 21.984, 33, 28.984\\",\\"13,039, 16,435, 15,502, 6,719\\",\\"Sweatshirt - dark blue, Across body bag - dark grey, Watch - black, Trousers - dark blue\\",\\"Sweatshirt - dark blue, Across body bag - dark grey, Watch - black, Trousers - dark blue\\",\\"1, 1, 1, 1\\",\\"ZO0586805868, ZO0609106091, ZO0310903109, ZO0420104201\\",\\"0, 0, 0, 0\\",\\"24.984, 21.984, 33, 28.984\\",\\"24.984, 21.984, 33, 28.984\\",\\"0, 0, 0, 0\\",\\"ZO0586805868, ZO0609106091, ZO0310903109, ZO0420104201\\",\\"108.938\\",\\"108.938\\",4,4,order,tariq +hQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Mcdonald\\",\\"Abd Mcdonald\\",MALE,52,Mcdonald,Mcdonald,\\"(empty)\\",Wednesday,2,\\"abd@mcdonald-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Low Tide Media, Elitelligence\\",\\"Oceanavigations, Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",723213,\\"sold_product_723213_6457, sold_product_723213_19528, sold_product_723213_12063, sold_product_723213_14510\\",\\"sold_product_723213_6457, sold_product_723213_19528, sold_product_723213_12063, sold_product_723213_14510\\",\\"28.984, 20.984, 20.984, 33\\",\\"28.984, 20.984, 20.984, 33\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, Low Tide Media, Elitelligence, Oceanavigations\\",\\"Oceanavigations, Low Tide Media, Elitelligence, Oceanavigations\\",\\"15.359, 11.117, 9.867, 15.18\\",\\"28.984, 20.984, 20.984, 33\\",\\"6,457, 19,528, 12,063, 14,510\\",\\"Jumper - offwhite, Sweatshirt - navy, Cardigan - offwhite multicolor, Shirt - grey multicolor\\",\\"Jumper - offwhite, Sweatshirt - navy, Cardigan - offwhite multicolor, Shirt - grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0297802978, ZO0456704567, ZO0572105721, ZO0280502805\\",\\"0, 0, 0, 0\\",\\"28.984, 20.984, 20.984, 33\\",\\"28.984, 20.984, 20.984, 33\\",\\"0, 0, 0, 0\\",\\"ZO0297802978, ZO0456704567, ZO0572105721, ZO0280502805\\",\\"103.938\\",\\"103.938\\",4,4,order,abd +zQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Thad,Thad,\\"Thad Carr\\",\\"Thad Carr\\",MALE,30,Carr,Carr,\\"(empty)\\",Wednesday,2,\\"thad@carr-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568325,\\"sold_product_568325_11553, sold_product_568325_17851\\",\\"sold_product_568325_11553, sold_product_568325_17851\\",\\"140, 50\\",\\"140, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"72.813, 25.984\\",\\"140, 50\\",\\"11,553, 17,851\\",\\"Leather jacket - camel, Casual lace-ups - dark blue\\",\\"Leather jacket - camel, Casual lace-ups - dark blue\\",\\"1, 1\\",\\"ZO0288202882, ZO0391803918\\",\\"0, 0\\",\\"140, 50\\",\\"140, 50\\",\\"0, 0\\",\\"ZO0288202882, ZO0391803918\\",190,190,2,2,order,thad +zgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Cook\\",\\"Wagdi Cook\\",MALE,15,Cook,Cook,\\"(empty)\\",Wednesday,2,\\"wagdi@cook-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568360,\\"sold_product_568360_13315, sold_product_568360_18355\\",\\"sold_product_568360_13315, sold_product_568360_18355\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"5.398, 32.5\\",\\"11.992, 65\\",\\"13,315, 18,355\\",\\"5 PACK - Socks - blue/red/grey/green/black, Suit jacket - offwhite\\",\\"5 PACK - Socks - blue/red/grey/green/black, Suit jacket - offwhite\\",\\"1, 1\\",\\"ZO0480304803, ZO0274402744\\",\\"0, 0\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"0, 0\\",\\"ZO0480304803, ZO0274402744\\",77,77,2,2,order,wagdi +EAMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Meyer\\",\\"Brigitte Meyer\\",FEMALE,12,Meyer,Meyer,\\"(empty)\\",Wednesday,2,\\"brigitte@meyer-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",569278,\\"sold_product_569278_7811, sold_product_569278_19226\\",\\"sold_product_569278_7811, sold_product_569278_19226\\",\\"100, 18.984\\",\\"100, 18.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"48, 9.68\\",\\"100, 18.984\\",\\"7,811, 19,226\\",\\"Short coat - dark blue multicolor, Print T-shirt - black\\",\\"Short coat - dark blue multicolor, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0271802718, ZO0057100571\\",\\"0, 0\\",\\"100, 18.984\\",\\"100, 18.984\\",\\"0, 0\\",\\"ZO0271802718, ZO0057100571\\",119,119,2,2,order,brigitte +UgMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Underwood\\",\\"Gwen Underwood\\",FEMALE,26,Underwood,Underwood,\\"(empty)\\",Wednesday,2,\\"gwen@underwood-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Pyramidustries, Microlutions\\",\\"Pyramidustries, Microlutions\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568816,\\"sold_product_568816_24602, sold_product_568816_21413\\",\\"sold_product_568816_24602, sold_product_568816_21413\\",\\"21.984, 37\\",\\"21.984, 37\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Microlutions\\",\\"Pyramidustries, Microlutions\\",\\"12.094, 18.5\\",\\"21.984, 37\\",\\"24,602, 21,413\\",\\"Trousers - black, Jersey dress - black\\",\\"Trousers - black, Jersey dress - black\\",\\"1, 1\\",\\"ZO0146601466, ZO0108601086\\",\\"0, 0\\",\\"21.984, 37\\",\\"21.984, 37\\",\\"0, 0\\",\\"ZO0146601466, ZO0108601086\\",\\"58.969\\",\\"58.969\\",2,2,order,gwen +UwMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",EUR,Yuri,Yuri,\\"Yuri Carr\\",\\"Yuri Carr\\",MALE,21,Carr,Carr,\\"(empty)\\",Wednesday,2,\\"yuri@carr-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568375,\\"sold_product_568375_11121, sold_product_568375_14185\\",\\"sold_product_568375_11121, sold_product_568375_14185\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"30.547, 11.75\\",\\"65, 24.984\\",\\"11,121, 14,185\\",\\"Winter jacket - black, Rucksack - washed black/black\\",\\"Winter jacket - black, Rucksack - washed black/black\\",\\"1, 1\\",\\"ZO0623606236, ZO0605306053\\",\\"0, 0\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"0, 0\\",\\"ZO0623606236, ZO0605306053\\",90,90,2,2,order,yuri +VAMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Taylor\\",\\"Eddie Taylor\\",MALE,38,Taylor,Taylor,\\"(empty)\\",Wednesday,2,\\"eddie@taylor-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568559,\\"sold_product_568559_17305, sold_product_568559_15031\\",\\"sold_product_568559_17305, sold_product_568559_15031\\",\\"11.992, 33\\",\\"11.992, 33\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"6.109, 16.813\\",\\"11.992, 33\\",\\"17,305, 15,031\\",\\"Belt - black, Wool - black\\",\\"Belt - black, Wool - black\\",\\"1, 1\\",\\"ZO0599005990, ZO0626506265\\",\\"0, 0\\",\\"11.992, 33\\",\\"11.992, 33\\",\\"0, 0\\",\\"ZO0599005990, ZO0626506265\\",\\"44.969\\",\\"44.969\\",2,2,order,eddie +VQMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Pia,Pia,\\"Pia Valdez\\",\\"Pia Valdez\\",FEMALE,45,Valdez,Valdez,\\"(empty)\\",Wednesday,2,\\"pia@valdez-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568611,\\"sold_product_568611_12564, sold_product_568611_12268\\",\\"sold_product_568611_12564, sold_product_568611_12268\\",\\"38, 42\\",\\"38, 42\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"17.484, 19.734\\",\\"38, 42\\",\\"12,564, 12,268\\",\\"Short coat - black, Tote bag - light brown\\",\\"Short coat - black, Tote bag - light brown\\",\\"1, 1\\",\\"ZO0174701747, ZO0305103051\\",\\"0, 0\\",\\"38, 42\\",\\"38, 42\\",\\"0, 0\\",\\"ZO0174701747, ZO0305103051\\",80,80,2,2,order,pia +VgMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jason,Jason,\\"Jason Hodges\\",\\"Jason Hodges\\",MALE,16,Hodges,Hodges,\\"(empty)\\",Wednesday,2,\\"jason@hodges-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568638,\\"sold_product_568638_18188, sold_product_568638_6975\\",\\"sold_product_568638_18188, sold_product_568638_6975\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"17.484, 8.742\\",\\"33, 18.984\\",\\"18,188, 6,975\\",\\"Smart lace-ups - cognac, Pyjama bottoms - green\\",\\"Smart lace-ups - cognac, Pyjama bottoms - green\\",\\"1, 1\\",\\"ZO0388003880, ZO0478304783\\",\\"0, 0\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"0, 0\\",\\"ZO0388003880, ZO0478304783\\",\\"51.969\\",\\"51.969\\",2,2,order,jason +VwMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Mary,Mary,\\"Mary Hampton\\",\\"Mary Hampton\\",FEMALE,20,Hampton,Hampton,\\"(empty)\\",Wednesday,2,\\"mary@hampton-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Gnomehouse\\",\\"Angeldale, Gnomehouse\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568706,\\"sold_product_568706_15826, sold_product_568706_11255\\",\\"sold_product_568706_15826, sold_product_568706_11255\\",\\"110, 50\\",\\"110, 50\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Gnomehouse\\",\\"Angeldale, Gnomehouse\\",\\"55, 25.984\\",\\"110, 50\\",\\"15,826, 11,255\\",\\"Over-the-knee boots - black, Jersey dress - dark navy and white\\",\\"Over-the-knee boots - black, Jersey dress - dark navy and white\\",\\"1, 1\\",\\"ZO0672206722, ZO0331903319\\",\\"0, 0\\",\\"110, 50\\",\\"110, 50\\",\\"0, 0\\",\\"ZO0672206722, ZO0331903319\\",160,160,2,2,order,mary +mgMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories, Men's Clothing\\",\\"Men's Shoes, Men's Accessories, Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Banks\\",\\"Tariq Banks\\",MALE,25,Banks,Banks,\\"(empty)\\",Wednesday,2,\\"tariq@banks-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, (empty), Low Tide Media\\",\\"Elitelligence, (empty), Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",716889,\\"sold_product_716889_21293, sold_product_716889_12288, sold_product_716889_22189, sold_product_716889_19058\\",\\"sold_product_716889_21293, sold_product_716889_12288, sold_product_716889_22189, sold_product_716889_19058\\",\\"24.984, 155, 10.992, 16.984\\",\\"24.984, 155, 10.992, 16.984\\",\\"Men's Shoes, Men's Shoes, Men's Accessories, Men's Clothing\\",\\"Men's Shoes, Men's Shoes, Men's Accessories, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, (empty), Elitelligence, Low Tide Media\\",\\"Elitelligence, (empty), Elitelligence, Low Tide Media\\",\\"12.742, 71.313, 5.82, 7.648\\",\\"24.984, 155, 10.992, 16.984\\",\\"21,293, 12,288, 22,189, 19,058\\",\\"Trainers - white, Smart slip-ons - brown, Wallet - black, Jumper - dark grey multicolor\\",\\"Trainers - white, Smart slip-ons - brown, Wallet - black, Jumper - dark grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0510505105, ZO0482404824, ZO0602306023, ZO0445904459\\",\\"0, 0, 0, 0\\",\\"24.984, 155, 10.992, 16.984\\",\\"24.984, 155, 10.992, 16.984\\",\\"0, 0, 0, 0\\",\\"ZO0510505105, ZO0482404824, ZO0602306023, ZO0445904459\\",208,208,4,4,order,tariq +1wMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Butler\\",\\"Rabbia Al Butler\\",FEMALE,5,Butler,Butler,\\"(empty)\\",Wednesday,2,\\"rabbia al@butler-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Pyramidustries, Champion Arts, Tigress Enterprises\\",\\"Pyramidustries, Champion Arts, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",728580,\\"sold_product_728580_12102, sold_product_728580_24113, sold_product_728580_22614, sold_product_728580_19229\\",\\"sold_product_728580_12102, sold_product_728580_24113, sold_product_728580_22614, sold_product_728580_19229\\",\\"10.992, 33, 28.984, 16.984\\",\\"10.992, 33, 28.984, 16.984\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Champion Arts, Tigress Enterprises, Tigress Enterprises\\",\\"Pyramidustries, Champion Arts, Tigress Enterprises, Tigress Enterprises\\",\\"5.059, 15.508, 13.633, 7.988\\",\\"10.992, 33, 28.984, 16.984\\",\\"12,102, 24,113, 22,614, 19,229\\",\\"Vest - white, Cardigan - dark blue/off-white, Cardigan - black, Clutch - black\\",\\"Vest - white, Cardigan - dark blue/off-white, Cardigan - black, Clutch - black\\",\\"1, 1, 1, 1\\",\\"ZO0156601566, ZO0498004980, ZO0070700707, ZO0086700867\\",\\"0, 0, 0, 0\\",\\"10.992, 33, 28.984, 16.984\\",\\"10.992, 33, 28.984, 16.984\\",\\"0, 0, 0, 0\\",\\"ZO0156601566, ZO0498004980, ZO0070700707, ZO0086700867\\",\\"89.938\\",\\"89.938\\",4,4,order,rabbia +3wMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane King\\",\\"Diane King\\",FEMALE,22,King,King,\\"(empty)\\",Wednesday,2,\\"diane@king-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568762,\\"sold_product_568762_22428, sold_product_568762_9391\\",\\"sold_product_568762_22428, sold_product_568762_9391\\",\\"37, 33\\",\\"37, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"17.391, 17.484\\",\\"37, 33\\",\\"22,428, 9,391\\",\\"Jersey dress - royal blue, Shirt - white\\",\\"Jersey dress - royal blue, Shirt - white\\",\\"1, 1\\",\\"ZO0052200522, ZO0265602656\\",\\"0, 0\\",\\"37, 33\\",\\"37, 33\\",\\"0, 0\\",\\"ZO0052200522, ZO0265602656\\",70,70,2,2,order,diane +6QMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Graves\\",\\"Abigail Graves\\",FEMALE,46,Graves,Graves,\\"(empty)\\",Wednesday,2,\\"abigail@graves-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568571,\\"sold_product_568571_23698, sold_product_568571_23882\\",\\"sold_product_568571_23698, sold_product_568571_23882\\",\\"33, 33\\",\\"33, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"17.156, 16.813\\",\\"33, 33\\",\\"23,698, 23,882\\",\\"Pleated skirt - black, Long sleeved top - chinese red\\",\\"Pleated skirt - black, Long sleeved top - chinese red\\",\\"1, 1\\",\\"ZO0034100341, ZO0343103431\\",\\"0, 0\\",\\"33, 33\\",\\"33, 33\\",\\"0, 0\\",\\"ZO0034100341, ZO0343103431\\",66,66,2,2,order,abigail +6gMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane Hale\\",\\"Diane Hale\\",FEMALE,22,Hale,Hale,\\"(empty)\\",Wednesday,2,\\"diane@hale-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Spherecords, Pyramidustries active\\",\\"Spherecords, Pyramidustries active\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568671,\\"sold_product_568671_18674, sold_product_568671_9937\\",\\"sold_product_568671_18674, sold_product_568671_9937\\",\\"5.988, 11.992\\",\\"5.988, 11.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries active\\",\\"Spherecords, Pyramidustries active\\",\\"2.76, 6.352\\",\\"5.988, 11.992\\",\\"18,674, 9,937\\",\\"Vest - white, Sports shirt - black \\",\\"Vest - white, Sports shirt - black \\",\\"1, 1\\",\\"ZO0637406374, ZO0219002190\\",\\"0, 0\\",\\"5.988, 11.992\\",\\"5.988, 11.992\\",\\"0, 0\\",\\"ZO0637406374, ZO0219002190\\",\\"17.984\\",\\"17.984\\",2,2,order,diane +9AMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Summers\\",\\"Elyssa Summers\\",FEMALE,27,Summers,Summers,\\"(empty)\\",Wednesday,2,\\"elyssa@summers-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568774,\\"sold_product_568774_24937, sold_product_568774_24748\\",\\"sold_product_568774_24937, sold_product_568774_24748\\",\\"34, 60\\",\\"34, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"17, 33\\",\\"34, 60\\",\\"24,937, 24,748\\",\\"Jersey dress - dark green, Lace-ups - bianco\\",\\"Jersey dress - dark green, Lace-ups - bianco\\",\\"1, 1\\",\\"ZO0037200372, ZO0369303693\\",\\"0, 0\\",\\"34, 60\\",\\"34, 60\\",\\"0, 0\\",\\"ZO0037200372, ZO0369303693\\",94,94,2,2,order,elyssa +9QMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Summers\\",\\"Jackson Summers\\",MALE,13,Summers,Summers,\\"(empty)\\",Wednesday,2,\\"jackson@summers-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568319,\\"sold_product_568319_16715, sold_product_568319_24934\\",\\"sold_product_568319_16715, sold_product_568319_24934\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"14.492, 22.5\\",\\"28.984, 50\\",\\"16,715, 24,934\\",\\"Slim fit jeans - black, Lace-up boots - resin coffee\\",\\"Slim fit jeans - black, Lace-up boots - resin coffee\\",\\"1, 1\\",\\"ZO0535105351, ZO0403504035\\",\\"0, 0\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"0, 0\\",\\"ZO0535105351, ZO0403504035\\",79,79,2,2,order,jackson +9gMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Gregory\\",\\"Sultan Al Gregory\\",MALE,19,Gregory,Gregory,\\"(empty)\\",Wednesday,2,\\"sultan al@gregory-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568363,\\"sold_product_568363_19188, sold_product_568363_14507\\",\\"sold_product_568363_19188, sold_product_568363_14507\\",\\"20.984, 115\\",\\"20.984, 115\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"9.453, 59.781\\",\\"20.984, 115\\",\\"19,188, 14,507\\",\\"Swimming shorts - dark grey , Weekend bag - black\\",\\"Swimming shorts - dark grey , Weekend bag - black\\",\\"1, 1\\",\\"ZO0629806298, ZO0467104671\\",\\"0, 0\\",\\"20.984, 115\\",\\"20.984, 115\\",\\"0, 0\\",\\"ZO0629806298, ZO0467104671\\",136,136,2,2,order,sultan +9wMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Garner\\",\\"Thad Garner\\",MALE,30,Garner,Garner,\\"(empty)\\",Wednesday,2,\\"thad@garner-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568541,\\"sold_product_568541_14083, sold_product_568541_11234\\",\\"sold_product_568541_14083, sold_product_568541_11234\\",\\"75, 42\\",\\"75, 42\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"35.25, 21.828\\",\\"75, 42\\",\\"14,083, 11,234\\",\\"Light jacket - dark blue, Tracksuit top - black\\",\\"Light jacket - dark blue, Tracksuit top - black\\",\\"1, 1\\",\\"ZO0428904289, ZO0588205882\\",\\"0, 0\\",\\"75, 42\\",\\"75, 42\\",\\"0, 0\\",\\"ZO0428904289, ZO0588205882\\",117,117,2,2,order,thad +\\"-AMtOW0BH63Xcmy46HLV\\",ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Selena,Selena,\\"Selena Simmons\\",\\"Selena Simmons\\",FEMALE,42,Simmons,Simmons,\\"(empty)\\",Wednesday,2,\\"selena@simmons-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568586,\\"sold_product_568586_14747, sold_product_568586_15677\\",\\"sold_product_568586_14747, sold_product_568586_15677\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"16.5, 8.742\\",\\"33, 18.984\\",\\"14,747, 15,677\\",\\"Blouse - pomegranate, Across body bag - black\\",\\"Blouse - pomegranate, Across body bag - black\\",\\"1, 1\\",\\"ZO0232202322, ZO0208402084\\",\\"0, 0\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"0, 0\\",\\"ZO0232202322, ZO0208402084\\",\\"51.969\\",\\"51.969\\",2,2,order,selena +\\"-QMtOW0BH63Xcmy46HLV\\",ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Carr\\",\\"Gwen Carr\\",FEMALE,26,Carr,Carr,\\"(empty)\\",Wednesday,2,\\"gwen@carr-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Champion Arts, (empty)\\",\\"Champion Arts, (empty)\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568636,\\"sold_product_568636_17497, sold_product_568636_11982\\",\\"sold_product_568636_17497, sold_product_568636_11982\\",\\"42, 50\\",\\"42, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, (empty)\\",\\"Champion Arts, (empty)\\",\\"23.094, 22.5\\",\\"42, 50\\",\\"17,497, 11,982\\",\\"Winter jacket - navy, Blazer - white\\",\\"Winter jacket - navy, Blazer - white\\",\\"1, 1\\",\\"ZO0503905039, ZO0631806318\\",\\"0, 0\\",\\"42, 50\\",\\"42, 50\\",\\"0, 0\\",\\"ZO0503905039, ZO0631806318\\",92,92,2,2,order,gwen +\\"-gMtOW0BH63Xcmy46HLV\\",ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Diane,Diane,\\"Diane Rice\\",\\"Diane Rice\\",FEMALE,22,Rice,Rice,\\"(empty)\\",Wednesday,2,\\"diane@rice-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 25, 2019 @ 00:00:00.000\\",568674,\\"sold_product_568674_16704, sold_product_568674_16971\\",\\"sold_product_568674_16704, sold_product_568674_16971\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 14, 2016 @ 00:00:00.000, Dec 14, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"5.711, 13.922\\",\\"10.992, 28.984\\",\\"16,704, 16,971\\",\\"Scarf - black/white, High heeled sandals - black\\",\\"Scarf - black/white, High heeled sandals - black\\",\\"1, 1\\",\\"ZO0192301923, ZO0011400114\\",\\"0, 0\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"0, 0\\",\\"ZO0192301923, ZO0011400114\\",\\"39.969\\",\\"39.969\\",2,2,order,diane +NwMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Lambert\\",\\"Mostafa Lambert\\",MALE,9,Lambert,Lambert,\\"(empty)\\",Tuesday,1,\\"mostafa@lambert-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567868,\\"sold_product_567868_15827, sold_product_567868_6221\\",\\"sold_product_567868_15827, sold_product_567868_6221\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"9.867, 15.07\\",\\"20.984, 28.984\\",\\"15,827, 6,221\\",\\"Belt - black/brown, Shirt - dark blue\\",\\"Belt - black/brown, Shirt - dark blue\\",\\"1, 1\\",\\"ZO0310403104, ZO0416604166\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0310403104, ZO0416604166\\",\\"49.969\\",\\"49.969\\",2,2,order,mostafa +SgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Selena,Selena,\\"Selena Lewis\\",\\"Selena Lewis\\",FEMALE,42,Lewis,Lewis,\\"(empty)\\",Tuesday,1,\\"selena@lewis-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567446,\\"sold_product_567446_12751, sold_product_567446_12494\\",\\"sold_product_567446_12751, sold_product_567446_12494\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"31.844, 11.25\\",\\"65, 24.984\\",\\"12,751, 12,494\\",\\"Lace-ups - black, Classic heels - cognac/beige\\",\\"Lace-ups - black, Classic heels - cognac/beige\\",\\"1, 1\\",\\"ZO0322803228, ZO0002700027\\",\\"0, 0\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"0, 0\\",\\"ZO0322803228, ZO0002700027\\",90,90,2,2,order,selena +bwMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Oliver,Oliver,\\"Oliver Martin\\",\\"Oliver Martin\\",MALE,7,Martin,Martin,\\"(empty)\\",Tuesday,1,\\"oliver@martin-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567340,\\"sold_product_567340_3840, sold_product_567340_14835\\",\\"sold_product_567340_3840, sold_product_567340_14835\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"7.82, 21.406\\",\\"16.984, 42\\",\\"3,840, 14,835\\",\\"Sports shirt - dark grey multicolor, High-top trainers - grey\\",\\"Sports shirt - dark grey multicolor, High-top trainers - grey\\",\\"1, 1\\",\\"ZO0615606156, ZO0514905149\\",\\"0, 0\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"0, 0\\",\\"ZO0615606156, ZO0514905149\\",\\"58.969\\",\\"58.969\\",2,2,order,oliver +5AMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Kamal,Kamal,\\"Kamal Salazar\\",\\"Kamal Salazar\\",MALE,39,Salazar,Salazar,\\"(empty)\\",Tuesday,1,\\"kamal@salazar-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Spherecords, Spritechnologies\\",\\"Spherecords, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567736,\\"sold_product_567736_24718, sold_product_567736_24306\\",\\"sold_product_567736_24718, sold_product_567736_24306\\",\\"11.992, 75\\",\\"11.992, 75\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Spritechnologies\\",\\"Spherecords, Spritechnologies\\",\\"6.109, 36.75\\",\\"11.992, 75\\",\\"24,718, 24,306\\",\\"Pyjama bottoms - light grey multicolor, Waterproof trousers - scarlet\\",\\"Pyjama bottoms - light grey multicolor, Waterproof trousers - scarlet\\",\\"1, 1\\",\\"ZO0663706637, ZO0620906209\\",\\"0, 0\\",\\"11.992, 75\\",\\"11.992, 75\\",\\"0, 0\\",\\"ZO0663706637, ZO0620906209\\",87,87,2,2,order,kamal +EQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Kamal,Kamal,\\"Kamal Fleming\\",\\"Kamal Fleming\\",MALE,39,Fleming,Fleming,\\"(empty)\\",Tuesday,1,\\"kamal@fleming-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567755,\\"sold_product_567755_16941, sold_product_567755_1820\\",\\"sold_product_567755_16941, sold_product_567755_1820\\",\\"16.984, 75\\",\\"16.984, 75\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"8.492, 36.75\\",\\"16.984, 75\\",\\"16,941, 1,820\\",\\"Vibrant Pattern Polo, Smart slip-ons - oro\\",\\"Vibrant Pattern Polo, Smart slip-ons - oro\\",\\"1, 1\\",\\"ZO0571405714, ZO0255402554\\",\\"0, 0\\",\\"16.984, 75\\",\\"16.984, 75\\",\\"0, 0\\",\\"ZO0571405714, ZO0255402554\\",92,92,2,2,order,kamal +OQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Meyer\\",\\"Sultan Al Meyer\\",MALE,19,Meyer,Meyer,\\"(empty)\\",Tuesday,1,\\"sultan al@meyer-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Elitelligence, Microlutions\\",\\"Low Tide Media, Elitelligence, Microlutions\\",\\"Jun 24, 2019 @ 00:00:00.000\\",715455,\\"sold_product_715455_11902, sold_product_715455_19957, sold_product_715455_17361, sold_product_715455_12368\\",\\"sold_product_715455_11902, sold_product_715455_19957, sold_product_715455_17361, sold_product_715455_12368\\",\\"13.992, 7.988, 28.984, 33\\",\\"13.992, 7.988, 28.984, 33\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Elitelligence, Elitelligence, Microlutions\\",\\"Low Tide Media, Elitelligence, Elitelligence, Microlutions\\",\\"7.551, 4.07, 14.211, 17.156\\",\\"13.992, 7.988, 28.984, 33\\",\\"11,902, 19,957, 17,361, 12,368\\",\\"3 PACK - Shorts - black, 3 PACK - Socks - black/grey/orange, Sweatshirt - multicoloured, Shirt - dark green\\",\\"3 PACK - Shorts - black, 3 PACK - Socks - black/grey/orange, Sweatshirt - multicoloured, Shirt - dark green\\",\\"1, 1, 1, 1\\",\\"ZO0477504775, ZO0613206132, ZO0585405854, ZO0110701107\\",\\"0, 0, 0, 0\\",\\"13.992, 7.988, 28.984, 33\\",\\"13.992, 7.988, 28.984, 33\\",\\"0, 0, 0, 0\\",\\"ZO0477504775, ZO0613206132, ZO0585405854, ZO0110701107\\",\\"83.938\\",\\"83.938\\",4,4,order,sultan +ggMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Holland\\",\\"Clarice Holland\\",FEMALE,18,Holland,Holland,\\"(empty)\\",Tuesday,1,\\"clarice@holland-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566768,\\"sold_product_566768_12004, sold_product_566768_23314\\",\\"sold_product_566768_12004, sold_product_566768_23314\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"8.656, 25.984\\",\\"16.984, 50\\",\\"12,004, 23,314\\",\\"Zelda - Long sleeved top - black, A-line skirt - navy blazer\\",\\"Zelda - Long sleeved top - black, A-line skirt - navy blazer\\",\\"1, 1\\",\\"ZO0217702177, ZO0331703317\\",\\"0, 0\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"0, 0\\",\\"ZO0217702177, ZO0331703317\\",67,67,2,2,order,clarice +gwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Pia,Pia,\\"Pia Boone\\",\\"Pia Boone\\",FEMALE,45,Boone,Boone,\\"(empty)\\",Tuesday,1,\\"pia@boone-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",Oceanavigations,Oceanavigations,\\"Jun 24, 2019 @ 00:00:00.000\\",566812,\\"sold_product_566812_19012, sold_product_566812_5941\\",\\"sold_product_566812_19012, sold_product_566812_5941\\",\\"20.984, 85\\",\\"20.984, 85\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"9.453, 41.656\\",\\"20.984, 85\\",\\"19,012, 5,941\\",\\"Vest - black/rose, Boots - tan\\",\\"Vest - black/rose, Boots - tan\\",\\"1, 1\\",\\"ZO0266902669, ZO0244202442\\",\\"0, 0\\",\\"20.984, 85\\",\\"20.984, 85\\",\\"0, 0\\",\\"ZO0266902669, ZO0244202442\\",106,106,2,2,order,pia +jgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Mostafa,Mostafa,\\"Mostafa Underwood\\",\\"Mostafa Underwood\\",MALE,9,Underwood,Underwood,\\"(empty)\\",Tuesday,1,\\"mostafa@underwood-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566680,\\"sold_product_566680_15413, sold_product_566680_16394\\",\\"sold_product_566680_15413, sold_product_566680_16394\\",\\"33, 42\\",\\"33, 42\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"16.172, 20.156\\",\\"33, 42\\",\\"15,413, 16,394\\",\\"Laptop bag - brown, Lace-ups - black\\",\\"Laptop bag - brown, Lace-ups - black\\",\\"1, 1\\",\\"ZO0316703167, ZO0393303933\\",\\"0, 0\\",\\"33, 42\\",\\"33, 42\\",\\"0, 0\\",\\"ZO0316703167, ZO0393303933\\",75,75,2,2,order,mostafa +jwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Larson\\",\\"Yasmine Larson\\",FEMALE,43,Larson,Larson,\\"(empty)\\",Tuesday,1,\\"yasmine@larson-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566944,\\"sold_product_566944_13250, sold_product_566944_13079\\",\\"sold_product_566944_13250, sold_product_566944_13079\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"13.742, 8.828\\",\\"24.984, 16.984\\",\\"13,250, 13,079\\",\\"Jumper - black/white, Print T-shirt - black\\",\\"Jumper - black/white, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0497004970, ZO0054900549\\",\\"0, 0\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"0, 0\\",\\"ZO0497004970, ZO0054900549\\",\\"41.969\\",\\"41.969\\",2,2,order,yasmine +kAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Palmer\\",\\"Clarice Palmer\\",FEMALE,18,Palmer,Palmer,\\"(empty)\\",Tuesday,1,\\"clarice@palmer-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566979,\\"sold_product_566979_19260, sold_product_566979_21565\\",\\"sold_product_566979_19260, sold_product_566979_21565\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"17.156, 5.281\\",\\"33, 10.992\\",\\"19,260, 21,565\\",\\"Cardigan - grey, Print T-shirt - dark grey multicolor\\",\\"Cardigan - grey, Print T-shirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0071900719, ZO0493404934\\",\\"0, 0\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"0, 0\\",\\"ZO0071900719, ZO0493404934\\",\\"43.969\\",\\"43.969\\",2,2,order,clarice +kQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Duncan\\",\\"Fitzgerald Duncan\\",MALE,11,Duncan,Duncan,\\"(empty)\\",Tuesday,1,\\"fitzgerald@duncan-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566734,\\"sold_product_566734_17263, sold_product_566734_13452\\",\\"sold_product_566734_17263, sold_product_566734_13452\\",\\"75, 42\\",\\"75, 42\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"40.5, 20.578\\",\\"75, 42\\",\\"17,263, 13,452\\",\\"Lace-up boots - cognac, Weekend bag - black\\",\\"Lace-up boots - cognac, Weekend bag - black\\",\\"1, 1\\",\\"ZO0691006910, ZO0314203142\\",\\"0, 0\\",\\"75, 42\\",\\"75, 42\\",\\"0, 0\\",\\"ZO0691006910, ZO0314203142\\",117,117,2,2,order,fuzzy +kgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Howell\\",\\"Abdulraheem Al Howell\\",MALE,33,Howell,Howell,\\"(empty)\\",Tuesday,1,\\"abdulraheem al@howell-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567094,\\"sold_product_567094_12311, sold_product_567094_12182\\",\\"sold_product_567094_12311, sold_product_567094_12182\\",\\"16.984, 12.992\\",\\"16.984, 12.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"8.656, 7.141\\",\\"16.984, 12.992\\",\\"12,311, 12,182\\",\\"Polo shirt - white, Swimming shorts - black\\",\\"Polo shirt - white, Swimming shorts - black\\",\\"1, 1\\",\\"ZO0442904429, ZO0629706297\\",\\"0, 0\\",\\"16.984, 12.992\\",\\"16.984, 12.992\\",\\"0, 0\\",\\"ZO0442904429, ZO0629706297\\",\\"29.984\\",\\"29.984\\",2,2,order,abdulraheem +kwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie King\\",\\"Eddie King\\",MALE,38,King,King,\\"(empty)\\",Tuesday,1,\\"eddie@king-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",566892,\\"sold_product_566892_21978, sold_product_566892_14543\\",\\"sold_product_566892_21978, sold_product_566892_14543\\",\\"24.984, 17.984\\",\\"24.984, 17.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"12.492, 8.992\\",\\"24.984, 17.984\\",\\"21,978, 14,543\\",\\"Hoodie - dark blue, Jumper - black\\",\\"Hoodie - dark blue, Jumper - black\\",\\"1, 1\\",\\"ZO0589505895, ZO0575405754\\",\\"0, 0\\",\\"24.984, 17.984\\",\\"24.984, 17.984\\",\\"0, 0\\",\\"ZO0589505895, ZO0575405754\\",\\"42.969\\",\\"42.969\\",2,2,order,eddie +tQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Morgan\\",\\"Sultan Al Morgan\\",MALE,19,Morgan,Morgan,\\"(empty)\\",Tuesday,1,\\"sultan al@morgan-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567950,\\"sold_product_567950_24164, sold_product_567950_11096\\",\\"sold_product_567950_24164, sold_product_567950_11096\\",\\"110, 42\\",\\"110, 42\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"52.813, 20.156\\",\\"110, 42\\",\\"24,164, 11,096\\",\\"Suit - dark blue, Bomber Jacket - black\\",\\"Suit - dark blue, Bomber Jacket - black\\",\\"1, 1\\",\\"ZO0273002730, ZO0541105411\\",\\"0, 0\\",\\"110, 42\\",\\"110, 42\\",\\"0, 0\\",\\"ZO0273002730, ZO0541105411\\",152,152,2,2,order,sultan +uAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Rose\\",\\"Sultan Al Rose\\",MALE,19,Rose,Rose,\\"(empty)\\",Tuesday,1,\\"sultan al@rose-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",566826,\\"sold_product_566826_15908, sold_product_566826_13927\\",\\"sold_product_566826_15908, sold_product_566826_13927\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"9.172, 21.406\\",\\"16.984, 42\\",\\"15,908, 13,927\\",\\"Jumper - camel, Bomber Jacket - khaki\\",\\"Jumper - camel, Bomber Jacket - khaki\\",\\"1, 1\\",\\"ZO0575305753, ZO0540605406\\",\\"0, 0\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"0, 0\\",\\"ZO0575305753, ZO0540605406\\",\\"58.969\\",\\"58.969\\",2,2,order,sultan +fQMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Franklin\\",\\"Fitzgerald Franklin\\",MALE,11,Franklin,Franklin,\\"(empty)\\",Tuesday,1,\\"fitzgerald@franklin-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567240,\\"sold_product_567240_23744, sold_product_567240_2098\\",\\"sold_product_567240_23744, sold_product_567240_2098\\",\\"31.984, 80\\",\\"31.984, 80\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"15.68, 41.594\\",\\"31.984, 80\\",\\"23,744, 2,098\\",\\"Chinos - dark blue, Lace-up boots - black\\",\\"Chinos - dark blue, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0421004210, ZO0689006890\\",\\"0, 0\\",\\"31.984, 80\\",\\"31.984, 80\\",\\"0, 0\\",\\"ZO0421004210, ZO0689006890\\",112,112,2,2,order,fuzzy +fgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Byrd\\",\\"Mostafa Byrd\\",MALE,9,Byrd,Byrd,\\"(empty)\\",Tuesday,1,\\"mostafa@byrd-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567290,\\"sold_product_567290_24934, sold_product_567290_15288\\",\\"sold_product_567290_24934, sold_product_567290_15288\\",\\"50, 21.984\\",\\"50, 21.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"22.5, 11.211\\",\\"50, 21.984\\",\\"24,934, 15,288\\",\\"Lace-up boots - resin coffee, Polo shirt - grey\\",\\"Lace-up boots - resin coffee, Polo shirt - grey\\",\\"1, 1\\",\\"ZO0403504035, ZO0442704427\\",\\"0, 0\\",\\"50, 21.984\\",\\"50, 21.984\\",\\"0, 0\\",\\"ZO0403504035, ZO0442704427\\",72,72,2,2,order,mostafa +kAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,rania,rania,\\"rania Goodwin\\",\\"rania Goodwin\\",FEMALE,24,Goodwin,Goodwin,\\"(empty)\\",Tuesday,1,\\"rania@goodwin-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Pyramidustries,Pyramidustries,\\"Jun 24, 2019 @ 00:00:00.000\\",567669,\\"sold_product_567669_22893, sold_product_567669_17796\\",\\"sold_product_567669_22893, sold_product_567669_17796\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"8.156, 9.344\\",\\"16.984, 16.984\\",\\"22,893, 17,796\\",\\"A-line skirt - dark purple, Across body bag - black \\",\\"A-line skirt - dark purple, Across body bag - black \\",\\"1, 1\\",\\"ZO0148301483, ZO0202902029\\",\\"0, 0\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"0, 0\\",\\"ZO0148301483, ZO0202902029\\",\\"33.969\\",\\"33.969\\",2,2,order,rani +rgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Simpson\\",\\"Gwen Simpson\\",FEMALE,26,Simpson,Simpson,\\"(empty)\\",Tuesday,1,\\"gwen@simpson-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567365,\\"sold_product_567365_11663, sold_product_567365_24272\\",\\"sold_product_567365_11663, sold_product_567365_24272\\",\\"11.992, 37\\",\\"11.992, 37\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"5.879, 18.125\\",\\"11.992, 37\\",\\"11,663, 24,272\\",\\"Slip-ons - white, Shirt - white\\",\\"Slip-ons - white, Shirt - white\\",\\"1, 1\\",\\"ZO0008600086, ZO0266002660\\",\\"0, 0\\",\\"11.992, 37\\",\\"11.992, 37\\",\\"0, 0\\",\\"ZO0008600086, ZO0266002660\\",\\"48.969\\",\\"48.969\\",2,2,order,gwen +1AMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,George,George,\\"George Sanders\\",\\"George Sanders\\",MALE,32,Sanders,Sanders,\\"(empty)\\",Tuesday,1,\\"george@sanders-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",566845,\\"sold_product_566845_24161, sold_product_566845_13674\\",\\"sold_product_566845_24161, sold_product_566845_13674\\",\\"7.988, 24.984\\",\\"7.988, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"3.92, 12.25\\",\\"7.988, 24.984\\",\\"24,161, 13,674\\",\\"Basic T-shirt - white, Hoodie - black\\",\\"Basic T-shirt - white, Hoodie - black\\",\\"1, 1\\",\\"ZO0547905479, ZO0583305833\\",\\"0, 0\\",\\"7.988, 24.984\\",\\"7.988, 24.984\\",\\"0, 0\\",\\"ZO0547905479, ZO0583305833\\",\\"32.969\\",\\"32.969\\",2,2,order,george +1QMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jim,Jim,\\"Jim Fletcher\\",\\"Jim Fletcher\\",MALE,41,Fletcher,Fletcher,\\"(empty)\\",Tuesday,1,\\"jim@fletcher-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567048,\\"sold_product_567048_19089, sold_product_567048_20261\\",\\"sold_product_567048_19089, sold_product_567048_20261\\",\\"12.992, 11.992\\",\\"12.992, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"7.012, 5.52\\",\\"12.992, 11.992\\",\\"19,089, 20,261\\",\\"Vest - white/dark blue, Vest - black\\",\\"Vest - white/dark blue, Vest - black\\",\\"1, 1\\",\\"ZO0566905669, ZO0564005640\\",\\"0, 0\\",\\"12.992, 11.992\\",\\"12.992, 11.992\\",\\"0, 0\\",\\"ZO0566905669, ZO0564005640\\",\\"24.984\\",\\"24.984\\",2,2,order,jim +EQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Hudson\\",\\"Yasmine Hudson\\",FEMALE,43,Hudson,Hudson,\\"(empty)\\",Tuesday,1,\\"yasmine@hudson-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Pyramidustries active, Spherecords\\",\\"Pyramidustries active, Spherecords\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567281,\\"sold_product_567281_14758, sold_product_567281_23174\\",\\"sold_product_567281_14758, sold_product_567281_23174\\",\\"13.992, 22.984\\",\\"13.992, 22.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Spherecords\\",\\"Pyramidustries active, Spherecords\\",\\"7.27, 12.18\\",\\"13.992, 22.984\\",\\"14,758, 23,174\\",\\"Print T-shirt - black, Chinos - dark blue\\",\\"Print T-shirt - black, Chinos - dark blue\\",\\"1, 1\\",\\"ZO0221402214, ZO0632806328\\",\\"0, 0\\",\\"13.992, 22.984\\",\\"13.992, 22.984\\",\\"0, 0\\",\\"ZO0221402214, ZO0632806328\\",\\"36.969\\",\\"36.969\\",2,2,order,yasmine +FAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Chapman\\",\\"rania Chapman\\",FEMALE,24,Chapman,Chapman,\\"(empty)\\",Tuesday,1,\\"rania@chapman-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Spherecords Curvy, Gnomehouse\\",\\"Spherecords Curvy, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567119,\\"sold_product_567119_22695, sold_product_567119_23515\\",\\"sold_product_567119_22695, sold_product_567119_23515\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Curvy, Gnomehouse\\",\\"Spherecords Curvy, Gnomehouse\\",\\"7.82, 27.594\\",\\"16.984, 60\\",\\"22,695, 23,515\\",\\"Cardigan - grey multicolor/black, Blazer - black/white\\",\\"Cardigan - grey multicolor/black, Blazer - black/white\\",\\"1, 1\\",\\"ZO0711507115, ZO0350903509\\",\\"0, 0\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"0, 0\\",\\"ZO0711507115, ZO0350903509\\",77,77,2,2,order,rani +FQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Samir,Samir,\\"Samir Harper\\",\\"Samir Harper\\",MALE,34,Harper,Harper,\\"(empty)\\",Tuesday,1,\\"samir@harper-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567169,\\"sold_product_567169_20800, sold_product_567169_18749\\",\\"sold_product_567169_20800, sold_product_567169_18749\\",\\"10.992, 16.984\\",\\"10.992, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"5.602, 9.344\\",\\"10.992, 16.984\\",\\"20,800, 18,749\\",\\"Print T-shirt - white, Sports shorts - black\\",\\"Print T-shirt - white, Sports shorts - black\\",\\"1, 1\\",\\"ZO0558805588, ZO0622206222\\",\\"0, 0\\",\\"10.992, 16.984\\",\\"10.992, 16.984\\",\\"0, 0\\",\\"ZO0558805588, ZO0622206222\\",\\"27.984\\",\\"27.984\\",2,2,order,samir +KAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Underwood\\",\\"Abd Underwood\\",MALE,52,Underwood,Underwood,\\"(empty)\\",Tuesday,1,\\"abd@underwood-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567869,\\"sold_product_567869_14147, sold_product_567869_16719\\",\\"sold_product_567869_14147, sold_product_567869_16719\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"8.656, 8.328\\",\\"16.984, 16.984\\",\\"14,147, 16,719\\",\\"Print T-shirt - black/green, Polo shirt - blue multicolor\\",\\"Print T-shirt - black/green, Polo shirt - blue multicolor\\",\\"1, 1\\",\\"ZO0565105651, ZO0443804438\\",\\"0, 0\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"0, 0\\",\\"ZO0565105651, ZO0443804438\\",\\"33.969\\",\\"33.969\\",2,2,order,abd +KQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Strickland\\",\\"Muniz Strickland\\",MALE,37,Strickland,Strickland,\\"(empty)\\",Tuesday,1,\\"muniz@strickland-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567909,\\"sold_product_567909_24768, sold_product_567909_11414\\",\\"sold_product_567909_24768, sold_product_567909_11414\\",\\"24.984, 18.984\\",\\"24.984, 18.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"11.25, 8.93\\",\\"24.984, 18.984\\",\\"24,768, 11,414\\",\\"SET - Gloves - dark grey multicolor, Sweatshirt - light blue\\",\\"SET - Gloves - dark grey multicolor, Sweatshirt - light blue\\",\\"1, 1\\",\\"ZO0609606096, ZO0588905889\\",\\"0, 0\\",\\"24.984, 18.984\\",\\"24.984, 18.984\\",\\"0, 0\\",\\"ZO0609606096, ZO0588905889\\",\\"43.969\\",\\"43.969\\",2,2,order,muniz +eQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Betty,Betty,\\"Betty Stokes\\",\\"Betty Stokes\\",FEMALE,44,Stokes,Stokes,\\"(empty)\\",Tuesday,1,\\"betty@stokes-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567524,\\"sold_product_567524_14033, sold_product_567524_24564\\",\\"sold_product_567524_14033, sold_product_567524_24564\\",\\"20.984, 65\\",\\"20.984, 65\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"10.906, 35.094\\",\\"20.984, 65\\",\\"14,033, 24,564\\",\\"Clutch - black , Ankle boots - cognac\\",\\"Clutch - black , Ankle boots - cognac\\",\\"1, 1\\",\\"ZO0096300963, ZO0377403774\\",\\"0, 0\\",\\"20.984, 65\\",\\"20.984, 65\\",\\"0, 0\\",\\"ZO0096300963, ZO0377403774\\",86,86,2,2,order,betty +egMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Turner\\",\\"Elyssa Turner\\",FEMALE,27,Turner,Turner,\\"(empty)\\",Tuesday,1,\\"elyssa@turner-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567565,\\"sold_product_567565_4684, sold_product_567565_18489\\",\\"sold_product_567565_4684, sold_product_567565_18489\\",\\"50, 60\\",\\"50, 60\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"23.5, 33\\",\\"50, 60\\",\\"4,684, 18,489\\",\\"Boots - black, Slip-ons - Midnight Blue\\",\\"Boots - black, Slip-ons - Midnight Blue\\",\\"1, 1\\",\\"ZO0015600156, ZO0323603236\\",\\"0, 0\\",\\"50, 60\\",\\"50, 60\\",\\"0, 0\\",\\"ZO0015600156, ZO0323603236\\",110,110,2,2,order,elyssa +nQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Sonya,Sonya,\\"Sonya Powell\\",\\"Sonya Powell\\",FEMALE,28,Powell,Powell,\\"(empty)\\",Tuesday,1,\\"sonya@powell-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",Pyramidustries,Pyramidustries,\\"Jun 24, 2019 @ 00:00:00.000\\",567019,\\"sold_product_567019_14411, sold_product_567019_24149\\",\\"sold_product_567019_14411, sold_product_567019_24149\\",\\"28.984, 21.984\\",\\"28.984, 21.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"13.344, 10.344\\",\\"28.984, 21.984\\",\\"14,411, 24,149\\",\\"Summer dress - black, Rucksack - black\\",\\"Summer dress - black, Rucksack - black\\",\\"1, 1\\",\\"ZO0151301513, ZO0204902049\\",\\"0, 0\\",\\"28.984, 21.984\\",\\"28.984, 21.984\\",\\"0, 0\\",\\"ZO0151301513, ZO0204902049\\",\\"50.969\\",\\"50.969\\",2,2,order,sonya +ngMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Massey\\",\\"Pia Massey\\",FEMALE,45,Massey,Massey,\\"(empty)\\",Tuesday,1,\\"pia@massey-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567069,\\"sold_product_567069_22261, sold_product_567069_16325\\",\\"sold_product_567069_22261, sold_product_567069_16325\\",\\"50, 33\\",\\"50, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"22.5, 17.156\\",\\"50, 33\\",\\"22,261, 16,325\\",\\"Winter jacket - bordeaux, Summer dress - black\\",\\"Winter jacket - bordeaux, Summer dress - black\\",\\"1, 1\\",\\"ZO0503805038, ZO0047500475\\",\\"0, 0\\",\\"50, 33\\",\\"50, 33\\",\\"0, 0\\",\\"ZO0503805038, ZO0047500475\\",83,83,2,2,order,pia +qAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Frances,Frances,\\"Frances Lamb\\",\\"Frances Lamb\\",FEMALE,49,Lamb,Lamb,\\"(empty)\\",Tuesday,1,\\"frances@lamb-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567935,\\"sold_product_567935_13174, sold_product_567935_14395\\",\\"sold_product_567935_13174, sold_product_567935_14395\\",\\"14.992, 24.984\\",\\"14.992, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"7.789, 12.25\\",\\"14.992, 24.984\\",\\"13,174, 14,395\\",\\"Print T-shirt - bright white, Jumper - offwhite\\",\\"Print T-shirt - bright white, Jumper - offwhite\\",\\"1, 1\\",\\"ZO0116101161, ZO0574305743\\",\\"0, 0\\",\\"14.992, 24.984\\",\\"14.992, 24.984\\",\\"0, 0\\",\\"ZO0116101161, ZO0574305743\\",\\"39.969\\",\\"39.969\\",2,2,order,frances +qwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Jackson\\",\\"Betty Jackson\\",FEMALE,44,Jackson,Jackson,\\"(empty)\\",Tuesday,1,\\"betty@jackson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566831,\\"sold_product_566831_22424, sold_product_566831_17957\\",\\"sold_product_566831_22424, sold_product_566831_17957\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"23.5, 5.5\\",\\"50, 10.992\\",\\"22,424, 17,957\\",\\"Jersey dress - chinese red, Long sleeved top - black\\",\\"Jersey dress - chinese red, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0341103411, ZO0648406484\\",\\"0, 0\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"0, 0\\",\\"ZO0341103411, ZO0648406484\\",\\"60.969\\",\\"60.969\\",2,2,order,betty +5AMtOW0BH63Xcmy44mSR,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Sharp\\",\\"Marwan Sharp\\",MALE,51,Sharp,Sharp,\\"(empty)\\",Tuesday,1,\\"marwan@sharp-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567543,\\"sold_product_567543_14075, sold_product_567543_20484\\",\\"sold_product_567543_14075, sold_product_567543_20484\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"12.742, 9.867\\",\\"24.984, 20.984\\",\\"14,075, 20,484\\",\\"Rucksack - black, Jumper - dark grey\\",\\"Rucksack - black, Jumper - dark grey\\",\\"1, 1\\",\\"ZO0608106081, ZO0296502965\\",\\"0, 0\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"0, 0\\",\\"ZO0608106081, ZO0296502965\\",\\"45.969\\",\\"45.969\\",2,2,order,marwan +5QMtOW0BH63Xcmy44mSR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Gwen,Gwen,\\"Gwen Tran\\",\\"Gwen Tran\\",FEMALE,26,Tran,Tran,\\"(empty)\\",Tuesday,1,\\"gwen@tran-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567598,\\"sold_product_567598_11254, sold_product_567598_11666\\",\\"sold_product_567598_11254, sold_product_567598_11666\\",\\"29.984, 75\\",\\"29.984, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"14.398, 41.25\\",\\"29.984, 75\\",\\"11,254, 11,666\\",\\"Jersey dress - black, Boots - blue\\",\\"Jersey dress - black, Boots - blue\\",\\"1, 1\\",\\"ZO0039400394, ZO0672906729\\",\\"0, 0\\",\\"29.984, 75\\",\\"29.984, 75\\",\\"0, 0\\",\\"ZO0039400394, ZO0672906729\\",105,105,2,2,order,gwen +PwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Lloyd\\",\\"Wilhemina St. Lloyd\\",FEMALE,17,Lloyd,Lloyd,\\"(empty)\\",Tuesday,1,\\"wilhemina st.@lloyd-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567876,\\"sold_product_567876_21798, sold_product_567876_24299\\",\\"sold_product_567876_21798, sold_product_567876_24299\\",\\"14.992, 42\\",\\"14.992, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"7.789, 19.313\\",\\"14.992, 42\\",\\"21,798, 24,299\\",\\"Jersey dress - black, Summer dress - black\\",\\"Jersey dress - black, Summer dress - black\\",\\"1, 1\\",\\"ZO0705707057, ZO0047700477\\",\\"0, 0\\",\\"14.992, 42\\",\\"14.992, 42\\",\\"0, 0\\",\\"ZO0705707057, ZO0047700477\\",\\"56.969\\",\\"56.969\\",2,2,order,wilhemina +UwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Jacobs\\",\\"Stephanie Jacobs\\",FEMALE,6,Jacobs,Jacobs,\\"(empty)\\",Tuesday,1,\\"stephanie@jacobs-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567684,\\"sold_product_567684_13627, sold_product_567684_21755\\",\\"sold_product_567684_13627, sold_product_567684_21755\\",\\"16.984, 20.984\\",\\"16.984, 20.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"9, 9.453\\",\\"16.984, 20.984\\",\\"13,627, 21,755\\",\\"Across body bag - black , Pencil skirt - black\\",\\"Across body bag - black , Pencil skirt - black\\",\\"1, 1\\",\\"ZO0201202012, ZO0035000350\\",\\"0, 0\\",\\"16.984, 20.984\\",\\"16.984, 20.984\\",\\"0, 0\\",\\"ZO0201202012, ZO0035000350\\",\\"37.969\\",\\"37.969\\",2,2,order,stephanie +aAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Oliver,Oliver,\\"Oliver Smith\\",\\"Oliver Smith\\",MALE,7,Smith,Smith,\\"(empty)\\",Tuesday,1,\\"oliver@smith-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567790,\\"sold_product_567790_13490, sold_product_567790_22013\\",\\"sold_product_567790_13490, sold_product_567790_22013\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.602, 29.406\\",\\"10.992, 60\\",\\"13,490, 22,013\\",\\"T-bar sandals - black/green, Boots - black\\",\\"T-bar sandals - black/green, Boots - black\\",\\"1, 1\\",\\"ZO0522405224, ZO0405104051\\",\\"0, 0\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"0, 0\\",\\"ZO0522405224, ZO0405104051\\",71,71,2,2,order,oliver +rAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,George,George,\\"George Hubbard\\",\\"George Hubbard\\",MALE,32,Hubbard,Hubbard,\\"(empty)\\",Tuesday,1,\\"george@hubbard-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567465,\\"sold_product_567465_19025, sold_product_567465_1753\\",\\"sold_product_567465_19025, sold_product_567465_1753\\",\\"65, 65\\",\\"65, 65\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"31.844, 30.547\\",\\"65, 65\\",\\"19,025, 1,753\\",\\"Suit jacket - black, Boots - dark blue\\",\\"Suit jacket - black, Boots - dark blue\\",\\"1, 1\\",\\"ZO0274502745, ZO0686006860\\",\\"0, 0\\",\\"65, 65\\",\\"65, 65\\",\\"0, 0\\",\\"ZO0274502745, ZO0686006860\\",130,130,2,2,order,george +zwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Accessories\\",\\"Men's Accessories\\",EUR,Phil,Phil,\\"Phil Alvarez\\",\\"Phil Alvarez\\",MALE,50,Alvarez,Alvarez,\\"(empty)\\",Tuesday,1,\\"phil@alvarez-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567256,\\"sold_product_567256_24717, sold_product_567256_23939\\",\\"sold_product_567256_24717, sold_product_567256_23939\\",\\"14.992, 50\\",\\"14.992, 50\\",\\"Men's Accessories, Men's Accessories\\",\\"Men's Accessories, Men's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"7.789, 24.5\\",\\"14.992, 50\\",\\"24,717, 23,939\\",\\"Belt - dark brown , Weekend bag - black\\",\\"Belt - dark brown , Weekend bag - black\\",\\"1, 1\\",\\"ZO0461004610, ZO0702707027\\",\\"0, 0\\",\\"14.992, 50\\",\\"14.992, 50\\",\\"0, 0\\",\\"ZO0461004610, ZO0702707027\\",65,65,2,2,order,phil +CwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Jackson,Jackson,\\"Jackson Bryant\\",\\"Jackson Bryant\\",MALE,13,Bryant,Bryant,\\"(empty)\\",Tuesday,1,\\"jackson@bryant-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media, Spritechnologies\\",\\"Elitelligence, Low Tide Media, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",716462,\\"sold_product_716462_13612, sold_product_716462_21781, sold_product_716462_17754, sold_product_716462_17020\\",\\"sold_product_716462_13612, sold_product_716462_21781, sold_product_716462_17754, sold_product_716462_17020\\",\\"11.992, 20.984, 10.992, 20.984\\",\\"11.992, 20.984, 10.992, 20.984\\",\\"Men's Clothing, Men's Clothing, Men's Accessories, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Low Tide Media, Elitelligence, Spritechnologies\\",\\"Elitelligence, Low Tide Media, Elitelligence, Spritechnologies\\",\\"6.469, 10.289, 5.059, 10.078\\",\\"11.992, 20.984, 10.992, 20.984\\",\\"13,612, 21,781, 17,754, 17,020\\",\\"Basic T-shirt - light red/white, Sweatshirt - mottled light grey, Wallet - cognac/black, Sports shirt - grey multicolor\\",\\"Basic T-shirt - light red/white, Sweatshirt - mottled light grey, Wallet - cognac/black, Sports shirt - grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0549505495, ZO0458504585, ZO0602506025, ZO0617506175\\",\\"0, 0, 0, 0\\",\\"11.992, 20.984, 10.992, 20.984\\",\\"11.992, 20.984, 10.992, 20.984\\",\\"0, 0, 0, 0\\",\\"ZO0549505495, ZO0458504585, ZO0602506025, ZO0617506175\\",\\"64.938\\",\\"64.938\\",4,4,order,jackson +GQMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Elliott\\",\\"Abigail Elliott\\",FEMALE,46,Elliott,Elliott,\\"(empty)\\",Tuesday,1,\\"abigail@elliott-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Angeldale, Spherecords Maternity\\",\\"Angeldale, Spherecords Maternity\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566775,\\"sold_product_566775_7253, sold_product_566775_25143\\",\\"sold_product_566775_7253, sold_product_566775_25143\\",\\"110, 16.984\\",\\"110, 16.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Spherecords Maternity\\",\\"Angeldale, Spherecords Maternity\\",\\"53.906, 7.988\\",\\"110, 16.984\\",\\"7,253, 25,143\\",\\"Over-the-knee boots - bison, Long sleeved top - mid grey multicolor\\",\\"Over-the-knee boots - bison, Long sleeved top - mid grey multicolor\\",\\"1, 1\\",\\"ZO0671006710, ZO0708007080\\",\\"0, 0\\",\\"110, 16.984\\",\\"110, 16.984\\",\\"0, 0\\",\\"ZO0671006710, ZO0708007080\\",127,127,2,2,order,abigail +IQMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jason,Jason,\\"Jason Mccarthy\\",\\"Jason Mccarthy\\",MALE,16,Mccarthy,Mccarthy,\\"(empty)\\",Tuesday,1,\\"jason@mccarthy-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567926,\\"sold_product_567926_22732, sold_product_567926_11389\\",\\"sold_product_567926_22732, sold_product_567926_11389\\",\\"33, 7.988\\",\\"33, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"16.172, 3.6\\",\\"33, 7.988\\",\\"22,732, 11,389\\",\\"Relaxed fit jeans - black denim, Basic T-shirt - green\\",\\"Relaxed fit jeans - black denim, Basic T-shirt - green\\",\\"1, 1\\",\\"ZO0113301133, ZO0562105621\\",\\"0, 0\\",\\"33, 7.988\\",\\"33, 7.988\\",\\"0, 0\\",\\"ZO0113301133, ZO0562105621\\",\\"40.969\\",\\"40.969\\",2,2,order,jason +JAMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Miller\\",\\"Elyssa Miller\\",FEMALE,27,Miller,Miller,\\"(empty)\\",Tuesday,1,\\"elyssa@miller-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Gnomehouse mom\\",\\"Tigress Enterprises, Gnomehouse mom\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566829,\\"sold_product_566829_21605, sold_product_566829_17889\\",\\"sold_product_566829_21605, sold_product_566829_17889\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse mom\\",\\"Tigress Enterprises, Gnomehouse mom\\",\\"12.25, 15.07\\",\\"24.984, 28.984\\",\\"21,605, 17,889\\",\\"Pyjama top - navy, Blouse - black\\",\\"Pyjama top - navy, Blouse - black\\",\\"1, 1\\",\\"ZO0100901009, ZO0235102351\\",\\"0, 0\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"0, 0\\",\\"ZO0100901009, ZO0235102351\\",\\"53.969\\",\\"53.969\\",2,2,order,elyssa +RAMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Fleming\\",\\"Muniz Fleming\\",MALE,37,Fleming,Fleming,\\"(empty)\\",Tuesday,1,\\"muniz@fleming-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Oceanavigations,Oceanavigations,\\"Jun 24, 2019 @ 00:00:00.000\\",567666,\\"sold_product_567666_17099, sold_product_567666_2908\\",\\"sold_product_567666_17099, sold_product_567666_2908\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"13.242, 14.781\\",\\"24.984, 28.984\\",\\"17,099, 2,908\\",\\"Watch - black, Chinos - beige \\",\\"Watch - black, Chinos - beige \\",\\"1, 1\\",\\"ZO0311403114, ZO0282002820\\",\\"0, 0\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"0, 0\\",\\"ZO0311403114, ZO0282002820\\",\\"53.969\\",\\"53.969\\",2,2,order,muniz +kgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Austin\\",\\"Pia Austin\\",FEMALE,45,Austin,Austin,\\"(empty)\\",Tuesday,1,\\"pia@austin-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567383,\\"sold_product_567383_16258, sold_product_567383_15314\\",\\"sold_product_567383_16258, sold_product_567383_15314\\",\\"10.992, 42\\",\\"10.992, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"5.059, 20.578\\",\\"10.992, 42\\",\\"16,258, 15,314\\",\\"Print T-shirt - light grey/white, A-line skirt - navy blazer\\",\\"Print T-shirt - light grey/white, A-line skirt - navy blazer\\",\\"1, 1\\",\\"ZO0647406474, ZO0330703307\\",\\"0, 0\\",\\"10.992, 42\\",\\"10.992, 42\\",\\"0, 0\\",\\"ZO0647406474, ZO0330703307\\",\\"52.969\\",\\"52.969\\",2,2,order,pia +ugMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Greene\\",\\"Abd Greene\\",MALE,52,Greene,Greene,\\"(empty)\\",Tuesday,1,\\"abd@greene-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567381,\\"sold_product_567381_13005, sold_product_567381_18590\\",\\"sold_product_567381_13005, sold_product_567381_18590\\",\\"22.984, 42\\",\\"22.984, 42\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"10.352, 19.313\\",\\"22.984, 42\\",\\"13,005, 18,590\\",\\"Shirt - grey, Light jacket - mottled light grey\\",\\"Shirt - grey, Light jacket - mottled light grey\\",\\"1, 1\\",\\"ZO0278402784, ZO0458304583\\",\\"0, 0\\",\\"22.984, 42\\",\\"22.984, 42\\",\\"0, 0\\",\\"ZO0278402784, ZO0458304583\\",65,65,2,2,order,abd +zwMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Simpson\\",\\"Jackson Simpson\\",MALE,13,Simpson,Simpson,\\"(empty)\\",Tuesday,1,\\"jackson@simpson-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567437,\\"sold_product_567437_16571, sold_product_567437_11872\\",\\"sold_product_567437_16571, sold_product_567437_11872\\",\\"65, 7.988\\",\\"65, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"35.094, 3.68\\",\\"65, 7.988\\",\\"16,571, 11,872\\",\\"Suit jacket - black, Basic T-shirt - light red multicolor\\",\\"Suit jacket - black, Basic T-shirt - light red multicolor\\",\\"1, 1\\",\\"ZO0275902759, ZO0545005450\\",\\"0, 0\\",\\"65, 7.988\\",\\"65, 7.988\\",\\"0, 0\\",\\"ZO0275902759, ZO0545005450\\",73,73,2,2,order,jackson +CwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Irwin,Irwin,\\"Irwin Gomez\\",\\"Irwin Gomez\\",MALE,14,Gomez,Gomez,\\"(empty)\\",Tuesday,1,\\"irwin@gomez-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567324,\\"sold_product_567324_15839, sold_product_567324_11429\\",\\"sold_product_567324_15839, sold_product_567324_11429\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"16.813, 5.391\\",\\"33, 10.992\\",\\"15,839, 11,429\\",\\"Slim fit jeans - sand , Swimming shorts - lime punch\\",\\"Slim fit jeans - sand , Swimming shorts - lime punch\\",\\"1, 1\\",\\"ZO0426604266, ZO0629406294\\",\\"0, 0\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"0, 0\\",\\"ZO0426604266, ZO0629406294\\",\\"43.969\\",\\"43.969\\",2,2,order,irwin +QwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Hubbard\\",\\"Yuri Hubbard\\",MALE,21,Hubbard,Hubbard,\\"(empty)\\",Tuesday,1,\\"yuri@hubbard-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567504,\\"sold_product_567504_18713, sold_product_567504_23235\\",\\"sold_product_567504_18713, sold_product_567504_23235\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"11.75, 13.242\\",\\"24.984, 24.984\\",\\"18,713, 23,235\\",\\"Rucksack - navy/Blue Violety, Shirt - grey/black\\",\\"Rucksack - navy/Blue Violety, Shirt - grey/black\\",\\"1, 1\\",\\"ZO0606506065, ZO0277702777\\",\\"0, 0\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"0, 0\\",\\"ZO0606506065, ZO0277702777\\",\\"49.969\\",\\"49.969\\",2,2,order,yuri +RAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Selena,Selena,\\"Selena Gregory\\",\\"Selena Gregory\\",FEMALE,42,Gregory,Gregory,\\"(empty)\\",Tuesday,1,\\"selena@gregory-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567623,\\"sold_product_567623_14283, sold_product_567623_22330\\",\\"sold_product_567623_14283, sold_product_567623_22330\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"32.375, 5.52\\",\\"60, 11.992\\",\\"14,283, 22,330\\",\\"Lace-ups - nude, Long sleeved top - off white/navy\\",\\"Lace-ups - nude, Long sleeved top - off white/navy\\",\\"1, 1\\",\\"ZO0239802398, ZO0645406454\\",\\"0, 0\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"0, 0\\",\\"ZO0239802398, ZO0645406454\\",72,72,2,2,order,selena +RwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Rios\\",\\"Abd Rios\\",MALE,52,Rios,Rios,\\"(empty)\\",Tuesday,1,\\"abd@rios-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567400,\\"sold_product_567400_13372, sold_product_567400_7092\\",\\"sold_product_567400_13372, sold_product_567400_7092\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"11.75, 23.094\\",\\"24.984, 42\\",\\"13,372, 7,092\\",\\"Rucksack - navy/cognac , Tracksuit top - oliv\\",\\"Rucksack - navy/cognac , Tracksuit top - oliv\\",\\"1, 1\\",\\"ZO0605606056, ZO0588105881\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0605606056, ZO0588105881\\",67,67,2,2,order,abd +TwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Garner\\",\\"Yasmine Garner\\",FEMALE,43,Garner,Garner,\\"(empty)\\",Tuesday,1,\\"yasmine@garner-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",Pyramidustries,Pyramidustries,\\"Jun 24, 2019 @ 00:00:00.000\\",566757,\\"sold_product_566757_16685, sold_product_566757_20906\\",\\"sold_product_566757_16685, sold_product_566757_20906\\",\\"18.984, 11.992\\",\\"18.984, 11.992\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"9.492, 6.23\\",\\"18.984, 11.992\\",\\"16,685, 20,906\\",\\"Across body bag - black, Print T-shirt - white\\",\\"Across body bag - black, Print T-shirt - white\\",\\"1, 1\\",\\"ZO0196201962, ZO0168601686\\",\\"0, 0\\",\\"18.984, 11.992\\",\\"18.984, 11.992\\",\\"0, 0\\",\\"ZO0196201962, ZO0168601686\\",\\"30.984\\",\\"30.984\\",2,2,order,yasmine +UAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Brigitte,Brigitte,\\"Brigitte Gregory\\",\\"Brigitte Gregory\\",FEMALE,12,Gregory,Gregory,\\"(empty)\\",Tuesday,1,\\"brigitte@gregory-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566884,\\"sold_product_566884_23198, sold_product_566884_5945\\",\\"sold_product_566884_23198, sold_product_566884_5945\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"10.492, 11.5\\",\\"20.984, 24.984\\",\\"23,198, 5,945\\",\\"Jersey dress - black, Ankle boots - black\\",\\"Jersey dress - black, Ankle boots - black\\",\\"1, 1\\",\\"ZO0490204902, ZO0025000250\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0490204902, ZO0025000250\\",\\"45.969\\",\\"45.969\\",2,2,order,brigitte +pwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Abigail,Abigail,\\"Abigail Brewer\\",\\"Abigail Brewer\\",FEMALE,46,Brewer,Brewer,\\"(empty)\\",Tuesday,1,\\"abigail@brewer-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Oceanavigations,Oceanavigations,\\"Jun 24, 2019 @ 00:00:00.000\\",567815,\\"sold_product_567815_24802, sold_product_567815_7476\\",\\"sold_product_567815_24802, sold_product_567815_7476\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"8.328, 32.375\\",\\"16.984, 60\\",\\"24,802, 7,476\\",\\"Print T-shirt - red, Slip-ons - Wheat\\",\\"Print T-shirt - red, Slip-ons - Wheat\\",\\"1, 1\\",\\"ZO0263602636, ZO0241002410\\",\\"0, 0\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"0, 0\\",\\"ZO0263602636, ZO0241002410\\",77,77,2,2,order,abigail +GwMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Massey\\",\\"Wilhemina St. Massey\\",FEMALE,17,Massey,Massey,\\"(empty)\\",Tuesday,1,\\"wilhemina st.@massey-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",Pyramidustries,Pyramidustries,\\"Jun 24, 2019 @ 00:00:00.000\\",567177,\\"sold_product_567177_12365, sold_product_567177_23200\\",\\"sold_product_567177_12365, sold_product_567177_23200\\",\\"30.984, 24.984\\",\\"30.984, 24.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"15.492, 12.25\\",\\"30.984, 24.984\\",\\"12,365, 23,200\\",\\"Rucksack - grey , Bomber Jacket - black\\",\\"Rucksack - grey , Bomber Jacket - black\\",\\"1, 1\\",\\"ZO0197301973, ZO0180401804\\",\\"0, 0\\",\\"30.984, 24.984\\",\\"30.984, 24.984\\",\\"0, 0\\",\\"ZO0197301973, ZO0180401804\\",\\"55.969\\",\\"55.969\\",2,2,order,wilhemina +lwMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Lambert\\",\\"Elyssa Lambert\\",FEMALE,27,Lambert,Lambert,\\"(empty)\\",Tuesday,1,\\"elyssa@lambert-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises, Oceanavigations, Low Tide Media\\",\\"Pyramidustries, Tigress Enterprises, Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",733060,\\"sold_product_733060_13851, sold_product_733060_7400, sold_product_733060_20106, sold_product_733060_5045\\",\\"sold_product_733060_13851, sold_product_733060_7400, sold_product_733060_20106, sold_product_733060_5045\\",\\"20.984, 50, 50, 60\\",\\"20.984, 50, 50, 60\\",\\"Women's Clothing, Women's Shoes, Women's Shoes, Women's Shoes\\",\\"Women's Clothing, Women's Shoes, Women's Shoes, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Tigress Enterprises, Oceanavigations, Low Tide Media\\",\\"Pyramidustries, Tigress Enterprises, Oceanavigations, Low Tide Media\\",\\"10.492, 23.5, 22.5, 30.594\\",\\"20.984, 50, 50, 60\\",\\"13,851, 7,400, 20,106, 5,045\\",\\"Summer dress - black, Lace-up boots - black, Ballet pumps - bronze, Boots - black\\",\\"Summer dress - black, Lace-up boots - black, Ballet pumps - bronze, Boots - black\\",\\"1, 1, 1, 1\\",\\"ZO0155601556, ZO0013600136, ZO0235702357, ZO0383203832\\",\\"0, 0, 0, 0\\",\\"20.984, 50, 50, 60\\",\\"20.984, 50, 50, 60\\",\\"0, 0, 0, 0\\",\\"ZO0155601556, ZO0013600136, ZO0235702357, ZO0383203832\\",181,181,4,4,order,elyssa +zgMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Selena,Selena,\\"Selena Rose\\",\\"Selena Rose\\",FEMALE,42,Rose,Rose,\\"(empty)\\",Tuesday,1,\\"selena@rose-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567486,\\"sold_product_567486_19378, sold_product_567486_21859\\",\\"sold_product_567486_19378, sold_product_567486_21859\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"13.492, 20.156\\",\\"24.984, 42\\",\\"19,378, 21,859\\",\\"Long sleeved top - winternude, Wedge sandals - black\\",\\"Long sleeved top - winternude, Wedge sandals - black\\",\\"1, 1\\",\\"ZO0058200582, ZO0365503655\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0058200582, ZO0365503655\\",67,67,2,2,order,selena +zwMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Goodwin\\",\\"Abigail Goodwin\\",FEMALE,46,Goodwin,Goodwin,\\"(empty)\\",Tuesday,1,\\"abigail@goodwin-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Gnomehouse,Gnomehouse,\\"Jun 24, 2019 @ 00:00:00.000\\",567625,\\"sold_product_567625_21570, sold_product_567625_16910\\",\\"sold_product_567625_21570, sold_product_567625_16910\\",\\"55, 42\\",\\"55, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Gnomehouse\\",\\"Gnomehouse, Gnomehouse\\",\\"28.047, 19.734\\",\\"55, 42\\",\\"21,570, 16,910\\",\\"A-line skirt - flame scarlet, Pleated skirt - black\\",\\"A-line skirt - flame scarlet, Pleated skirt - black\\",\\"1, 1\\",\\"ZO0328603286, ZO0328803288\\",\\"0, 0\\",\\"55, 42\\",\\"55, 42\\",\\"0, 0\\",\\"ZO0328603286, ZO0328803288\\",97,97,2,2,order,abigail +2gMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Accessories\\",\\"Men's Accessories\\",EUR,Recip,Recip,\\"Recip Brock\\",\\"Recip Brock\\",MALE,10,Brock,Brock,\\"(empty)\\",Tuesday,1,\\"recip@brock-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567224,\\"sold_product_567224_16809, sold_product_567224_18808\\",\\"sold_product_567224_16809, sold_product_567224_18808\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"Men's Accessories, Men's Accessories\\",\\"Men's Accessories, Men's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"14.211, 10.078\\",\\"28.984, 20.984\\",\\"16,809, 18,808\\",\\"Rucksack - black, Rucksack - black/cognac\\",\\"Rucksack - black, Rucksack - black/cognac\\",\\"1, 1\\",\\"ZO0128501285, ZO0606306063\\",\\"0, 0\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"0, 0\\",\\"ZO0128501285, ZO0606306063\\",\\"49.969\\",\\"49.969\\",2,2,order,recip +2wMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Diane,Diane,\\"Diane Kim\\",\\"Diane Kim\\",FEMALE,22,Kim,Kim,\\"(empty)\\",Tuesday,1,\\"diane@kim-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Pyramidustries active\\",\\"Low Tide Media, Pyramidustries active\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567252,\\"sold_product_567252_16632, sold_product_567252_16333\\",\\"sold_product_567252_16632, sold_product_567252_16333\\",\\"42, 24.984\\",\\"42, 24.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Pyramidustries active\\",\\"Low Tide Media, Pyramidustries active\\",\\"19.313, 12\\",\\"42, 24.984\\",\\"16,632, 16,333\\",\\"Slip-ons - mud, Long sleeved top - black \\",\\"Slip-ons - mud, Long sleeved top - black \\",\\"1, 1\\",\\"ZO0369803698, ZO0220502205\\",\\"0, 0\\",\\"42, 24.984\\",\\"42, 24.984\\",\\"0, 0\\",\\"ZO0369803698, ZO0220502205\\",67,67,2,2,order,diane +\\"-AMtOW0BH63Xcmy45GjD\\",ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Thad,Thad,\\"Thad Bowers\\",\\"Thad Bowers\\",MALE,30,Bowers,Bowers,\\"(empty)\\",Tuesday,1,\\"thad@bowers-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567735,\\"sold_product_567735_14414, sold_product_567735_20047\\",\\"sold_product_567735_14414, sold_product_567735_20047\\",\\"7.988, 24.984\\",\\"7.988, 24.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"4.148, 11.5\\",\\"7.988, 24.984\\",\\"14,414, 20,047\\",\\"3 PACK - Socks - black/white, Slip-ons - navy\\",\\"3 PACK - Socks - black/white, Slip-ons - navy\\",\\"1, 1\\",\\"ZO0129701297, ZO0518705187\\",\\"0, 0\\",\\"7.988, 24.984\\",\\"7.988, 24.984\\",\\"0, 0\\",\\"ZO0129701297, ZO0518705187\\",\\"32.969\\",\\"32.969\\",2,2,order,thad +BQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Diane,Diane,\\"Diane Rice\\",\\"Diane Rice\\",FEMALE,22,Rice,Rice,\\"(empty)\\",Tuesday,1,\\"diane@rice-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567822,\\"sold_product_567822_5501, sold_product_567822_25039\\",\\"sold_product_567822_5501, sold_product_567822_25039\\",\\"75, 33\\",\\"75, 33\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"40.5, 17.813\\",\\"75, 33\\",\\"5,501, 25,039\\",\\"Ankle boots - Midnight Blue, Shirt - Lemon Chiffon\\",\\"Ankle boots - Midnight Blue, Shirt - Lemon Chiffon\\",\\"1, 1\\",\\"ZO0244802448, ZO0346303463\\",\\"0, 0\\",\\"75, 33\\",\\"75, 33\\",\\"0, 0\\",\\"ZO0244802448, ZO0346303463\\",108,108,2,2,order,diane +BgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Youssef,Youssef,\\"Youssef Baker\\",\\"Youssef Baker\\",MALE,31,Baker,Baker,\\"(empty)\\",Tuesday,1,\\"youssef@baker-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567852,\\"sold_product_567852_12928, sold_product_567852_11153\\",\\"sold_product_567852_12928, sold_product_567852_11153\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"9.656, 5.172\\",\\"20.984, 10.992\\",\\"12,928, 11,153\\",\\"Shirt - black /grey, Cap - black/black\\",\\"Shirt - black /grey, Cap - black/black\\",\\"1, 1\\",\\"ZO0523805238, ZO0596505965\\",\\"0, 0\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"0, 0\\",\\"ZO0523805238, ZO0596505965\\",\\"31.984\\",\\"31.984\\",2,2,order,youssef +JwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Hicham,Hicham,\\"Hicham Carpenter\\",\\"Hicham Carpenter\\",MALE,8,Carpenter,Carpenter,\\"(empty)\\",Tuesday,1,\\"hicham@carpenter-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566861,\\"sold_product_566861_1978, sold_product_566861_11748\\",\\"sold_product_566861_1978, sold_product_566861_11748\\",\\"50, 16.984\\",\\"50, 16.984\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"27.484, 8.328\\",\\"50, 16.984\\",\\"1,978, 11,748\\",\\"Lace-up boots - black, Wallet - grey\\",\\"Lace-up boots - black, Wallet - grey\\",\\"1, 1\\",\\"ZO0520305203, ZO0462204622\\",\\"0, 0\\",\\"50, 16.984\\",\\"50, 16.984\\",\\"0, 0\\",\\"ZO0520305203, ZO0462204622\\",67,67,2,2,order,hicham +KAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Reyes\\",\\"Gwen Reyes\\",FEMALE,26,Reyes,Reyes,\\"(empty)\\",Tuesday,1,\\"gwen@reyes-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567042,\\"sold_product_567042_23822, sold_product_567042_11786\\",\\"sold_product_567042_23822, sold_product_567042_11786\\",\\"60, 20.984\\",\\"60, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"32.375, 11.117\\",\\"60, 20.984\\",\\"23,822, 11,786\\",\\"Sandals - Midnight Blue, Print T-shirt - black\\",\\"Sandals - Midnight Blue, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0243002430, ZO0103901039\\",\\"0, 0\\",\\"60, 20.984\\",\\"60, 20.984\\",\\"0, 0\\",\\"ZO0243002430, ZO0103901039\\",81,81,2,2,order,gwen +SAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Cook\\",\\"Elyssa Cook\\",FEMALE,27,Cook,Cook,\\"(empty)\\",Tuesday,1,\\"elyssa@cook-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Gnomehouse, Tigress Enterprises\\",\\"Pyramidustries, Gnomehouse, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",731037,\\"sold_product_731037_17669, sold_product_731037_9413, sold_product_731037_8035, sold_product_731037_24229\\",\\"sold_product_731037_17669, sold_product_731037_9413, sold_product_731037_8035, sold_product_731037_24229\\",\\"13.992, 50, 13.992, 29.984\\",\\"13.992, 50, 13.992, 29.984\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Gnomehouse, Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Gnomehouse, Pyramidustries, Tigress Enterprises\\",\\"6.441, 22.5, 7, 15.289\\",\\"13.992, 50, 13.992, 29.984\\",\\"17,669, 9,413, 8,035, 24,229\\",\\"Pencil skirt - black, Summer dress - Pale Violet Red, Jersey dress - black, Trousers - black\\",\\"Pencil skirt - black, Summer dress - Pale Violet Red, Jersey dress - black, Trousers - black\\",\\"1, 1, 1, 1\\",\\"ZO0148801488, ZO0335003350, ZO0155301553, ZO0074300743\\",\\"0, 0, 0, 0\\",\\"13.992, 50, 13.992, 29.984\\",\\"13.992, 50, 13.992, 29.984\\",\\"0, 0, 0, 0\\",\\"ZO0148801488, ZO0335003350, ZO0155301553, ZO0074300743\\",\\"107.938\\",\\"107.938\\",4,4,order,elyssa +gQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Morgan\\",\\"Sultan Al Morgan\\",MALE,19,Morgan,Morgan,\\"(empty)\\",Tuesday,1,\\"sultan al@morgan-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567729,\\"sold_product_567729_1196, sold_product_567729_13331\\",\\"sold_product_567729_1196, sold_product_567729_13331\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"20.156, 9.656\\",\\"42, 20.984\\",\\"1,196, 13,331\\",\\"Trainers - white, Jumper - black\\",\\"Trainers - white, Jumper - black\\",\\"1, 1\\",\\"ZO0395103951, ZO0296102961\\",\\"0, 0\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"0, 0\\",\\"ZO0395103951, ZO0296102961\\",\\"62.969\\",\\"62.969\\",2,2,order,sultan +iQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jim,Jim,\\"Jim Carpenter\\",\\"Jim Carpenter\\",MALE,41,Carpenter,Carpenter,\\"(empty)\\",Tuesday,1,\\"jim@carpenter-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567384,\\"sold_product_567384_22462, sold_product_567384_21856\\",\\"sold_product_567384_22462, sold_product_567384_21856\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"14.852, 12.742\\",\\"33, 24.984\\",\\"22,462, 21,856\\",\\"Slim fit jeans - dark grey , Pyjama set - grey\\",\\"Slim fit jeans - dark grey , Pyjama set - grey\\",\\"1, 1\\",\\"ZO0426704267, ZO0612006120\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0426704267, ZO0612006120\\",\\"57.969\\",\\"57.969\\",2,2,order,jim +kwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Goodman\\",\\"Fitzgerald Goodman\\",MALE,11,Goodman,Goodman,\\"(empty)\\",Tuesday,1,\\"fitzgerald@goodman-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566690,\\"sold_product_566690_11851, sold_product_566690_18257\\",\\"sold_product_566690_11851, sold_product_566690_18257\\",\\"28.984, 14.992\\",\\"28.984, 14.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"13.922, 7.051\\",\\"28.984, 14.992\\",\\"11,851, 18,257\\",\\"Jumper - dark blue, Print T-shirt - black\\",\\"Jumper - dark blue, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0449004490, ZO0118501185\\",\\"0, 0\\",\\"28.984, 14.992\\",\\"28.984, 14.992\\",\\"0, 0\\",\\"ZO0449004490, ZO0118501185\\",\\"43.969\\",\\"43.969\\",2,2,order,fuzzy +lAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Frances,Frances,\\"Frances Mullins\\",\\"Frances Mullins\\",FEMALE,49,Mullins,Mullins,\\"(empty)\\",Tuesday,1,\\"frances@mullins-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566951,\\"sold_product_566951_2269, sold_product_566951_14250\\",\\"sold_product_566951_2269, sold_product_566951_14250\\",\\"50, 33\\",\\"50, 33\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"23, 15.508\\",\\"50, 33\\",\\"2,269, 14,250\\",\\"Boots - Slate Gray, High-top trainers - grey\\",\\"Boots - Slate Gray, High-top trainers - grey\\",\\"1, 1\\",\\"ZO0406604066, ZO0517405174\\",\\"0, 0\\",\\"50, 33\\",\\"50, 33\\",\\"0, 0\\",\\"ZO0406604066, ZO0517405174\\",83,83,2,2,order,frances +lQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane Washington\\",\\"Diane Washington\\",FEMALE,22,Washington,Washington,\\"(empty)\\",Tuesday,1,\\"diane@washington-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566982,\\"sold_product_566982_13852, sold_product_566982_21858\\",\\"sold_product_566982_13852, sold_product_566982_21858\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"7.648, 8.156\\",\\"16.984, 16.984\\",\\"13,852, 21,858\\",\\"A-line skirt - black/white, Nightie - off white\\",\\"A-line skirt - black/white, Nightie - off white\\",\\"1, 1\\",\\"ZO0149301493, ZO0099800998\\",\\"0, 0\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"0, 0\\",\\"ZO0149301493, ZO0099800998\\",\\"33.969\\",\\"33.969\\",2,2,order,diane +lgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Phil,Phil,\\"Phil Bailey\\",\\"Phil Bailey\\",MALE,50,Bailey,Bailey,\\"(empty)\\",Tuesday,1,\\"phil@bailey-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566725,\\"sold_product_566725_17721, sold_product_566725_19679\\",\\"sold_product_566725_17721, sold_product_566725_19679\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"7.988, 15.648\\",\\"16.984, 28.984\\",\\"17,721, 19,679\\",\\"Polo shirt - light grey multicolor, Hoodie - black/dark blue/white\\",\\"Polo shirt - light grey multicolor, Hoodie - black/dark blue/white\\",\\"1, 1\\",\\"ZO0444404444, ZO0584205842\\",\\"0, 0\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"0, 0\\",\\"ZO0444404444, ZO0584205842\\",\\"45.969\\",\\"45.969\\",2,2,order,phil +wgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Fletcher\\",\\"Yasmine Fletcher\\",FEMALE,43,Fletcher,Fletcher,\\"(empty)\\",Tuesday,1,\\"yasmine@fletcher-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566856,\\"sold_product_566856_10829, sold_product_566856_25007\\",\\"sold_product_566856_10829, sold_product_566856_25007\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"15.07, 26.484\\",\\"28.984, 50\\",\\"10,829, 25,007\\",\\"Sports shoes - black/pink, Jumpsuit - Pale Violet Red\\",\\"Sports shoes - black/pink, Jumpsuit - Pale Violet Red\\",\\"1, 1\\",\\"ZO0216502165, ZO0327503275\\",\\"0, 0\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"0, 0\\",\\"ZO0216502165, ZO0327503275\\",79,79,2,2,order,yasmine +wwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Moss\\",\\"Selena Moss\\",FEMALE,42,Moss,Moss,\\"(empty)\\",Tuesday,1,\\"selena@moss-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Pyramidustries, Spherecords Curvy\\",\\"Pyramidustries, Spherecords Curvy\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567039,\\"sold_product_567039_16085, sold_product_567039_16220\\",\\"sold_product_567039_16085, sold_product_567039_16220\\",\\"24.984, 14.992\\",\\"24.984, 14.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Spherecords Curvy\\",\\"Pyramidustries, Spherecords Curvy\\",\\"11.75, 7.789\\",\\"24.984, 14.992\\",\\"16,085, 16,220\\",\\"Jeans Skinny Fit - dark blue denim, Vest - white\\",\\"Jeans Skinny Fit - dark blue denim, Vest - white\\",\\"1, 1\\",\\"ZO0184101841, ZO0711207112\\",\\"0, 0\\",\\"24.984, 14.992\\",\\"24.984, 14.992\\",\\"0, 0\\",\\"ZO0184101841, ZO0711207112\\",\\"39.969\\",\\"39.969\\",2,2,order,selena +xAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Greene\\",\\"Wilhemina St. Greene\\",FEMALE,17,Greene,Greene,\\"(empty)\\",Tuesday,1,\\"wilhemina st.@greene-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises, Spherecords Curvy\\",\\"Tigress Enterprises, Spherecords Curvy\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567068,\\"sold_product_567068_13637, sold_product_567068_21700\\",\\"sold_product_567068_13637, sold_product_567068_21700\\",\\"28.984, 14.992\\",\\"28.984, 14.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords Curvy\\",\\"Tigress Enterprises, Spherecords Curvy\\",\\"13.633, 7.051\\",\\"28.984, 14.992\\",\\"13,637, 21,700\\",\\"Jersey dress - multicolor, Basic T-shirt - black\\",\\"Jersey dress - multicolor, Basic T-shirt - black\\",\\"1, 1\\",\\"ZO0038000380, ZO0711007110\\",\\"0, 0\\",\\"28.984, 14.992\\",\\"28.984, 14.992\\",\\"0, 0\\",\\"ZO0038000380, ZO0711007110\\",\\"43.969\\",\\"43.969\\",2,2,order,wilhemina +0wMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Cunningham\\",\\"Rabbia Al Cunningham\\",FEMALE,5,Cunningham,Cunningham,\\"(empty)\\",Tuesday,1,\\"rabbia al@cunningham-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Pyramidustries, Angeldale, Oceanavigations\\",\\"Pyramidustries, Angeldale, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",732229,\\"sold_product_732229_21857, sold_product_732229_23802, sold_product_732229_12401, sold_product_732229_21229\\",\\"sold_product_732229_21857, sold_product_732229_23802, sold_product_732229_12401, sold_product_732229_21229\\",\\"20.984, 20.984, 65, 80\\",\\"20.984, 20.984, 65, 80\\",\\"Women's Clothing, Women's Clothing, Women's Accessories, Women's Shoes\\",\\"Women's Clothing, Women's Clothing, Women's Accessories, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Pyramidustries, Angeldale, Oceanavigations\\",\\"Pyramidustries, Pyramidustries, Angeldale, Oceanavigations\\",\\"10.078, 11.539, 31.203, 40.781\\",\\"20.984, 20.984, 65, 80\\",\\"21,857, 23,802, 12,401, 21,229\\",\\"Cardigan - black/white, Long sleeved top - off white, Handbag - black, Boots - navy\\",\\"Cardigan - black/white, Long sleeved top - off white, Handbag - black, Boots - navy\\",\\"1, 1, 1, 1\\",\\"ZO0175701757, ZO0163801638, ZO0697506975, ZO0245602456\\",\\"0, 0, 0, 0\\",\\"20.984, 20.984, 65, 80\\",\\"20.984, 20.984, 65, 80\\",\\"0, 0, 0, 0\\",\\"ZO0175701757, ZO0163801638, ZO0697506975, ZO0245602456\\",187,187,4,4,order,rabbia +1AMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Ball\\",\\"Rabbia Al Ball\\",FEMALE,5,Ball,Ball,\\"(empty)\\",Tuesday,1,\\"rabbia al@ball-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords, Tigress Enterprises, Angeldale\\",\\"Spherecords, Tigress Enterprises, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",724806,\\"sold_product_724806_13062, sold_product_724806_12709, sold_product_724806_19614, sold_product_724806_21000\\",\\"sold_product_724806_13062, sold_product_724806_12709, sold_product_724806_19614, sold_product_724806_21000\\",\\"11.992, 28.984, 60, 20.984\\",\\"11.992, 28.984, 60, 20.984\\",\\"Women's Clothing, Women's Clothing, Women's Accessories, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Accessories, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spherecords, Tigress Enterprises, Angeldale, Spherecords\\",\\"Spherecords, Tigress Enterprises, Angeldale, Spherecords\\",\\"6.23, 14.781, 27, 11.539\\",\\"11.992, 28.984, 60, 20.984\\",\\"13,062, 12,709, 19,614, 21,000\\",\\"Long sleeved top - dark green, Pleated skirt - Blue Violety, Tote bag - terracotta, Shirt - light blue\\",\\"Long sleeved top - dark green, Pleated skirt - Blue Violety, Tote bag - terracotta, Shirt - light blue\\",\\"1, 1, 1, 1\\",\\"ZO0643106431, ZO0033300333, ZO0696206962, ZO0651206512\\",\\"0, 0, 0, 0\\",\\"11.992, 28.984, 60, 20.984\\",\\"11.992, 28.984, 60, 20.984\\",\\"0, 0, 0, 0\\",\\"ZO0643106431, ZO0033300333, ZO0696206962, ZO0651206512\\",\\"121.938\\",\\"121.938\\",4,4,order,rabbia +8QMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Graham\\",\\"Abd Graham\\",MALE,52,Graham,Graham,\\"(empty)\\",Tuesday,1,\\"abd@graham-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567769,\\"sold_product_567769_24888, sold_product_567769_16104\\",\\"sold_product_567769_24888, sold_product_567769_16104\\",\\"28.984, 18.984\\",\\"28.984, 18.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"14.211, 9.117\\",\\"28.984, 18.984\\",\\"24,888, 16,104\\",\\"Formal shirt - blue, Swimming shorts - blue atol\\",\\"Formal shirt - blue, Swimming shorts - blue atol\\",\\"1, 1\\",\\"ZO0414004140, ZO0630106301\\",\\"0, 0\\",\\"28.984, 18.984\\",\\"28.984, 18.984\\",\\"0, 0\\",\\"ZO0414004140, ZO0630106301\\",\\"47.969\\",\\"47.969\\",2,2,order,abd +AgMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Abigail,Abigail,\\"Abigail Potter\\",\\"Abigail Potter\\",FEMALE,46,Potter,Potter,\\"(empty)\\",Tuesday,1,\\"abigail@potter-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566772,\\"sold_product_566772_17102, sold_product_566772_7361\\",\\"sold_product_566772_17102, sold_product_566772_7361\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"10.703, 13.633\\",\\"20.984, 28.984\\",\\"17,102, 7,361\\",\\"Jersey dress - black/white, Ankle boots - black\\",\\"Jersey dress - black/white, Ankle boots - black\\",\\"1, 1\\",\\"ZO0152901529, ZO0019100191\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0152901529, ZO0019100191\\",\\"49.969\\",\\"49.969\\",2,2,order,abigail +2gMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Kamal,Kamal,\\"Kamal Palmer\\",\\"Kamal Palmer\\",MALE,39,Palmer,Palmer,\\"(empty)\\",Tuesday,1,\\"kamal@palmer-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567318,\\"sold_product_567318_16500, sold_product_567318_1539\\",\\"sold_product_567318_16500, sold_product_567318_1539\\",\\"33, 60\\",\\"33, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"16.813, 30\\",\\"33, 60\\",\\"16,500, 1,539\\",\\"Casual Cuffed Pants, Lace-up boots - black\\",\\"Casual Cuffed Pants, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0421104211, ZO0256202562\\",\\"0, 0\\",\\"33, 60\\",\\"33, 60\\",\\"0, 0\\",\\"ZO0421104211, ZO0256202562\\",93,93,2,2,order,kamal +OQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Potter\\",\\"Stephanie Potter\\",FEMALE,6,Potter,Potter,\\"(empty)\\",Tuesday,1,\\"stephanie@potter-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567615,\\"sold_product_567615_21067, sold_product_567615_16863\\",\\"sold_product_567615_21067, sold_product_567615_16863\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"25.484, 13.922\\",\\"50, 28.984\\",\\"21,067, 16,863\\",\\"Lace-up boots - brown, Bomber Jacket - black\\",\\"Lace-up boots - brown, Bomber Jacket - black\\",\\"1, 1\\",\\"ZO0013500135, ZO0174501745\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0013500135, ZO0174501745\\",79,79,2,2,order,stephanie +QgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Muniz,Muniz,\\"Muniz Weber\\",\\"Muniz Weber\\",MALE,37,Weber,Weber,\\"(empty)\\",Tuesday,1,\\"muniz@weber-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567316,\\"sold_product_567316_13588, sold_product_567316_24014\\",\\"sold_product_567316_13588, sold_product_567316_24014\\",\\"60, 50\\",\\"60, 50\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"28.797, 24.5\\",\\"60, 50\\",\\"13,588, 24,014\\",\\"Lace-ups - cognac, Boots - saphire\\",\\"Lace-ups - cognac, Boots - saphire\\",\\"1, 1\\",\\"ZO0390403904, ZO0403004030\\",\\"0, 0\\",\\"60, 50\\",\\"60, 50\\",\\"0, 0\\",\\"ZO0390403904, ZO0403004030\\",110,110,2,2,order,muniz +RQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Mary,Mary,\\"Mary Kelley\\",\\"Mary Kelley\\",FEMALE,20,Kelley,Kelley,\\"(empty)\\",Tuesday,1,\\"mary@kelley-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566896,\\"sold_product_566896_16021, sold_product_566896_17331\\",\\"sold_product_566896_16021, sold_product_566896_17331\\",\\"50, 20.984\\",\\"50, 20.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"23, 10.492\\",\\"50, 20.984\\",\\"16,021, 17,331\\",\\"High heeled sandals - electric blue, Tote bag - Blue Violety\\",\\"High heeled sandals - electric blue, Tote bag - Blue Violety\\",\\"1, 1\\",\\"ZO0242702427, ZO0090000900\\",\\"0, 0\\",\\"50, 20.984\\",\\"50, 20.984\\",\\"0, 0\\",\\"ZO0242702427, ZO0090000900\\",71,71,2,2,order,mary +WAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Phil,Phil,\\"Phil Henderson\\",\\"Phil Henderson\\",MALE,50,Henderson,Henderson,\\"(empty)\\",Tuesday,1,\\"phil@henderson-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567418,\\"sold_product_567418_22276, sold_product_567418_18190\\",\\"sold_product_567418_22276, sold_product_567418_18190\\",\\"75, 110\\",\\"75, 110\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"36.75, 58.281\\",\\"75, 110\\",\\"22,276, 18,190\\",\\"Lace-up boots - cognac, Ski jacket - bright white\\",\\"Lace-up boots - cognac, Ski jacket - bright white\\",\\"1, 1\\",\\"ZO0400404004, ZO0625006250\\",\\"0, 0\\",\\"75, 110\\",\\"75, 110\\",\\"0, 0\\",\\"ZO0400404004, ZO0625006250\\",185,185,2,2,order,phil +WQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Duncan\\",\\"Selena Duncan\\",FEMALE,42,Duncan,Duncan,\\"(empty)\\",Tuesday,1,\\"selena@duncan-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Spherecords, Spherecords Curvy\\",\\"Spherecords, Spherecords Curvy\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567462,\\"sold_product_567462_9295, sold_product_567462_18220\\",\\"sold_product_567462_9295, sold_product_567462_18220\\",\\"7.988, 16.984\\",\\"7.988, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Spherecords Curvy\\",\\"Spherecords, Spherecords Curvy\\",\\"3.6, 8.656\\",\\"7.988, 16.984\\",\\"9,295, 18,220\\",\\"Print T-shirt - dark grey/white, Jersey dress - dark blue\\",\\"Print T-shirt - dark grey/white, Jersey dress - dark blue\\",\\"1, 1\\",\\"ZO0644406444, ZO0709307093\\",\\"0, 0\\",\\"7.988, 16.984\\",\\"7.988, 16.984\\",\\"0, 0\\",\\"ZO0644406444, ZO0709307093\\",\\"24.984\\",\\"24.984\\",2,2,order,selena +XwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,George,George,\\"George Perkins\\",\\"George Perkins\\",MALE,32,Perkins,Perkins,\\"(empty)\\",Tuesday,1,\\"george@perkins-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Oceanavigations,Oceanavigations,\\"Jun 24, 2019 @ 00:00:00.000\\",567667,\\"sold_product_567667_22878, sold_product_567667_19733\\",\\"sold_product_567667_22878, sold_product_567667_19733\\",\\"75, 33\\",\\"75, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"34.5, 16.813\\",\\"75, 33\\",\\"22,878, 19,733\\",\\"Suit jacket - dark blue, Sweatshirt - black\\",\\"Suit jacket - dark blue, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0273802738, ZO0300303003\\",\\"0, 0\\",\\"75, 33\\",\\"75, 33\\",\\"0, 0\\",\\"ZO0273802738, ZO0300303003\\",108,108,2,2,order,george +YAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Carr\\",\\"Elyssa Carr\\",FEMALE,27,Carr,Carr,\\"(empty)\\",Tuesday,1,\\"elyssa@carr-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567703,\\"sold_product_567703_11574, sold_product_567703_16709\\",\\"sold_product_567703_11574, sold_product_567703_16709\\",\\"42, 42\\",\\"42, 42\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"19.313, 21.828\\",\\"42, 42\\",\\"11,574, 16,709\\",\\"Maxi dress - multicolor, Lace-up boots - Amethyst\\",\\"Maxi dress - multicolor, Lace-up boots - Amethyst\\",\\"1, 1\\",\\"ZO0037900379, ZO0134901349\\",\\"0, 0\\",\\"42, 42\\",\\"42, 42\\",\\"0, 0\\",\\"ZO0037900379, ZO0134901349\\",84,84,2,2,order,elyssa +iwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Gwen,Gwen,\\"Gwen Powell\\",\\"Gwen Powell\\",FEMALE,26,Powell,Powell,\\"(empty)\\",Tuesday,1,\\"gwen@powell-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567260,\\"sold_product_567260_9302, sold_product_567260_7402\\",\\"sold_product_567260_9302, sold_product_567260_7402\\",\\"33, 75\\",\\"33, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"16.172, 34.5\\",\\"33, 75\\",\\"9,302, 7,402\\",\\"Cardigan - red, Ankle boots - black \\",\\"Cardigan - red, Ankle boots - black \\",\\"1, 1\\",\\"ZO0068100681, ZO0674106741\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0068100681, ZO0674106741\\",108,108,2,2,order,gwen +jAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Washington\\",\\"Rabbia Al Washington\\",FEMALE,5,Washington,Washington,\\"(empty)\\",Tuesday,1,\\"rabbia al@washington-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords Maternity, Oceanavigations, Pyramidustries active, Gnomehouse\\",\\"Spherecords Maternity, Oceanavigations, Pyramidustries active, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",724844,\\"sold_product_724844_19797, sold_product_724844_13322, sold_product_724844_10099, sold_product_724844_8107\\",\\"sold_product_724844_19797, sold_product_724844_13322, sold_product_724844_10099, sold_product_724844_8107\\",\\"20.984, 65, 20.984, 33\\",\\"20.984, 65, 20.984, 33\\",\\"Women's Clothing, Women's Shoes, Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Shoes, Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spherecords Maternity, Oceanavigations, Pyramidustries active, Gnomehouse\\",\\"Spherecords Maternity, Oceanavigations, Pyramidustries active, Gnomehouse\\",\\"10.703, 33.781, 9.453, 17.484\\",\\"20.984, 65, 20.984, 33\\",\\"19,797, 13,322, 10,099, 8,107\\",\\"Shirt - white, High heeled ankle boots - black, Sweatshirt - black, Blouse - off-white\\",\\"Shirt - white, High heeled ankle boots - black, Sweatshirt - black, Blouse - off-white\\",\\"1, 1, 1, 1\\",\\"ZO0707507075, ZO0246402464, ZO0226802268, ZO0343503435\\",\\"0, 0, 0, 0\\",\\"20.984, 65, 20.984, 33\\",\\"20.984, 65, 20.984, 33\\",\\"0, 0, 0, 0\\",\\"ZO0707507075, ZO0246402464, ZO0226802268, ZO0343503435\\",140,140,4,4,order,rabbia +qAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Pia,Pia,\\"Pia Chapman\\",\\"Pia Chapman\\",FEMALE,45,Chapman,Chapman,\\"(empty)\\",Tuesday,1,\\"pia@chapman-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567308,\\"sold_product_567308_16474, sold_product_567308_18779\\",\\"sold_product_567308_16474, sold_product_567308_18779\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"9.344, 15.648\\",\\"16.984, 28.984\\",\\"16,474, 18,779\\",\\"Sweatshirt - grey multicolor, High heeled sandals - silver\\",\\"Sweatshirt - grey multicolor, High heeled sandals - silver\\",\\"1, 1\\",\\"ZO0181601816, ZO0011000110\\",\\"0, 0\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"0, 0\\",\\"ZO0181601816, ZO0011000110\\",\\"45.969\\",\\"45.969\\",2,2,order,pia +7gMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Morrison\\",\\"Abd Morrison\\",MALE,52,Morrison,Morrison,\\"(empty)\\",Tuesday,1,\\"abd@morrison-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567404,\\"sold_product_567404_22845, sold_product_567404_21489\\",\\"sold_product_567404_22845, sold_product_567404_21489\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"25.984, 13.633\\",\\"50, 28.984\\",\\"22,845, 21,489\\",\\"High-top trainers - red, Jeans Tapered Fit - blue denim\\",\\"High-top trainers - red, Jeans Tapered Fit - blue denim\\",\\"1, 1\\",\\"ZO0107101071, ZO0537905379\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0107101071, ZO0537905379\\",79,79,2,2,order,abd +PgMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Hopkins\\",\\"Youssef Hopkins\\",MALE,31,Hopkins,Hopkins,\\"(empty)\\",Tuesday,1,\\"youssef@hopkins-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567538,\\"sold_product_567538_16200, sold_product_567538_17404\\",\\"sold_product_567538_16200, sold_product_567538_17404\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.281, 27.594\\",\\"10.992, 60\\",\\"16,200, 17,404\\",\\"Hat - grey, Colorful Cardigan\\",\\"Hat - grey, Colorful Cardigan\\",\\"1, 1\\",\\"ZO0596905969, ZO0450804508\\",\\"0, 0\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"0, 0\\",\\"ZO0596905969, ZO0450804508\\",71,71,2,2,order,youssef +PwMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Abigail,Abigail,\\"Abigail Perry\\",\\"Abigail Perry\\",FEMALE,46,Perry,Perry,\\"(empty)\\",Tuesday,1,\\"abigail@perry-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567593,\\"sold_product_567593_25072, sold_product_567593_17024\\",\\"sold_product_567593_25072, sold_product_567593_17024\\",\\"18.984, 24.984\\",\\"18.984, 24.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"8.93, 12.992\\",\\"18.984, 24.984\\",\\"25,072, 17,024\\",\\"Jumper - off white, Across body bag - black\\",\\"Jumper - off white, Across body bag - black\\",\\"1, 1\\",\\"ZO0655306553, ZO0208902089\\",\\"0, 0\\",\\"18.984, 24.984\\",\\"18.984, 24.984\\",\\"0, 0\\",\\"ZO0655306553, ZO0208902089\\",\\"43.969\\",\\"43.969\\",2,2,order,abigail +fQMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Williams\\",\\"Wagdi Williams\\",MALE,15,Williams,Williams,\\"(empty)\\",Tuesday,1,\\"wagdi@williams-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567294,\\"sold_product_567294_21723, sold_product_567294_20325\\",\\"sold_product_567294_21723, sold_product_567294_20325\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"12.992, 10.078\\",\\"24.984, 20.984\\",\\"21,723, 20,325\\",\\"SET - Hat - Medium Slate Blue, Sweatshirt - dark blue\\",\\"SET - Hat - Medium Slate Blue, Sweatshirt - dark blue\\",\\"1, 1\\",\\"ZO0317403174, ZO0457204572\\",\\"0, 0\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"0, 0\\",\\"ZO0317403174, ZO0457204572\\",\\"45.969\\",\\"45.969\\",2,2,order,wagdi +kQMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Underwood\\",\\"Wilhemina St. Underwood\\",FEMALE,17,Underwood,Underwood,\\"(empty)\\",Tuesday,1,\\"wilhemina st.@underwood-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Low Tide Media, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"Low Tide Media, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"Jun 24, 2019 @ 00:00:00.000\\",728256,\\"sold_product_728256_17123, sold_product_728256_19925, sold_product_728256_23613, sold_product_728256_17666\\",\\"sold_product_728256_17123, sold_product_728256_19925, sold_product_728256_23613, sold_product_728256_17666\\",\\"42, 33, 33, 37\\",\\"42, 33, 33, 37\\",\\"Women's Shoes, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"Low Tide Media, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"22.672, 15.18, 17.156, 19.234\\",\\"42, 33, 33, 37\\",\\"17,123, 19,925, 23,613, 17,666\\",\\"Sandals - black, Jumper - Lemon Chiffon, Platform sandals - black, Summer dress - peacoat\\",\\"Sandals - black, Jumper - Lemon Chiffon, Platform sandals - black, Summer dress - peacoat\\",\\"1, 1, 1, 1\\",\\"ZO0371903719, ZO0352803528, ZO0137501375, ZO0229202292\\",\\"0, 0, 0, 0\\",\\"42, 33, 33, 37\\",\\"42, 33, 33, 37\\",\\"0, 0, 0, 0\\",\\"ZO0371903719, ZO0352803528, ZO0137501375, ZO0229202292\\",145,145,4,4,order,wilhemina +wgMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Miller\\",\\"Thad Miller\\",MALE,30,Miller,Miller,\\"(empty)\\",Tuesday,1,\\"thad@miller-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567544,\\"sold_product_567544_18963, sold_product_567544_19459\\",\\"sold_product_567544_18963, sold_product_567544_19459\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"10.078, 7.988\\",\\"20.984, 16.984\\",\\"18,963, 19,459\\",\\"Sweatshirt - white, Long sleeved top - Dark Salmon\\",\\"Sweatshirt - white, Long sleeved top - Dark Salmon\\",\\"1, 1\\",\\"ZO0585005850, ZO0120301203\\",\\"0, 0\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"0, 0\\",\\"ZO0585005850, ZO0120301203\\",\\"37.969\\",\\"37.969\\",2,2,order,thad +wwMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jim,Jim,\\"Jim Stewart\\",\\"Jim Stewart\\",MALE,41,Stewart,Stewart,\\"(empty)\\",Tuesday,1,\\"jim@stewart-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567592,\\"sold_product_567592_2843, sold_product_567592_16403\\",\\"sold_product_567592_2843, sold_product_567592_16403\\",\\"28.984, 200\\",\\"28.984, 200\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"13.344, 98\\",\\"28.984, 200\\",\\"2,843, 16,403\\",\\"Jeans Tapered Fit - washed black, Short coat - light grey\\",\\"Jeans Tapered Fit - washed black, Short coat - light grey\\",\\"1, 1\\",\\"ZO0535405354, ZO0291302913\\",\\"0, 0\\",\\"28.984, 200\\",\\"28.984, 200\\",\\"0, 0\\",\\"ZO0535405354, ZO0291302913\\",229,229,2,2,order,jim +ywMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Betty,Betty,\\"Betty Farmer\\",\\"Betty Farmer\\",FEMALE,44,Farmer,Farmer,\\"(empty)\\",Tuesday,1,\\"betty@farmer-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566942,\\"sold_product_566942_14928, sold_product_566942_23534\\",\\"sold_product_566942_14928, sold_product_566942_23534\\",\\"11.992, 22.984\\",\\"11.992, 22.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"6, 11.719\\",\\"11.992, 22.984\\",\\"14,928, 23,534\\",\\"Scarf - red, Jumper dress - dark green\\",\\"Scarf - red, Jumper dress - dark green\\",\\"1, 1\\",\\"ZO0084000840, ZO0636606366\\",\\"0, 0\\",\\"11.992, 22.984\\",\\"11.992, 22.984\\",\\"0, 0\\",\\"ZO0084000840, ZO0636606366\\",\\"34.969\\",\\"34.969\\",2,2,order,betty +zAMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Foster\\",\\"Youssef Foster\\",MALE,31,Foster,Foster,\\"(empty)\\",Tuesday,1,\\"youssef@foster-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567015,\\"sold_product_567015_22305, sold_product_567015_11284\\",\\"sold_product_567015_22305, sold_product_567015_11284\\",\\"11.992, 20.984\\",\\"11.992, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"5.879, 10.078\\",\\"11.992, 20.984\\",\\"22,305, 11,284\\",\\"Print T-shirt - white, Chinos - dark blue\\",\\"Print T-shirt - white, Chinos - dark blue\\",\\"1, 1\\",\\"ZO0558605586, ZO0527805278\\",\\"0, 0\\",\\"11.992, 20.984\\",\\"11.992, 20.984\\",\\"0, 0\\",\\"ZO0558605586, ZO0527805278\\",\\"32.969\\",\\"32.969\\",2,2,order,youssef +zQMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Sonya,Sonya,\\"Sonya Hopkins\\",\\"Sonya Hopkins\\",FEMALE,28,Hopkins,Hopkins,\\"(empty)\\",Tuesday,1,\\"sonya@hopkins-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",Pyramidustries,Pyramidustries,\\"Jun 24, 2019 @ 00:00:00.000\\",567081,\\"sold_product_567081_25066, sold_product_567081_13016\\",\\"sold_product_567081_25066, sold_product_567081_13016\\",\\"13.992, 24.984\\",\\"13.992, 24.984\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"7.41, 11.75\\",\\"13.992, 24.984\\",\\"25,066, 13,016\\",\\"Across body bag - red, Tote bag - cognac\\",\\"Across body bag - red, Tote bag - cognac\\",\\"1, 1\\",\\"ZO0209702097, ZO0186301863\\",\\"0, 0\\",\\"13.992, 24.984\\",\\"13.992, 24.984\\",\\"0, 0\\",\\"ZO0209702097, ZO0186301863\\",\\"38.969\\",\\"38.969\\",2,2,order,sonya +SgMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Irwin,Irwin,\\"Irwin Hayes\\",\\"Irwin Hayes\\",MALE,14,Hayes,Hayes,\\"(empty)\\",Tuesday,1,\\"irwin@hayes-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567475,\\"sold_product_567475_21824, sold_product_567475_23277\\",\\"sold_product_567475_21824, sold_product_567475_23277\\",\\"20.984, 42\\",\\"20.984, 42\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"10.906, 20.578\\",\\"20.984, 42\\",\\"21,824, 23,277\\",\\"Jumper - black, Boots - black\\",\\"Jumper - black, Boots - black\\",\\"1, 1\\",\\"ZO0578805788, ZO0520405204\\",\\"0, 0\\",\\"20.984, 42\\",\\"20.984, 42\\",\\"0, 0\\",\\"ZO0578805788, ZO0520405204\\",\\"62.969\\",\\"62.969\\",2,2,order,irwin +SwMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Abigail,Abigail,\\"Abigail Adams\\",\\"Abigail Adams\\",FEMALE,46,Adams,Adams,\\"(empty)\\",Tuesday,1,\\"abigail@adams-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567631,\\"sold_product_567631_18119, sold_product_567631_5772\\",\\"sold_product_567631_18119, sold_product_567631_5772\\",\\"6.988, 65\\",\\"6.988, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"3.289, 33.781\\",\\"6.988, 65\\",\\"18,119, 5,772\\",\\"2 PACK - Socks - red/grey, Classic heels - nude\\",\\"2 PACK - Socks - red/grey, Classic heels - nude\\",\\"1, 1\\",\\"ZO0101101011, ZO0667406674\\",\\"0, 0\\",\\"6.988, 65\\",\\"6.988, 65\\",\\"0, 0\\",\\"ZO0101101011, ZO0667406674\\",72,72,2,2,order,abigail +oAMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Mary,Mary,\\"Mary Gilbert\\",\\"Mary Gilbert\\",FEMALE,20,Gilbert,Gilbert,\\"(empty)\\",Tuesday,1,\\"mary@gilbert-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567454,\\"sold_product_567454_22330, sold_product_567454_8083\\",\\"sold_product_567454_22330, sold_product_567454_8083\\",\\"11.992, 13.992\\",\\"11.992, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"5.52, 7.691\\",\\"11.992, 13.992\\",\\"22,330, 8,083\\",\\"Long sleeved top - off white/navy, Long sleeved top - light blue\\",\\"Long sleeved top - off white/navy, Long sleeved top - light blue\\",\\"1, 1\\",\\"ZO0645406454, ZO0166001660\\",\\"0, 0\\",\\"11.992, 13.992\\",\\"11.992, 13.992\\",\\"0, 0\\",\\"ZO0645406454, ZO0166001660\\",\\"25.984\\",\\"25.984\\",2,2,order,mary +4wMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Sonya,Sonya,\\"Sonya Gilbert\\",\\"Sonya Gilbert\\",FEMALE,28,Gilbert,Gilbert,\\"(empty)\\",Tuesday,1,\\"sonya@gilbert-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567855,\\"sold_product_567855_12032, sold_product_567855_11434\\",\\"sold_product_567855_12032, sold_product_567855_11434\\",\\"21.984, 11.992\\",\\"21.984, 11.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"10.781, 6.23\\",\\"21.984, 11.992\\",\\"12,032, 11,434\\",\\"Jeggings - grey denim, Snood - black\\",\\"Jeggings - grey denim, Snood - black\\",\\"1, 1\\",\\"ZO0657106571, ZO0084800848\\",\\"0, 0\\",\\"21.984, 11.992\\",\\"21.984, 11.992\\",\\"0, 0\\",\\"ZO0657106571, ZO0084800848\\",\\"33.969\\",\\"33.969\\",2,2,order,sonya +UwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Palmer\\",\\"Fitzgerald Palmer\\",MALE,11,Palmer,Palmer,\\"(empty)\\",Tuesday,1,\\"fitzgerald@palmer-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567835,\\"sold_product_567835_12431, sold_product_567835_12612\\",\\"sold_product_567835_12431, sold_product_567835_12612\\",\\"24.984, 165\\",\\"24.984, 165\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"11.25, 89.063\\",\\"24.984, 165\\",\\"12,431, 12,612\\",\\"Hoodie - white, Boots - taupe\\",\\"Hoodie - white, Boots - taupe\\",\\"1, 1\\",\\"ZO0589405894, ZO0483304833\\",\\"0, 0\\",\\"24.984, 165\\",\\"24.984, 165\\",\\"0, 0\\",\\"ZO0589405894, ZO0483304833\\",190,190,2,2,order,fuzzy +VAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Robert,Robert,\\"Robert Stewart\\",\\"Robert Stewart\\",MALE,29,Stewart,Stewart,\\"(empty)\\",Tuesday,1,\\"robert@stewart-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567889,\\"sold_product_567889_14775, sold_product_567889_15520\\",\\"sold_product_567889_14775, sold_product_567889_15520\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"14.211, 20.156\\",\\"28.984, 42\\",\\"14,775, 15,520\\",\\"Chinos - black, Smart lace-ups - black\\",\\"Chinos - black, Smart lace-ups - black\\",\\"1, 1\\",\\"ZO0282202822, ZO0393003930\\",\\"0, 0\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"0, 0\\",\\"ZO0282202822, ZO0393003930\\",71,71,2,2,order,robert +dAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Frances,Frances,\\"Frances Goodwin\\",\\"Frances Goodwin\\",FEMALE,49,Goodwin,Goodwin,\\"(empty)\\",Tuesday,1,\\"frances@goodwin-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566852,\\"sold_product_566852_1709, sold_product_566852_11513\\",\\"sold_product_566852_1709, sold_product_566852_11513\\",\\"65, 20.984\\",\\"65, 20.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"35.094, 10.078\\",\\"65, 20.984\\",\\"1,709, 11,513\\",\\"Boots - black, Tracksuit top - bordeaux multicolor\\",\\"Boots - black, Tracksuit top - bordeaux multicolor\\",\\"1, 1\\",\\"ZO0257002570, ZO0455404554\\",\\"0, 0\\",\\"65, 20.984\\",\\"65, 20.984\\",\\"0, 0\\",\\"ZO0257002570, ZO0455404554\\",86,86,2,2,order,frances +dQMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Mccarthy\\",\\"Rabbia Al Mccarthy\\",FEMALE,5,Mccarthy,Mccarthy,\\"(empty)\\",Tuesday,1,\\"rabbia al@mccarthy-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567037,\\"sold_product_567037_16060, sold_product_567037_11158\\",\\"sold_product_567037_16060, sold_product_567037_11158\\",\\"20.984, 42\\",\\"20.984, 42\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"9.867, 22.672\\",\\"20.984, 42\\",\\"16,060, 11,158\\",\\"Clutch - gold, Classic heels - yellow\\",\\"Clutch - gold, Classic heels - yellow\\",\\"1, 1\\",\\"ZO0206402064, ZO0365903659\\",\\"0, 0\\",\\"20.984, 42\\",\\"20.984, 42\\",\\"0, 0\\",\\"ZO0206402064, ZO0365903659\\",\\"62.969\\",\\"62.969\\",2,2,order,rabbia +mAMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Harper\\",\\"Jackson Harper\\",MALE,13,Harper,Harper,\\"(empty)\\",Tuesday,1,\\"jackson@harper-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Elitelligence, (empty)\\",\\"Low Tide Media, Elitelligence, (empty)\\",\\"Jun 24, 2019 @ 00:00:00.000\\",721778,\\"sold_product_721778_1710, sold_product_721778_1718, sold_product_721778_12836, sold_product_721778_21677\\",\\"sold_product_721778_1710, sold_product_721778_1718, sold_product_721778_12836, sold_product_721778_21677\\",\\"65, 28.984, 165, 42\\",\\"65, 28.984, 165, 42\\",\\"Men's Shoes, Men's Shoes, Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Shoes, Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Elitelligence, (empty), Elitelligence\\",\\"Low Tide Media, Elitelligence, (empty), Elitelligence\\",\\"35.094, 15.359, 80.875, 22.25\\",\\"65, 28.984, 165, 42\\",\\"1,710, 1,718, 12,836, 21,677\\",\\"Boots - cognac, Lace-up boots - black, Lace-ups - brown, Light jacket - black\\",\\"Boots - cognac, Lace-up boots - black, Lace-ups - brown, Light jacket - black\\",\\"1, 1, 1, 1\\",\\"ZO0400004000, ZO0519305193, ZO0482004820, ZO0540305403\\",\\"0, 0, 0, 0\\",\\"65, 28.984, 165, 42\\",\\"65, 28.984, 165, 42\\",\\"0, 0, 0, 0\\",\\"ZO0400004000, ZO0519305193, ZO0482004820, ZO0540305403\\",301,301,4,4,order,jackson +2QMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Eddie,Eddie,\\"Eddie Foster\\",\\"Eddie Foster\\",MALE,38,Foster,Foster,\\"(empty)\\",Tuesday,1,\\"eddie@foster-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567143,\\"sold_product_567143_11605, sold_product_567143_16593\\",\\"sold_product_567143_11605, sold_product_567143_16593\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"11.75, 9.453\\",\\"24.984, 20.984\\",\\"11,605, 16,593\\",\\"Jumper - navy/offwhite/black, Wallet - brown\\",\\"Jumper - navy/offwhite/black, Wallet - brown\\",\\"1, 1\\",\\"ZO0573005730, ZO0313203132\\",\\"0, 0\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"0, 0\\",\\"ZO0573005730, ZO0313203132\\",\\"45.969\\",\\"45.969\\",2,2,order,eddie +2gMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Love\\",\\"Fitzgerald Love\\",MALE,11,Love,Love,\\"(empty)\\",Tuesday,1,\\"fitzgerald@love-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567191,\\"sold_product_567191_20587, sold_product_567191_16436\\",\\"sold_product_567191_20587, sold_product_567191_16436\\",\\"42, 13.992\\",\\"42, 13.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"22.672, 6.578\\",\\"42, 13.992\\",\\"20,587, 16,436\\",\\"Slim fit jeans - black denim, Pyjama bottoms - blue\\",\\"Slim fit jeans - black denim, Pyjama bottoms - blue\\",\\"1, 1\\",\\"ZO0113901139, ZO0478904789\\",\\"0, 0\\",\\"42, 13.992\\",\\"42, 13.992\\",\\"0, 0\\",\\"ZO0113901139, ZO0478904789\\",\\"55.969\\",\\"55.969\\",2,2,order,fuzzy +IQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Graves\\",\\"Wagdi Graves\\",MALE,15,Graves,Graves,\\"(empty)\\",Tuesday,1,\\"wagdi@graves-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567135,\\"sold_product_567135_24487, sold_product_567135_13221\\",\\"sold_product_567135_24487, sold_product_567135_13221\\",\\"20.984, 7.988\\",\\"20.984, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"10.906, 4.309\\",\\"20.984, 7.988\\",\\"24,487, 13,221\\",\\"Chinos - grey, Print T-shirt - white/dark blue\\",\\"Chinos - grey, Print T-shirt - white/dark blue\\",\\"1, 1\\",\\"ZO0528305283, ZO0549305493\\",\\"0, 0\\",\\"20.984, 7.988\\",\\"20.984, 7.988\\",\\"0, 0\\",\\"ZO0528305283, ZO0549305493\\",\\"28.984\\",\\"28.984\\",2,2,order,wagdi +UQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Martin\\",\\"Elyssa Martin\\",FEMALE,27,Martin,Martin,\\"(empty)\\",Tuesday,1,\\"elyssa@martin-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Spherecords Curvy, Gnomehouse\\",\\"Tigress Enterprises, Spherecords Curvy, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",727730,\\"sold_product_727730_17183, sold_product_727730_23436, sold_product_727730_25006, sold_product_727730_19624\\",\\"sold_product_727730_17183, sold_product_727730_23436, sold_product_727730_25006, sold_product_727730_19624\\",\\"28.984, 14.992, 34, 50\\",\\"28.984, 14.992, 34, 50\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Spherecords Curvy, Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Spherecords Curvy, Tigress Enterprises, Gnomehouse\\",\\"13.922, 7.199, 17, 27.484\\",\\"28.984, 14.992, 34, 50\\",\\"17,183, 23,436, 25,006, 19,624\\",\\"Shift dress - black/gold, Blouse - grey, Boots - cognac, Dress - inca gold\\",\\"Shift dress - black/gold, Blouse - grey, Boots - cognac, Dress - inca gold\\",\\"1, 1, 1, 1\\",\\"ZO0050600506, ZO0710907109, ZO0023300233, ZO0334603346\\",\\"0, 0, 0, 0\\",\\"28.984, 14.992, 34, 50\\",\\"28.984, 14.992, 34, 50\\",\\"0, 0, 0, 0\\",\\"ZO0050600506, ZO0710907109, ZO0023300233, ZO0334603346\\",\\"127.938\\",\\"127.938\\",4,4,order,elyssa +ywMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Jimenez\\",\\"Tariq Jimenez\\",MALE,25,Jimenez,Jimenez,\\"(empty)\\",Tuesday,1,\\"tariq@jimenez-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567939,\\"sold_product_567939_12984, sold_product_567939_3061\\",\\"sold_product_567939_12984, sold_product_567939_3061\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"6.352, 12\\",\\"11.992, 24.984\\",\\"12,984, 3,061\\",\\"Scarf - black/grey, Jeans Skinny Fit - dark blue\\",\\"Scarf - black/grey, Jeans Skinny Fit - dark blue\\",\\"1, 1\\",\\"ZO0127201272, ZO0425504255\\",\\"0, 0\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"0, 0\\",\\"ZO0127201272, ZO0425504255\\",\\"36.969\\",\\"36.969\\",2,2,order,tariq +zAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Irwin,Irwin,\\"Irwin Baker\\",\\"Irwin Baker\\",MALE,14,Baker,Baker,\\"(empty)\\",Tuesday,1,\\"irwin@baker-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567970,\\"sold_product_567970_23856, sold_product_567970_21614\\",\\"sold_product_567970_23856, sold_product_567970_21614\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"5.398, 31.844\\",\\"11.992, 65\\",\\"23,856, 21,614\\",\\"Polo shirt - dark grey multicolor, Casual lace-ups - taupe\\",\\"Polo shirt - dark grey multicolor, Casual lace-ups - taupe\\",\\"1, 1\\",\\"ZO0441504415, ZO0691606916\\",\\"0, 0\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"0, 0\\",\\"ZO0441504415, ZO0691606916\\",77,77,2,2,order,irwin +HgMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Garner\\",\\"Robbie Garner\\",MALE,48,Garner,Garner,\\"(empty)\\",Tuesday,1,\\"robbie@garner-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567301,\\"sold_product_567301_15025, sold_product_567301_24034\\",\\"sold_product_567301_15025, sold_product_567301_24034\\",\\"24.984, 10.992\\",\\"24.984, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"12.992, 5.711\\",\\"24.984, 10.992\\",\\"15,025, 24,034\\",\\"Jumper - black, Print T-shirt - blue/dark blue\\",\\"Jumper - black, Print T-shirt - blue/dark blue\\",\\"1, 1\\",\\"ZO0577605776, ZO0438104381\\",\\"0, 0\\",\\"24.984, 10.992\\",\\"24.984, 10.992\\",\\"0, 0\\",\\"ZO0577605776, ZO0438104381\\",\\"35.969\\",\\"35.969\\",2,2,order,robbie +TgMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Allison\\",\\"Yuri Allison\\",MALE,21,Allison,Allison,\\"(empty)\\",Tuesday,1,\\"yuri@allison-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566801,\\"sold_product_566801_10990, sold_product_566801_11992\\",\\"sold_product_566801_10990, sold_product_566801_11992\\",\\"25.984, 22.984\\",\\"25.984, 22.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"13.508, 10.813\\",\\"25.984, 22.984\\",\\"10,990, 11,992\\",\\"Shirt - aubergine, Jumper - grey multicolor\\",\\"Shirt - aubergine, Jumper - grey multicolor\\",\\"1, 1\\",\\"ZO0279702797, ZO0573705737\\",\\"0, 0\\",\\"25.984, 22.984\\",\\"25.984, 22.984\\",\\"0, 0\\",\\"ZO0279702797, ZO0573705737\\",\\"48.969\\",\\"48.969\\",2,2,order,yuri +WgMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Goodwin\\",\\"Yuri Goodwin\\",MALE,21,Goodwin,Goodwin,\\"(empty)\\",Tuesday,1,\\"yuri@goodwin-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566685,\\"sold_product_566685_18957, sold_product_566685_20093\\",\\"sold_product_566685_18957, sold_product_566685_20093\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"11.75, 9.656\\",\\"24.984, 20.984\\",\\"18,957, 20,093\\",\\"Jumper - black, Tracksuit bottoms - mottled light grey\\",\\"Jumper - black, Tracksuit bottoms - mottled light grey\\",\\"1, 1\\",\\"ZO0296902969, ZO0530205302\\",\\"0, 0\\",\\"24.984, 20.984\\",\\"24.984, 20.984\\",\\"0, 0\\",\\"ZO0296902969, ZO0530205302\\",\\"45.969\\",\\"45.969\\",2,2,order,yuri +WwMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Mary,Mary,\\"Mary Hansen\\",\\"Mary Hansen\\",FEMALE,20,Hansen,Hansen,\\"(empty)\\",Tuesday,1,\\"mary@hansen-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566924,\\"sold_product_566924_17824, sold_product_566924_24036\\",\\"sold_product_566924_17824, sold_product_566924_24036\\",\\"75, 13.992\\",\\"75, 13.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"35.25, 6.301\\",\\"75, 13.992\\",\\"17,824, 24,036\\",\\"Ankle boots - light brown, Print T-shirt - light grey multicolor\\",\\"Ankle boots - light brown, Print T-shirt - light grey multicolor\\",\\"1, 1\\",\\"ZO0673606736, ZO0161801618\\",\\"0, 0\\",\\"75, 13.992\\",\\"75, 13.992\\",\\"0, 0\\",\\"ZO0673606736, ZO0161801618\\",89,89,2,2,order,mary +cQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Lambert\\",\\"Fitzgerald Lambert\\",MALE,11,Lambert,Lambert,\\"(empty)\\",Tuesday,1,\\"fitzgerald@lambert-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Spritechnologies\\",\\"Oceanavigations, Spritechnologies\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567662,\\"sold_product_567662_24046, sold_product_567662_19131\\",\\"sold_product_567662_24046, sold_product_567662_19131\\",\\"11.992, 33\\",\\"11.992, 33\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spritechnologies\\",\\"Oceanavigations, Spritechnologies\\",\\"5.762, 16.172\\",\\"11.992, 33\\",\\"24,046, 19,131\\",\\"Hat - black, Neutral running shoes - black/yellow\\",\\"Hat - black, Neutral running shoes - black/yellow\\",\\"1, 1\\",\\"ZO0308903089, ZO0614306143\\",\\"0, 0\\",\\"11.992, 33\\",\\"11.992, 33\\",\\"0, 0\\",\\"ZO0308903089, ZO0614306143\\",\\"44.969\\",\\"44.969\\",2,2,order,fuzzy +cgMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Mary,Mary,\\"Mary Reese\\",\\"Mary Reese\\",FEMALE,20,Reese,Reese,\\"(empty)\\",Tuesday,1,\\"mary@reese-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567708,\\"sold_product_567708_21991, sold_product_567708_14420\\",\\"sold_product_567708_21991, sold_product_567708_14420\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"12.492, 19.313\\",\\"24.984, 42\\",\\"21,991, 14,420\\",\\"Rucksack - black, Across body bag - black\\",\\"Rucksack - black, Across body bag - black\\",\\"1, 1\\",\\"ZO0090500905, ZO0466204662\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0090500905, ZO0466204662\\",67,67,2,2,order,mary +yQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Dennis\\",\\"Gwen Dennis\\",FEMALE,26,Dennis,Dennis,\\"(empty)\\",Tuesday,1,\\"gwen@dennis-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567573,\\"sold_product_567573_18097, sold_product_567573_23199\\",\\"sold_product_567573_18097, sold_product_567573_23199\\",\\"11.992, 42\\",\\"11.992, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"5.879, 20.156\\",\\"11.992, 42\\",\\"18,097, 23,199\\",\\"7 PACK - Socks - multicoloured, Dress - navy blazer\\",\\"7 PACK - Socks - multicoloured, Dress - navy blazer\\",\\"1, 1\\",\\"ZO0215602156, ZO0336803368\\",\\"0, 0\\",\\"11.992, 42\\",\\"11.992, 42\\",\\"0, 0\\",\\"ZO0215602156, ZO0336803368\\",\\"53.969\\",\\"53.969\\",2,2,order,gwen +AQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Banks\\",\\"Jackson Banks\\",MALE,13,Banks,Banks,\\"(empty)\\",Tuesday,1,\\"jackson@banks-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Angeldale, Elitelligence, Low Tide Media\\",\\"Angeldale, Elitelligence, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",717603,\\"sold_product_717603_12011, sold_product_717603_6533, sold_product_717603_6991, sold_product_717603_6182\\",\\"sold_product_717603_12011, sold_product_717603_6533, sold_product_717603_6991, sold_product_717603_6182\\",\\"55, 28.984, 38, 10.992\\",\\"55, 28.984, 38, 10.992\\",\\"Men's Shoes, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Shoes, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Elitelligence, Low Tide Media, Elitelligence\\",\\"Angeldale, Elitelligence, Low Tide Media, Elitelligence\\",\\"28.047, 13.344, 20.125, 5.82\\",\\"55, 28.984, 38, 10.992\\",\\"12,011, 6,533, 6,991, 6,182\\",\\"Slip-ons - black, Sweatshirt - black/white/mottled grey, Jumper - dark blue, Print T-shirt - white\\",\\"Slip-ons - black, Sweatshirt - black/white/mottled grey, Jumper - dark blue, Print T-shirt - white\\",\\"1, 1, 1, 1\\",\\"ZO0685306853, ZO0585305853, ZO0450504505, ZO0552405524\\",\\"0, 0, 0, 0\\",\\"55, 28.984, 38, 10.992\\",\\"55, 28.984, 38, 10.992\\",\\"0, 0, 0, 0\\",\\"ZO0685306853, ZO0585305853, ZO0450504505, ZO0552405524\\",133,133,4,4,order,jackson +HQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Padilla\\",\\"Wilhemina St. Padilla\\",FEMALE,17,Padilla,Padilla,\\"(empty)\\",Tuesday,1,\\"wilhemina st.@padilla-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566986,\\"sold_product_566986_11438, sold_product_566986_5014\\",\\"sold_product_566986_11438, sold_product_566986_5014\\",\\"75, 33\\",\\"75, 33\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"39.75, 15.18\\",\\"75, 33\\",\\"11,438, 5,014\\",\\"High heeled sandals - Midnight Blue, Boots - cognac\\",\\"High heeled sandals - Midnight Blue, Boots - cognac\\",\\"1, 1\\",\\"ZO0360903609, ZO0030100301\\",\\"0, 0\\",\\"75, 33\\",\\"75, 33\\",\\"0, 0\\",\\"ZO0360903609, ZO0030100301\\",108,108,2,2,order,wilhemina +HgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Rice\\",\\"Clarice Rice\\",FEMALE,18,Rice,Rice,\\"(empty)\\",Tuesday,1,\\"clarice@rice-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566735,\\"sold_product_566735_24785, sold_product_566735_19239\\",\\"sold_product_566735_24785, sold_product_566735_19239\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"9.172, 12.992\\",\\"16.984, 24.984\\",\\"24,785, 19,239\\",\\"Tracksuit bottoms - dark grey multicolor, Long sleeved top - black\\",\\"Tracksuit bottoms - dark grey multicolor, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0632406324, ZO0060300603\\",\\"0, 0\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"0, 0\\",\\"ZO0632406324, ZO0060300603\\",\\"41.969\\",\\"41.969\\",2,2,order,clarice +HwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Mostafa,Mostafa,\\"Mostafa Conner\\",\\"Mostafa Conner\\",MALE,9,Conner,Conner,\\"(empty)\\",Tuesday,1,\\"mostafa@conner-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567082,\\"sold_product_567082_18373, sold_product_567082_15037\\",\\"sold_product_567082_18373, sold_product_567082_15037\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"13.492, 12.992\\",\\"24.984, 24.984\\",\\"18,373, 15,037\\",\\"Shirt - grey, Trainers - dusty blue\\",\\"Shirt - grey, Trainers - dusty blue\\",\\"1, 1\\",\\"ZO0278802788, ZO0515605156\\",\\"0, 0\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"0, 0\\",\\"ZO0278802788, ZO0515605156\\",\\"49.969\\",\\"49.969\\",2,2,order,mostafa +IAMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Irwin,Irwin,\\"Irwin Potter\\",\\"Irwin Potter\\",MALE,14,Potter,Potter,\\"(empty)\\",Tuesday,1,\\"irwin@potter-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566881,\\"sold_product_566881_16129, sold_product_566881_19224\\",\\"sold_product_566881_16129, sold_product_566881_19224\\",\\"24.984, 14.992\\",\\"24.984, 14.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"12.492, 8.094\\",\\"24.984, 14.992\\",\\"16,129, 19,224\\",\\"Trousers - navy, Long sleeved top - white/blue/red\\",\\"Trousers - navy, Long sleeved top - white/blue/red\\",\\"1, 1\\",\\"ZO0419604196, ZO0559705597\\",\\"0, 0\\",\\"24.984, 14.992\\",\\"24.984, 14.992\\",\\"0, 0\\",\\"ZO0419604196, ZO0559705597\\",\\"39.969\\",\\"39.969\\",2,2,order,irwin +YwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Mary,Mary,\\"Mary Reese\\",\\"Mary Reese\\",FEMALE,20,Reese,Reese,\\"(empty)\\",Tuesday,1,\\"mary@reese-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Spherecords\\",\\"Angeldale, Spherecords\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566790,\\"sold_product_566790_18851, sold_product_566790_22361\\",\\"sold_product_566790_18851, sold_product_566790_22361\\",\\"65, 10.992\\",\\"65, 10.992\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Spherecords\\",\\"Angeldale, Spherecords\\",\\"31.844, 4.949\\",\\"65, 10.992\\",\\"18,851, 22,361\\",\\"Tote bag - black, Long sleeved top - black\\",\\"Tote bag - black, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0699206992, ZO0641306413\\",\\"0, 0\\",\\"65, 10.992\\",\\"65, 10.992\\",\\"0, 0\\",\\"ZO0699206992, ZO0641306413\\",76,76,2,2,order,mary +bwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Gomez\\",\\"Eddie Gomez\\",MALE,38,Gomez,Gomez,\\"(empty)\\",Tuesday,1,\\"eddie@gomez-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566706,\\"sold_product_566706_1717, sold_product_566706_17829\\",\\"sold_product_566706_1717, sold_product_566706_17829\\",\\"46, 10.992\\",\\"46, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"23.453, 5.602\\",\\"46, 10.992\\",\\"1,717, 17,829\\",\\"Boots - grey, 3 PACK - Socks - khaki/grey\\",\\"Boots - grey, 3 PACK - Socks - khaki/grey\\",\\"1, 1\\",\\"ZO0521505215, ZO0130501305\\",\\"0, 0\\",\\"46, 10.992\\",\\"46, 10.992\\",\\"0, 0\\",\\"ZO0521505215, ZO0130501305\\",\\"56.969\\",\\"56.969\\",2,2,order,eddie +cAMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Phil,Phil,\\"Phil Boone\\",\\"Phil Boone\\",MALE,50,Boone,Boone,\\"(empty)\\",Tuesday,1,\\"phil@boone-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566935,\\"sold_product_566935_7024, sold_product_566935_20507\\",\\"sold_product_566935_7024, sold_product_566935_20507\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"9, 15.938\\",\\"16.984, 28.984\\",\\"7,024, 20,507\\",\\"3 PACK - Basic T-shirt - white/black/grey, Jumper - dark green\\",\\"3 PACK - Basic T-shirt - white/black/grey, Jumper - dark green\\",\\"1, 1\\",\\"ZO0473704737, ZO0121501215\\",\\"0, 0\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"0, 0\\",\\"ZO0473704737, ZO0121501215\\",\\"45.969\\",\\"45.969\\",2,2,order,phil +cQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Burton\\",\\"Selena Burton\\",FEMALE,42,Burton,Burton,\\"(empty)\\",Tuesday,1,\\"selena@burton-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566985,\\"sold_product_566985_18522, sold_product_566985_22213\\",\\"sold_product_566985_18522, sold_product_566985_22213\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"25.484, 12.742\\",\\"50, 24.984\\",\\"18,522, 22,213\\",\\"Cocktail dress / Party dress - taupe, Sweatshirt - blue\\",\\"Cocktail dress / Party dress - taupe, Sweatshirt - blue\\",\\"1, 1\\",\\"ZO0044700447, ZO0502105021\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0044700447, ZO0502105021\\",75,75,2,2,order,selena +cgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Clayton\\",\\"Eddie Clayton\\",MALE,38,Clayton,Clayton,\\"(empty)\\",Tuesday,1,\\"eddie@clayton-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 24, 2019 @ 00:00:00.000\\",566729,\\"sold_product_566729_23918, sold_product_566729_11251\\",\\"sold_product_566729_23918, sold_product_566729_11251\\",\\"7.988, 28.984\\",\\"7.988, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"4.148, 13.633\\",\\"7.988, 28.984\\",\\"23,918, 11,251\\",\\"Print T-shirt - red, Shirt - red/black\\",\\"Print T-shirt - red, Shirt - red/black\\",\\"1, 1\\",\\"ZO0557305573, ZO0110401104\\",\\"0, 0\\",\\"7.988, 28.984\\",\\"7.988, 28.984\\",\\"0, 0\\",\\"ZO0557305573, ZO0110401104\\",\\"36.969\\",\\"36.969\\",2,2,order,eddie +cwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Gwen,Gwen,\\"Gwen Weber\\",\\"Gwen Weber\\",FEMALE,26,Weber,Weber,\\"(empty)\\",Tuesday,1,\\"gwen@weber-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567095,\\"sold_product_567095_18015, sold_product_567095_16489\\",\\"sold_product_567095_18015, sold_product_567095_16489\\",\\"60, 16.984\\",\\"60, 16.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"30, 7.82\\",\\"60, 16.984\\",\\"18,015, 16,489\\",\\"Summer dress - blue fog, Clutch - red \\",\\"Summer dress - blue fog, Clutch - red \\",\\"1, 1\\",\\"ZO0339803398, ZO0098200982\\",\\"0, 0\\",\\"60, 16.984\\",\\"60, 16.984\\",\\"0, 0\\",\\"ZO0339803398, ZO0098200982\\",77,77,2,2,order,gwen +igMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Shaw\\",\\"Elyssa Shaw\\",FEMALE,27,Shaw,Shaw,\\"(empty)\\",Tuesday,1,\\"elyssa@shaw-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Champion Arts, Spherecords, Gnomehouse, Angeldale\\",\\"Champion Arts, Spherecords, Gnomehouse, Angeldale\\",\\"Jun 24, 2019 @ 00:00:00.000\\",724326,\\"sold_product_724326_10916, sold_product_724326_19683, sold_product_724326_24375, sold_product_724326_22263\\",\\"sold_product_724326_10916, sold_product_724326_19683, sold_product_724326_24375, sold_product_724326_22263\\",\\"20.984, 10.992, 42, 75\\",\\"20.984, 10.992, 42, 75\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Champion Arts, Spherecords, Gnomehouse, Angeldale\\",\\"Champion Arts, Spherecords, Gnomehouse, Angeldale\\",\\"10.906, 5.82, 22.672, 35.25\\",\\"20.984, 10.992, 42, 75\\",\\"10,916, 19,683, 24,375, 22,263\\",\\"Sweatshirt - black, 2 PACK - Vest - black/white, Summer dress - soft pink, Platform boots - black\\",\\"Sweatshirt - black, 2 PACK - Vest - black/white, Summer dress - soft pink, Platform boots - black\\",\\"1, 1, 1, 1\\",\\"ZO0499404994, ZO0641606416, ZO0334303343, ZO0676706767\\",\\"0, 0, 0, 0\\",\\"20.984, 10.992, 42, 75\\",\\"20.984, 10.992, 42, 75\\",\\"0, 0, 0, 0\\",\\"ZO0499404994, ZO0641606416, ZO0334303343, ZO0676706767\\",149,149,4,4,order,elyssa +DAMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al Cunningham\\",\\"Ahmed Al Cunningham\\",MALE,4,Cunningham,Cunningham,\\"(empty)\\",Tuesday,1,\\"ahmed al@cunningham-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Elitelligence,Elitelligence,\\"Jun 24, 2019 @ 00:00:00.000\\",567806,\\"sold_product_567806_17139, sold_product_567806_14215\\",\\"sold_product_567806_17139, sold_product_567806_14215\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"11.328, 5.641\\",\\"20.984, 11.992\\",\\"17,139, 14,215\\",\\"Trainers - grey, Print T-shirt - black\\",\\"Trainers - grey, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0517705177, ZO0569305693\\",\\"0, 0\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"0, 0\\",\\"ZO0517705177, ZO0569305693\\",\\"32.969\\",\\"32.969\\",2,2,order,ahmed +fAMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Clarice,Clarice,\\"Clarice Walters\\",\\"Clarice Walters\\",FEMALE,18,Walters,Walters,\\"(empty)\\",Tuesday,1,\\"clarice@walters-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567973,\\"sold_product_567973_24178, sold_product_567973_13294\\",\\"sold_product_567973_24178, sold_product_567973_13294\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"5.762, 34.438\\",\\"11.992, 65\\",\\"24,178, 13,294\\",\\"Print T-shirt - white, Tote bag - Blue Violety\\",\\"Print T-shirt - white, Tote bag - Blue Violety\\",\\"1, 1\\",\\"ZO0495104951, ZO0305903059\\",\\"0, 0\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"0, 0\\",\\"ZO0495104951, ZO0305903059\\",77,77,2,2,order,clarice +qQMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Harper\\",\\"Rabbia Al Harper\\",FEMALE,5,Harper,Harper,\\"(empty)\\",Tuesday,1,\\"rabbia al@harper-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Pyramidustries active\\",\\"Angeldale, Pyramidustries active\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567341,\\"sold_product_567341_5526, sold_product_567341_18975\\",\\"sold_product_567341_5526, sold_product_567341_18975\\",\\"90, 17.984\\",\\"90, 17.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Pyramidustries active\\",\\"Angeldale, Pyramidustries active\\",\\"47.688, 8.992\\",\\"90, 17.984\\",\\"5,526, 18,975\\",\\"Boots - black, Long sleeved top - black\\",\\"Boots - black, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0674506745, ZO0219202192\\",\\"0, 0\\",\\"90, 17.984\\",\\"90, 17.984\\",\\"0, 0\\",\\"ZO0674506745, ZO0219202192\\",108,108,2,2,order,rabbia +tQMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Kamal,Kamal,\\"Kamal Shaw\\",\\"Kamal Shaw\\",MALE,39,Shaw,Shaw,\\"(empty)\\",Tuesday,1,\\"kamal@shaw-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567492,\\"sold_product_567492_14648, sold_product_567492_12310\\",\\"sold_product_567492_14648, sold_product_567492_12310\\",\\"13.992, 17.984\\",\\"13.992, 17.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"6.719, 9.352\\",\\"13.992, 17.984\\",\\"14,648, 12,310\\",\\"Tie - dark grey, Polo shirt - grey\\",\\"Tie - dark grey, Polo shirt - grey\\",\\"1, 1\\",\\"ZO0277302773, ZO0443004430\\",\\"0, 0\\",\\"13.992, 17.984\\",\\"13.992, 17.984\\",\\"0, 0\\",\\"ZO0277302773, ZO0443004430\\",\\"31.984\\",\\"31.984\\",2,2,order,kamal +tgMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Irwin,Irwin,\\"Irwin Jenkins\\",\\"Irwin Jenkins\\",MALE,14,Jenkins,Jenkins,\\"(empty)\\",Tuesday,1,\\"irwin@jenkins-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567654,\\"sold_product_567654_22409, sold_product_567654_1312\\",\\"sold_product_567654_22409, sold_product_567654_1312\\",\\"11.992, 50\\",\\"11.992, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"5.762, 24\\",\\"11.992, 50\\",\\"22,409, 1,312\\",\\"Basic T-shirt - Dark Salmon, Lace-up boots - black\\",\\"Basic T-shirt - Dark Salmon, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0121301213, ZO0399403994\\",\\"0, 0\\",\\"11.992, 50\\",\\"11.992, 50\\",\\"0, 0\\",\\"ZO0121301213, ZO0399403994\\",\\"61.969\\",\\"61.969\\",2,2,order,irwin +uAMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Betty,Betty,\\"Betty Rivera\\",\\"Betty Rivera\\",FEMALE,44,Rivera,Rivera,\\"(empty)\\",Tuesday,1,\\"betty@rivera-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567403,\\"sold_product_567403_20386, sold_product_567403_23991\\",\\"sold_product_567403_20386, sold_product_567403_23991\\",\\"60, 42\\",\\"60, 42\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"30, 19.313\\",\\"60, 42\\",\\"20,386, 23,991\\",\\"Over-the-knee boots - cognac, Trousers - black\\",\\"Over-the-knee boots - cognac, Trousers - black\\",\\"1, 1\\",\\"ZO0138601386, ZO0259202592\\",\\"0, 0\\",\\"60, 42\\",\\"60, 42\\",\\"0, 0\\",\\"ZO0138601386, ZO0259202592\\",102,102,2,2,order,betty +DgMtOW0BH63Xcmy46HPV,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Mary,Mary,\\"Mary Hampton\\",\\"Mary Hampton\\",FEMALE,20,Hampton,Hampton,\\"(empty)\\",Tuesday,1,\\"mary@hampton-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Microlutions\\",\\"Tigress Enterprises, Microlutions\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567207,\\"sold_product_567207_17489, sold_product_567207_14916\\",\\"sold_product_567207_17489, sold_product_567207_14916\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Microlutions\\",\\"Tigress Enterprises, Microlutions\\",\\"12, 28.203\\",\\"24.984, 60\\",\\"17,489, 14,916\\",\\"Denim skirt - dark blue denim, Bomber Jacket - black\\",\\"Denim skirt - dark blue denim, Bomber Jacket - black\\",\\"1, 1\\",\\"ZO0033600336, ZO0109401094\\",\\"0, 0\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"0, 0\\",\\"ZO0033600336, ZO0109401094\\",85,85,2,2,order,mary +DwMtOW0BH63Xcmy46HPV,ecommerce,\\"-\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Hopkins\\",\\"Jackson Hopkins\\",MALE,13,Hopkins,Hopkins,\\"(empty)\\",Tuesday,1,\\"jackson@hopkins-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 24, 2019 @ 00:00:00.000\\",567356,\\"sold_product_567356_13525, sold_product_567356_11169\\",\\"sold_product_567356_13525, sold_product_567356_11169\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",\\"Dec 13, 2016 @ 00:00:00.000, Dec 13, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"24.5, 5.602\\",\\"50, 10.992\\",\\"13,525, 11,169\\",\\"Weekend bag - sand, Tie - grey\\",\\"Weekend bag - sand, Tie - grey\\",\\"1, 1\\",\\"ZO0319503195, ZO0409904099\\",\\"0, 0\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"0, 0\\",\\"ZO0319503195, ZO0409904099\\",\\"60.969\\",\\"60.969\\",2,2,order,jackson +0wMtOW0BH63Xcmy432DJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Oliver,Oliver,\\"Oliver Rios\\",\\"Oliver Rios\\",MALE,7,Rios,Rios,\\"(empty)\\",Monday,0,\\"oliver@rios-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565855,\\"sold_product_565855_19919, sold_product_565855_24502\\",\\"sold_product_565855_19919, sold_product_565855_24502\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"9.867, 12.492\\",\\"20.984, 24.984\\",\\"19,919, 24,502\\",\\"Shirt - dark blue white, Slim fit jeans - raw blue\\",\\"Shirt - dark blue white, Slim fit jeans - raw blue\\",\\"1, 1\\",\\"ZO0417504175, ZO0535205352\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0417504175, ZO0535205352\\",\\"45.969\\",\\"45.969\\",2,2,order,oliver +NgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Ball\\",\\"Sultan Al Ball\\",MALE,19,Ball,Ball,\\"(empty)\\",Monday,0,\\"sultan al@ball-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",565915,\\"sold_product_565915_13822, sold_product_565915_13150\\",\\"sold_product_565915_13822, sold_product_565915_13150\\",\\"42, 16.984\\",\\"42, 16.984\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"21, 9\\",\\"42, 16.984\\",\\"13,822, 13,150\\",\\"High-top trainers - black, High-top trainers - brown\\",\\"High-top trainers - black, High-top trainers - brown\\",\\"1, 1\\",\\"ZO0515005150, ZO0509805098\\",\\"0, 0\\",\\"42, 16.984\\",\\"42, 16.984\\",\\"0, 0\\",\\"ZO0515005150, ZO0509805098\\",\\"58.969\\",\\"58.969\\",2,2,order,sultan +SAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Dixon\\",\\"Elyssa Dixon\\",FEMALE,27,Dixon,Dixon,\\"(empty)\\",Monday,0,\\"elyssa@dixon-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566343,\\"sold_product_566343_16050, sold_product_566343_14327\\",\\"sold_product_566343_16050, sold_product_566343_14327\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"14.781, 22.25\\",\\"28.984, 42\\",\\"16,050, 14,327\\",\\"Winter jacket - black, Summer dress - black/Chocolate\\",\\"Winter jacket - black, Summer dress - black/Chocolate\\",\\"1, 1\\",\\"ZO0185101851, ZO0052800528\\",\\"0, 0\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"0, 0\\",\\"ZO0185101851, ZO0052800528\\",71,71,2,2,order,elyssa +SQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Gwen,Gwen,\\"Gwen Ball\\",\\"Gwen Ball\\",FEMALE,26,Ball,Ball,\\"(empty)\\",Monday,0,\\"gwen@ball-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566400,\\"sold_product_566400_18643, sold_product_566400_24426\\",\\"sold_product_566400_18643, sold_product_566400_24426\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"9.867, 13.633\\",\\"20.984, 28.984\\",\\"18,643, 24,426\\",\\"Handbag - Blue Violety, Slip-ons - nude\\",\\"Handbag - Blue Violety, Slip-ons - nude\\",\\"1, 1\\",\\"ZO0204702047, ZO0009600096\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0204702047, ZO0009600096\\",\\"49.969\\",\\"49.969\\",2,2,order,gwen +aAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Palmer\\",\\"Gwen Palmer\\",FEMALE,26,Palmer,Palmer,\\"(empty)\\",Monday,0,\\"gwen@palmer-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,Gnomehouse,Gnomehouse,\\"Jun 23, 2019 @ 00:00:00.000\\",565776,\\"sold_product_565776_23882, sold_product_565776_8692\\",\\"sold_product_565776_23882, sold_product_565776_8692\\",\\"33, 29.984\\",\\"33, 29.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Gnomehouse\\",\\"Gnomehouse, Gnomehouse\\",\\"16.813, 13.797\\",\\"33, 29.984\\",\\"23,882, 8,692\\",\\"Long sleeved top - chinese red, Blouse - blue fog\\",\\"Long sleeved top - chinese red, Blouse - blue fog\\",\\"1, 1\\",\\"ZO0343103431, ZO0345803458\\",\\"0, 0\\",\\"33, 29.984\\",\\"33, 29.984\\",\\"0, 0\\",\\"ZO0343103431, ZO0345803458\\",\\"62.969\\",\\"62.969\\",2,2,order,gwen +bgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Greer\\",\\"Yuri Greer\\",MALE,21,Greer,Greer,\\"(empty)\\",Monday,0,\\"yuri@greer-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",566607,\\"sold_product_566607_3014, sold_product_566607_18884\\",\\"sold_product_566607_3014, sold_product_566607_18884\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"10.492, 9.656\\",\\"20.984, 20.984\\",\\"3,014, 18,884\\",\\"Cardigan - grey multicolor, Sweatshirt - black /white\\",\\"Cardigan - grey multicolor, Sweatshirt - black /white\\",\\"1, 1\\",\\"ZO0572205722, ZO0585205852\\",\\"0, 0\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"0, 0\\",\\"ZO0572205722, ZO0585205852\\",\\"41.969\\",\\"41.969\\",2,2,order,yuri +jgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Cortez\\",\\"Elyssa Cortez\\",FEMALE,27,Cortez,Cortez,\\"(empty)\\",Monday,0,\\"elyssa@cortez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565452,\\"sold_product_565452_22934, sold_product_565452_13388\\",\\"sold_product_565452_22934, sold_product_565452_13388\\",\\"42, 14.992\\",\\"42, 14.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"22.25, 7.352\\",\\"42, 14.992\\",\\"22,934, 13,388\\",\\"High heels - black, 2 PACK - Vest - white/dark blue/dark blue\\",\\"High heels - black, 2 PACK - Vest - white/dark blue/dark blue\\",\\"1, 1\\",\\"ZO0133601336, ZO0643906439\\",\\"0, 0\\",\\"42, 14.992\\",\\"42, 14.992\\",\\"0, 0\\",\\"ZO0133601336, ZO0643906439\\",\\"56.969\\",\\"56.969\\",2,2,order,elyssa +kQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Smith\\",\\"Abigail Smith\\",FEMALE,46,Smith,Smith,\\"(empty)\\",Monday,0,\\"abigail@smith-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566051,\\"sold_product_566051_16134, sold_product_566051_23328\\",\\"sold_product_566051_16134, sold_product_566051_23328\\",\\"24.984, 50\\",\\"24.984, 50\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"13.492, 26.484\\",\\"24.984, 50\\",\\"16,134, 23,328\\",\\"Cowboy/Biker boots - light grey, Blazer - black\\",\\"Cowboy/Biker boots - light grey, Blazer - black\\",\\"1, 1\\",\\"ZO0025600256, ZO0270202702\\",\\"0, 0\\",\\"24.984, 50\\",\\"24.984, 50\\",\\"0, 0\\",\\"ZO0025600256, ZO0270202702\\",75,75,2,2,order,abigail +qgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Mccarthy\\",\\"Sultan Al Mccarthy\\",MALE,19,Mccarthy,Mccarthy,\\"(empty)\\",Monday,0,\\"sultan al@mccarthy-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565466,\\"sold_product_565466_10951, sold_product_565466_11989\\",\\"sold_product_565466_10951, sold_product_565466_11989\\",\\"42, 45\\",\\"42, 45\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"19.313, 24.734\\",\\"42, 45\\",\\"10,951, 11,989\\",\\"Summer jacket - navy, Light jacket - khaki\\",\\"Summer jacket - navy, Light jacket - khaki\\",\\"1, 1\\",\\"ZO0285402854, ZO0538605386\\",\\"0, 0\\",\\"42, 45\\",\\"42, 45\\",\\"0, 0\\",\\"ZO0285402854, ZO0538605386\\",87,87,2,2,order,sultan +9gMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Riley\\",\\"Mostafa Riley\\",MALE,9,Riley,Riley,\\"(empty)\\",Monday,0,\\"mostafa@riley-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566553,\\"sold_product_566553_18385, sold_product_566553_15343\\",\\"sold_product_566553_18385, sold_product_566553_15343\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"4.07, 32.375\\",\\"7.988, 60\\",\\"18,385, 15,343\\",\\"Basic T-shirt - dark grey multicolor, Parka - khaki\\",\\"Basic T-shirt - dark grey multicolor, Parka - khaki\\",\\"1, 1\\",\\"ZO0435004350, ZO0544005440\\",\\"0, 0\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"0, 0\\",\\"ZO0435004350, ZO0544005440\\",68,68,2,2,order,mostafa +AQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Yasmine,Yasmine,\\"Yasmine Wolfe\\",\\"Yasmine Wolfe\\",FEMALE,43,Wolfe,Wolfe,\\"(empty)\\",Monday,0,\\"yasmine@wolfe-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565446,\\"sold_product_565446_12090, sold_product_565446_12122\\",\\"sold_product_565446_12090, sold_product_565446_12122\\",\\"11.992, 29.984\\",\\"11.992, 29.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"5.641, 15.594\\",\\"11.992, 29.984\\",\\"12,090, 12,122\\",\\"Long sleeved top - black, Winter boots - black\\",\\"Long sleeved top - black, Winter boots - black\\",\\"1, 1\\",\\"ZO0643206432, ZO0140101401\\",\\"0, 0\\",\\"11.992, 29.984\\",\\"11.992, 29.984\\",\\"0, 0\\",\\"ZO0643206432, ZO0140101401\\",\\"41.969\\",\\"41.969\\",2,2,order,yasmine +MQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Carpenter\\",\\"Wagdi Carpenter\\",MALE,15,Carpenter,Carpenter,\\"(empty)\\",Monday,0,\\"wagdi@carpenter-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",Oceanavigations,Oceanavigations,\\"Jun 23, 2019 @ 00:00:00.000\\",566053,\\"sold_product_566053_2650, sold_product_566053_21018\\",\\"sold_product_566053_2650, sold_product_566053_21018\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"13.344, 9.867\\",\\"28.984, 20.984\\",\\"2,650, 21,018\\",\\"Slim fit jeans - black, Jumper - charcoal\\",\\"Slim fit jeans - black, Jumper - charcoal\\",\\"1, 1\\",\\"ZO0284702847, ZO0299202992\\",\\"0, 0\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"0, 0\\",\\"ZO0284702847, ZO0299202992\\",\\"49.969\\",\\"49.969\\",2,2,order,wagdi +UgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Schultz\\",\\"Jackson Schultz\\",MALE,13,Schultz,Schultz,\\"(empty)\\",Monday,0,\\"jackson@schultz-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565605,\\"sold_product_565605_24934, sold_product_565605_22732\\",\\"sold_product_565605_24934, sold_product_565605_22732\\",\\"50, 33\\",\\"50, 33\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"22.5, 16.172\\",\\"50, 33\\",\\"24,934, 22,732\\",\\"Lace-up boots - resin coffee, Relaxed fit jeans - black denim\\",\\"Lace-up boots - resin coffee, Relaxed fit jeans - black denim\\",\\"1, 1\\",\\"ZO0403504035, ZO0113301133\\",\\"0, 0\\",\\"50, 33\\",\\"50, 33\\",\\"0, 0\\",\\"ZO0403504035, ZO0113301133\\",83,83,2,2,order,jackson +lAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Abigail,Abigail,\\"Abigail Phelps\\",\\"Abigail Phelps\\",FEMALE,46,Phelps,Phelps,\\"(empty)\\",Monday,0,\\"abigail@phelps-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Gnomehouse, Karmanite\\",\\"Gnomehouse, Karmanite\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566170,\\"sold_product_566170_7278, sold_product_566170_5214\\",\\"sold_product_566170_7278, sold_product_566170_5214\\",\\"65, 85\\",\\"65, 85\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Karmanite\\",\\"Gnomehouse, Karmanite\\",\\"31.844, 43.344\\",\\"65, 85\\",\\"7,278, 5,214\\",\\"Boots - navy, Ankle boots - wood\\",\\"Boots - navy, Ankle boots - wood\\",\\"1, 1\\",\\"ZO0324803248, ZO0703907039\\",\\"0, 0\\",\\"65, 85\\",\\"65, 85\\",\\"0, 0\\",\\"ZO0324803248, ZO0703907039\\",150,150,2,2,order,abigail +lQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Perkins\\",\\"Abd Perkins\\",MALE,52,Perkins,Perkins,\\"(empty)\\",Monday,0,\\"abd@perkins-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566187,\\"sold_product_566187_12028, sold_product_566187_21937\\",\\"sold_product_566187_12028, sold_product_566187_21937\\",\\"7.988, 24.984\\",\\"7.988, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"3.92, 12.742\\",\\"7.988, 24.984\\",\\"12,028, 21,937\\",\\"Vest - light blue multicolor, Sweatshirt - navy multicolor\\",\\"Vest - light blue multicolor, Sweatshirt - navy multicolor\\",\\"1, 1\\",\\"ZO0548905489, ZO0459404594\\",\\"0, 0\\",\\"7.988, 24.984\\",\\"7.988, 24.984\\",\\"0, 0\\",\\"ZO0548905489, ZO0459404594\\",\\"32.969\\",\\"32.969\\",2,2,order,abd +lgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Frances,Frances,\\"Frances Love\\",\\"Frances Love\\",FEMALE,49,Love,Love,\\"(empty)\\",Monday,0,\\"frances@love-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566125,\\"sold_product_566125_14168, sold_product_566125_13612\\",\\"sold_product_566125_14168, sold_product_566125_13612\\",\\"100, 11.992\\",\\"100, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"48, 6.469\\",\\"100, 11.992\\",\\"14,168, 13,612\\",\\"Classic coat - grey, Basic T-shirt - light red/white\\",\\"Classic coat - grey, Basic T-shirt - light red/white\\",\\"1, 1\\",\\"ZO0433104331, ZO0549505495\\",\\"0, 0\\",\\"100, 11.992\\",\\"100, 11.992\\",\\"0, 0\\",\\"ZO0433104331, ZO0549505495\\",112,112,2,2,order,frances +lwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Butler\\",\\"Mostafa Butler\\",MALE,9,Butler,Butler,\\"(empty)\\",Monday,0,\\"mostafa@butler-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566156,\\"sold_product_566156_17644, sold_product_566156_17414\\",\\"sold_product_566156_17644, sold_product_566156_17414\\",\\"60, 16.984\\",\\"60, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"29.406, 7.648\\",\\"60, 16.984\\",\\"17,644, 17,414\\",\\"Suit jacket - dark blue, Print T-shirt - black\\",\\"Suit jacket - dark blue, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0424104241, ZO0117901179\\",\\"0, 0\\",\\"60, 16.984\\",\\"60, 16.984\\",\\"0, 0\\",\\"ZO0424104241, ZO0117901179\\",77,77,2,2,order,mostafa +mAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Stephanie,Stephanie,\\"Stephanie Mckenzie\\",\\"Stephanie Mckenzie\\",FEMALE,6,Mckenzie,Mckenzie,\\"(empty)\\",Monday,0,\\"stephanie@mckenzie-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566100,\\"sold_product_566100_15198, sold_product_566100_22284\\",\\"sold_product_566100_15198, sold_product_566100_22284\\",\\"50, 65\\",\\"50, 65\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"25.484, 31.203\\",\\"50, 65\\",\\"15,198, 22,284\\",\\"Boots - taupe, Classic heels - black\\",\\"Boots - taupe, Classic heels - black\\",\\"1, 1\\",\\"ZO0013400134, ZO0667306673\\",\\"0, 0\\",\\"50, 65\\",\\"50, 65\\",\\"0, 0\\",\\"ZO0013400134, ZO0667306673\\",115,115,2,2,order,stephanie +mQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,George,George,\\"George Boone\\",\\"George Boone\\",MALE,32,Boone,Boone,\\"(empty)\\",Monday,0,\\"george@boone-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566280,\\"sold_product_566280_11862, sold_product_566280_11570\\",\\"sold_product_566280_11862, sold_product_566280_11570\\",\\"22.984, 16.984\\",\\"22.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"11.492, 9.172\\",\\"22.984, 16.984\\",\\"11,862, 11,570\\",\\"Jumper - black, Print T-shirt - beige\\",\\"Jumper - black, Print T-shirt - beige\\",\\"1, 1\\",\\"ZO0573205732, ZO0116701167\\",\\"0, 0\\",\\"22.984, 16.984\\",\\"22.984, 16.984\\",\\"0, 0\\",\\"ZO0573205732, ZO0116701167\\",\\"39.969\\",\\"39.969\\",2,2,order,george +mgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Youssef,Youssef,\\"Youssef Alvarez\\",\\"Youssef Alvarez\\",MALE,31,Alvarez,Alvarez,\\"(empty)\\",Monday,0,\\"youssef@alvarez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565708,\\"sold_product_565708_24246, sold_product_565708_11444\\",\\"sold_product_565708_24246, sold_product_565708_11444\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"33.781, 13.742\\",\\"65, 24.984\\",\\"24,246, 11,444\\",\\"Lace-up boots - black, Rucksack - black/cognac\\",\\"Lace-up boots - black, Rucksack - black/cognac\\",\\"1, 1\\",\\"ZO0253302533, ZO0605706057\\",\\"0, 0\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"0, 0\\",\\"ZO0253302533, ZO0605706057\\",90,90,2,2,order,youssef +tgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Thad,Thad,\\"Thad Taylor\\",\\"Thad Taylor\\",MALE,30,Taylor,Taylor,\\"(empty)\\",Monday,0,\\"thad@taylor-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",565809,\\"sold_product_565809_18321, sold_product_565809_19707\\",\\"sold_product_565809_18321, sold_product_565809_19707\\",\\"12.992, 20.984\\",\\"12.992, 20.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"7.141, 10.289\\",\\"12.992, 20.984\\",\\"18,321, 19,707\\",\\"Vest - white/grey, Trainers - black\\",\\"Vest - white/grey, Trainers - black\\",\\"1, 1\\",\\"ZO0557905579, ZO0513705137\\",\\"0, 0\\",\\"12.992, 20.984\\",\\"12.992, 20.984\\",\\"0, 0\\",\\"ZO0557905579, ZO0513705137\\",\\"33.969\\",\\"33.969\\",2,2,order,thad +twMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Clarice,Clarice,\\"Clarice Daniels\\",\\"Clarice Daniels\\",FEMALE,18,Daniels,Daniels,\\"(empty)\\",Monday,0,\\"clarice@daniels-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Pyramidustries active, Angeldale\\",\\"Pyramidustries active, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566256,\\"sold_product_566256_9787, sold_product_566256_18737\\",\\"sold_product_566256_9787, sold_product_566256_18737\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Angeldale\\",\\"Pyramidustries active, Angeldale\\",\\"12.992, 31.844\\",\\"24.984, 65\\",\\"9,787, 18,737\\",\\"Sweatshirt - duffle bag, Lace-ups - black\\",\\"Sweatshirt - duffle bag, Lace-ups - black\\",\\"1, 1\\",\\"ZO0227302273, ZO0668706687\\",\\"0, 0\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"0, 0\\",\\"ZO0227302273, ZO0668706687\\",90,90,2,2,order,clarice +GgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Chapman\\",\\"Elyssa Chapman\\",FEMALE,27,Chapman,Chapman,\\"(empty)\\",Monday,0,\\"elyssa@chapman-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565639,\\"sold_product_565639_15334, sold_product_565639_18810\\",\\"sold_product_565639_15334, sold_product_565639_18810\\",\\"11.992, 13.992\\",\\"11.992, 13.992\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"5.762, 6.578\\",\\"11.992, 13.992\\",\\"15,334, 18,810\\",\\"Scarf - bordeaux, Wallet - dark turquoise\\",\\"Scarf - bordeaux, Wallet - dark turquoise\\",\\"1, 1\\",\\"ZO0193901939, ZO0080400804\\",\\"0, 0\\",\\"11.992, 13.992\\",\\"11.992, 13.992\\",\\"0, 0\\",\\"ZO0193901939, ZO0080400804\\",\\"25.984\\",\\"25.984\\",2,2,order,elyssa +GwMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Roberson\\",\\"Eddie Roberson\\",MALE,38,Roberson,Roberson,\\"(empty)\\",Monday,0,\\"eddie@roberson-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565684,\\"sold_product_565684_11098, sold_product_565684_11488\\",\\"sold_product_565684_11098, sold_product_565684_11488\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"8.656, 5.059\\",\\"16.984, 10.992\\",\\"11,098, 11,488\\",\\"Trainers - Blue Violety, Tie - black\\",\\"Trainers - Blue Violety, Tie - black\\",\\"1, 1\\",\\"ZO0507705077, ZO0409804098\\",\\"0, 0\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"0, 0\\",\\"ZO0507705077, ZO0409804098\\",\\"27.984\\",\\"27.984\\",2,2,order,eddie +ngMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty King\\",\\"Betty King\\",FEMALE,44,King,King,\\"(empty)\\",Monday,0,\\"betty@king-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Oceanavigations,Oceanavigations,\\"Jun 23, 2019 @ 00:00:00.000\\",565945,\\"sold_product_565945_13129, sold_product_565945_14400\\",\\"sold_product_565945_13129, sold_product_565945_14400\\",\\"42, 42\\",\\"42, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"20.578, 22.25\\",\\"42, 42\\",\\"13,129, 14,400\\",\\"Jeans Skinny Fit - dark blue denim, Jumper - white\\",\\"Jeans Skinny Fit - dark blue denim, Jumper - white\\",\\"1, 1\\",\\"ZO0270602706, ZO0269502695\\",\\"0, 0\\",\\"42, 42\\",\\"42, 42\\",\\"0, 0\\",\\"ZO0270602706, ZO0269502695\\",84,84,2,2,order,betty +nwMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Harvey\\",\\"Clarice Harvey\\",FEMALE,18,Harvey,Harvey,\\"(empty)\\",Monday,0,\\"clarice@harvey-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565988,\\"sold_product_565988_12794, sold_product_565988_15193\\",\\"sold_product_565988_12794, sold_product_565988_15193\\",\\"33, 20.984\\",\\"33, 20.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"16.172, 10.289\\",\\"33, 20.984\\",\\"12,794, 15,193\\",\\"Tote bag - cognac, 3 PACK - Long sleeved top - dark grey multicolor/black/white\\",\\"Tote bag - cognac, 3 PACK - Long sleeved top - dark grey multicolor/black/white\\",\\"1, 1\\",\\"ZO0074700747, ZO0645206452\\",\\"0, 0\\",\\"33, 20.984\\",\\"33, 20.984\\",\\"0, 0\\",\\"ZO0074700747, ZO0645206452\\",\\"53.969\\",\\"53.969\\",2,2,order,clarice +pAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Wagdi,Wagdi,\\"Wagdi Underwood\\",\\"Wagdi Underwood\\",MALE,15,Underwood,Underwood,\\"(empty)\\",Monday,0,\\"wagdi@underwood-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565732,\\"sold_product_565732_16955, sold_product_565732_13808\\",\\"sold_product_565732_16955, sold_product_565732_13808\\",\\"200, 16.984\\",\\"200, 16.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"92, 9.344\\",\\"200, 16.984\\",\\"16,955, 13,808\\",\\"Classic coat - navy, Scarf - red/blue\\",\\"Classic coat - navy, Scarf - red/blue\\",\\"1, 1\\",\\"ZO0291402914, ZO0603006030\\",\\"0, 0\\",\\"200, 16.984\\",\\"200, 16.984\\",\\"0, 0\\",\\"ZO0291402914, ZO0603006030\\",217,217,2,2,order,wagdi +AQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",EUR,Robert,Robert,\\"Robert Cross\\",\\"Robert Cross\\",MALE,29,Cross,Cross,\\"(empty)\\",Monday,0,\\"robert@cross-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566042,\\"sold_product_566042_2775, sold_product_566042_20500\\",\\"sold_product_566042_2775, sold_product_566042_20500\\",\\"28.984, 29.984\\",\\"28.984, 29.984\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"15.938, 15.594\\",\\"28.984, 29.984\\",\\"2,775, 20,500\\",\\"Jumper - white/dark blue, Rucksack - black\\",\\"Jumper - white/dark blue, Rucksack - black\\",\\"1, 1\\",\\"ZO0451804518, ZO0127901279\\",\\"0, 0\\",\\"28.984, 29.984\\",\\"28.984, 29.984\\",\\"0, 0\\",\\"ZO0451804518, ZO0127901279\\",\\"58.969\\",\\"58.969\\",2,2,order,robert +EwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Swanson\\",\\"Tariq Swanson\\",MALE,25,Swanson,Swanson,\\"(empty)\\",Monday,0,\\"tariq@swanson-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566456,\\"sold_product_566456_14947, sold_product_566456_16714\\",\\"sold_product_566456_14947, sold_product_566456_16714\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"5.93, 11.5\\",\\"10.992, 24.984\\",\\"14,947, 16,714\\",\\"Hat - black, Shorts - ice\\",\\"Hat - black, Shorts - ice\\",\\"1, 1\\",\\"ZO0597105971, ZO0283702837\\",\\"0, 0\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"0, 0\\",\\"ZO0597105971, ZO0283702837\\",\\"35.969\\",\\"35.969\\",2,2,order,tariq +TgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane Chandler\\",\\"Diane Chandler\\",FEMALE,22,Chandler,Chandler,\\"(empty)\\",Monday,0,\\"diane@chandler-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565542,\\"sold_product_565542_24084, sold_product_565542_19410\\",\\"sold_product_565542_24084, sold_product_565542_19410\\",\\"16.984, 26.984\\",\\"16.984, 26.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"8.828, 13.492\\",\\"16.984, 26.984\\",\\"24,084, 19,410\\",\\"Tights - black/nasturium, Swimsuit - navy\\",\\"Tights - black/nasturium, Swimsuit - navy\\",\\"1, 1\\",\\"ZO0224302243, ZO0359103591\\",\\"0, 0\\",\\"16.984, 26.984\\",\\"16.984, 26.984\\",\\"0, 0\\",\\"ZO0224302243, ZO0359103591\\",\\"43.969\\",\\"43.969\\",2,2,order,diane +XgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Caldwell\\",\\"Rabbia Al Caldwell\\",FEMALE,5,Caldwell,Caldwell,\\"(empty)\\",Monday,0,\\"rabbia al@caldwell-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566121,\\"sold_product_566121_10723, sold_product_566121_12693\\",\\"sold_product_566121_10723, sold_product_566121_12693\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"10.492, 7.82\\",\\"20.984, 16.984\\",\\"10,723, 12,693\\",\\"Sweatshirt - black, Clutch - red\\",\\"Sweatshirt - black, Clutch - red\\",\\"1, 1\\",\\"ZO0227202272, ZO0357003570\\",\\"0, 0\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"0, 0\\",\\"ZO0227202272, ZO0357003570\\",\\"37.969\\",\\"37.969\\",2,2,order,rabbia +XwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Boris,Boris,\\"Boris Bowers\\",\\"Boris Bowers\\",MALE,36,Bowers,Bowers,\\"(empty)\\",Monday,0,\\"boris@bowers-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Angeldale, Spritechnologies\\",\\"Angeldale, Spritechnologies\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566101,\\"sold_product_566101_738, sold_product_566101_24537\\",\\"sold_product_566101_738, sold_product_566101_24537\\",\\"75, 7.988\\",\\"75, 7.988\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Spritechnologies\\",\\"Angeldale, Spritechnologies\\",\\"39.75, 4.309\\",\\"75, 7.988\\",\\"738, 24,537\\",\\"Lace-up boots - azul, Sports shirt - black\\",\\"Lace-up boots - azul, Sports shirt - black\\",\\"1, 1\\",\\"ZO0691406914, ZO0617806178\\",\\"0, 0\\",\\"75, 7.988\\",\\"75, 7.988\\",\\"0, 0\\",\\"ZO0691406914, ZO0617806178\\",83,83,2,2,order,boris +YAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Bryant\\",\\"Elyssa Bryant\\",FEMALE,27,Bryant,Bryant,\\"(empty)\\",Monday,0,\\"elyssa@bryant-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Angeldale, Pyramidustries active\\",\\"Angeldale, Pyramidustries active\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566653,\\"sold_product_566653_17818, sold_product_566653_18275\\",\\"sold_product_566653_17818, sold_product_566653_18275\\",\\"65, 28.984\\",\\"65, 28.984\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Pyramidustries active\\",\\"Angeldale, Pyramidustries active\\",\\"31.203, 15.359\\",\\"65, 28.984\\",\\"17,818, 18,275\\",\\"Classic heels - ginger, Trainers - white\\",\\"Classic heels - ginger, Trainers - white\\",\\"1, 1\\",\\"ZO0666506665, ZO0216602166\\",\\"0, 0\\",\\"65, 28.984\\",\\"65, 28.984\\",\\"0, 0\\",\\"ZO0666506665, ZO0216602166\\",94,94,2,2,order,elyssa +pwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Sonya,Sonya,\\"Sonya Mullins\\",\\"Sonya Mullins\\",FEMALE,28,Mullins,Mullins,\\"(empty)\\",Monday,0,\\"sonya@mullins-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565838,\\"sold_product_565838_17639, sold_product_565838_16507\\",\\"sold_product_565838_17639, sold_product_565838_16507\\",\\"37, 16.984\\",\\"37, 16.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"18.5, 9.344\\",\\"37, 16.984\\",\\"17,639, 16,507\\",\\"Blouse - black, Across body bag - gunmetal\\",\\"Blouse - black, Across body bag - gunmetal\\",\\"1, 1\\",\\"ZO0343703437, ZO0207102071\\",\\"0, 0\\",\\"37, 16.984\\",\\"37, 16.984\\",\\"0, 0\\",\\"ZO0343703437, ZO0207102071\\",\\"53.969\\",\\"53.969\\",2,2,order,sonya +qQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Larson\\",\\"Stephanie Larson\\",FEMALE,6,Larson,Larson,\\"(empty)\\",Monday,0,\\"stephanie@larson-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565804,\\"sold_product_565804_23705, sold_product_565804_11330\\",\\"sold_product_565804_23705, sold_product_565804_11330\\",\\"24.984, 50\\",\\"24.984, 50\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"12.492, 25.984\\",\\"24.984, 50\\",\\"23,705, 11,330\\",\\"Clutch - Deep Pink, Short coat - dark grey\\",\\"Clutch - Deep Pink, Short coat - dark grey\\",\\"1, 1\\",\\"ZO0306803068, ZO0174601746\\",\\"0, 0\\",\\"24.984, 50\\",\\"24.984, 50\\",\\"0, 0\\",\\"ZO0306803068, ZO0174601746\\",75,75,2,2,order,stephanie +qgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Youssef,Youssef,\\"Youssef Summers\\",\\"Youssef Summers\\",MALE,31,Summers,Summers,\\"(empty)\\",Monday,0,\\"youssef@summers-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566247,\\"sold_product_566247_864, sold_product_566247_24934\\",\\"sold_product_566247_864, sold_product_566247_24934\\",\\"50, 50\\",\\"50, 50\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"23.5, 22.5\\",\\"50, 50\\",\\"864, 24,934\\",\\"Smart lace-ups - brown, Lace-up boots - resin coffee\\",\\"Smart lace-ups - brown, Lace-up boots - resin coffee\\",\\"1, 1\\",\\"ZO0384903849, ZO0403504035\\",\\"0, 0\\",\\"50, 50\\",\\"50, 50\\",\\"0, 0\\",\\"ZO0384903849, ZO0403504035\\",100,100,2,2,order,youssef +twMtOW0BH63Xcmy44mSR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Muniz,Muniz,\\"Muniz Schultz\\",\\"Muniz Schultz\\",MALE,37,Schultz,Schultz,\\"(empty)\\",Monday,0,\\"muniz@schultz-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",566036,\\"sold_product_566036_21739, sold_product_566036_19292\\",\\"sold_product_566036_21739, sold_product_566036_19292\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"11.117, 12.25\\",\\"20.984, 24.984\\",\\"21,739, 19,292\\",\\"Tracksuit top - mottled grey, Trainers - black\\",\\"Tracksuit top - mottled grey, Trainers - black\\",\\"1, 1\\",\\"ZO0583605836, ZO0510605106\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0583605836, ZO0510605106\\",\\"45.969\\",\\"45.969\\",2,2,order,muniz +1AMtOW0BH63Xcmy44mSR,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Rodriguez\\",\\"Elyssa Rodriguez\\",FEMALE,27,Rodriguez,Rodriguez,\\"(empty)\\",Monday,0,\\"elyssa@rodriguez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565459,\\"sold_product_565459_18966, sold_product_565459_22336\\",\\"sold_product_565459_18966, sold_product_565459_22336\\",\\"60, 75\\",\\"60, 75\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"31.188, 39.75\\",\\"60, 75\\",\\"18,966, 22,336\\",\\"High heeled sandals - red, Boots - black\\",\\"High heeled sandals - red, Boots - black\\",\\"1, 1\\",\\"ZO0242302423, ZO0676006760\\",\\"0, 0\\",\\"60, 75\\",\\"60, 75\\",\\"0, 0\\",\\"ZO0242302423, ZO0676006760\\",135,135,2,2,order,elyssa +2gMtOW0BH63Xcmy44mSR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Hansen\\",\\"Elyssa Hansen\\",FEMALE,27,Hansen,Hansen,\\"(empty)\\",Monday,0,\\"elyssa@hansen-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565819,\\"sold_product_565819_11025, sold_product_565819_20135\\",\\"sold_product_565819_11025, sold_product_565819_20135\\",\\"14.992, 11.992\\",\\"14.992, 11.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"6.75, 6.109\\",\\"14.992, 11.992\\",\\"11,025, 20,135\\",\\"T-bar sandals - black, Vest - red\\",\\"T-bar sandals - black, Vest - red\\",\\"1, 1\\",\\"ZO0031700317, ZO0157701577\\",\\"0, 0\\",\\"14.992, 11.992\\",\\"14.992, 11.992\\",\\"0, 0\\",\\"ZO0031700317, ZO0157701577\\",\\"26.984\\",\\"26.984\\",2,2,order,elyssa +2wMtOW0BH63Xcmy44mSR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Mullins\\",\\"Wilhemina St. Mullins\\",FEMALE,17,Mullins,Mullins,\\"(empty)\\",Monday,0,\\"wilhemina st.@mullins-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 23, 2019 @ 00:00:00.000\\",731352,\\"sold_product_731352_12880, sold_product_731352_5477, sold_product_731352_13837, sold_product_731352_24675\\",\\"sold_product_731352_12880, sold_product_731352_5477, sold_product_731352_13837, sold_product_731352_24675\\",\\"24.984, 42, 37, 16.984\\",\\"24.984, 42, 37, 16.984\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Clothing\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Tigress Enterprises, Gnomehouse, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises, Gnomehouse, Tigress Enterprises\\",\\"13.492, 22.25, 18.859, 8.492\\",\\"24.984, 42, 37, 16.984\\",\\"12,880, 5,477, 13,837, 24,675\\",\\"Ankle boots - blue, Over-the-knee boots - taupe, Mini skirt - multicoloured, Vest - black\\",\\"Ankle boots - blue, Over-the-knee boots - taupe, Mini skirt - multicoloured, Vest - black\\",\\"1, 1, 1, 1\\",\\"ZO0018200182, ZO0016100161, ZO0329703297, ZO0057800578\\",\\"0, 0, 0, 0\\",\\"24.984, 42, 37, 16.984\\",\\"24.984, 42, 37, 16.984\\",\\"0, 0, 0, 0\\",\\"ZO0018200182, ZO0016100161, ZO0329703297, ZO0057800578\\",\\"120.938\\",\\"120.938\\",4,4,order,wilhemina +BwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Graham\\",\\"Fitzgerald Graham\\",MALE,11,Graham,Graham,\\"(empty)\\",Monday,0,\\"fitzgerald@graham-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565667,\\"sold_product_565667_19066, sold_product_565667_22279\\",\\"sold_product_565667_19066, sold_product_565667_22279\\",\\"18.984, 50\\",\\"18.984, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"8.547, 23.5\\",\\"18.984, 50\\",\\"19,066, 22,279\\",\\"Tights - black, Casual lace-ups - Sea Green\\",\\"Tights - black, Casual lace-ups - Sea Green\\",\\"1, 1\\",\\"ZO0618706187, ZO0388503885\\",\\"0, 0\\",\\"18.984, 50\\",\\"18.984, 50\\",\\"0, 0\\",\\"ZO0618706187, ZO0388503885\\",69,69,2,2,order,fuzzy +UgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Sutton\\",\\"Abigail Sutton\\",FEMALE,46,Sutton,Sutton,\\"(empty)\\",Monday,0,\\"abigail@sutton-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565900,\\"sold_product_565900_17711, sold_product_565900_14662\\",\\"sold_product_565900_17711, sold_product_565900_14662\\",\\"34, 16.984\\",\\"34, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"18.016, 8.492\\",\\"34, 16.984\\",\\"17,711, 14,662\\",\\"Blouse - black, Print T-shirt - black\\",\\"Blouse - black, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0266102661, ZO0169701697\\",\\"0, 0\\",\\"34, 16.984\\",\\"34, 16.984\\",\\"0, 0\\",\\"ZO0266102661, ZO0169701697\\",\\"50.969\\",\\"50.969\\",2,2,order,abigail +qgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Rose\\",\\"Boris Rose\\",MALE,36,Rose,Rose,\\"(empty)\\",Monday,0,\\"boris@rose-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566360,\\"sold_product_566360_15319, sold_product_566360_10913\\",\\"sold_product_566360_15319, sold_product_566360_10913\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"15.844, 6.039\\",\\"33, 10.992\\",\\"15,319, 10,913\\",\\"Relaxed fit jeans - grey denim, Long sleeved top - grey/dark blue\\",\\"Relaxed fit jeans - grey denim, Long sleeved top - grey/dark blue\\",\\"1, 1\\",\\"ZO0285102851, ZO0658306583\\",\\"0, 0\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"0, 0\\",\\"ZO0285102851, ZO0658306583\\",\\"43.969\\",\\"43.969\\",2,2,order,boris +qwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Soto\\",\\"Abdulraheem Al Soto\\",MALE,33,Soto,Soto,\\"(empty)\\",Monday,0,\\"abdulraheem al@soto-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566416,\\"sold_product_566416_17928, sold_product_566416_24672\\",\\"sold_product_566416_17928, sold_product_566416_24672\\",\\"50, 21.984\\",\\"50, 21.984\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"23.5, 9.898\\",\\"50, 21.984\\",\\"17,928, 24,672\\",\\"Boots - dark brown, Across body bag - black/cognac\\",\\"Boots - dark brown, Across body bag - black/cognac\\",\\"1, 1\\",\\"ZO0396903969, ZO0607906079\\",\\"0, 0\\",\\"50, 21.984\\",\\"50, 21.984\\",\\"0, 0\\",\\"ZO0396903969, ZO0607906079\\",72,72,2,2,order,abdulraheem +IgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Hansen\\",\\"Abigail Hansen\\",FEMALE,46,Hansen,Hansen,\\"(empty)\\",Monday,0,\\"abigail@hansen-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565796,\\"sold_product_565796_11879, sold_product_565796_8405\\",\\"sold_product_565796_11879, sold_product_565796_8405\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"4.23, 14.852\\",\\"7.988, 33\\",\\"11,879, 8,405\\",\\"Snood - offwhite/red/black, Long sleeved top - alison white\\",\\"Snood - offwhite/red/black, Long sleeved top - alison white\\",\\"1, 1\\",\\"ZO0081500815, ZO0342603426\\",\\"0, 0\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"0, 0\\",\\"ZO0081500815, ZO0342603426\\",\\"40.969\\",\\"40.969\\",2,2,order,abigail +IwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Samir,Samir,\\"Samir Sherman\\",\\"Samir Sherman\\",MALE,34,Sherman,Sherman,\\"(empty)\\",Monday,0,\\"samir@sherman-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566261,\\"sold_product_566261_20514, sold_product_566261_13193\\",\\"sold_product_566261_20514, sold_product_566261_13193\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"11.5, 42.5\\",\\"24.984, 85\\",\\"20,514, 13,193\\",\\"Jumper - black, Parka - black\\",\\"Jumper - black, Parka - black\\",\\"1, 1\\",\\"ZO0577105771, ZO0289302893\\",\\"0, 0\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"0, 0\\",\\"ZO0577105771, ZO0289302893\\",110,110,2,2,order,samir +QgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Daniels\\",\\"Robbie Daniels\\",MALE,48,Daniels,Daniels,\\"(empty)\\",Monday,0,\\"robbie@daniels-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565567,\\"sold_product_565567_18531, sold_product_565567_11331\\",\\"sold_product_565567_18531, sold_product_565567_11331\\",\\"11.992, 18.984\\",\\"11.992, 18.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"5.398, 8.93\\",\\"11.992, 18.984\\",\\"18,531, 11,331\\",\\"Basic T-shirt - tan, Tracksuit bottoms - black\\",\\"Basic T-shirt - tan, Tracksuit bottoms - black\\",\\"1, 1\\",\\"ZO0437604376, ZO0618906189\\",\\"0, 0\\",\\"11.992, 18.984\\",\\"11.992, 18.984\\",\\"0, 0\\",\\"ZO0437604376, ZO0618906189\\",\\"30.984\\",\\"30.984\\",2,2,order,robbie +QwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Byrd\\",\\"Brigitte Byrd\\",FEMALE,12,Byrd,Byrd,\\"(empty)\\",Monday,0,\\"brigitte@byrd-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565596,\\"sold_product_565596_19599, sold_product_565596_13051\\",\\"sold_product_565596_19599, sold_product_565596_13051\\",\\"50, 13.992\\",\\"50, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"25.484, 7\\",\\"50, 13.992\\",\\"19,599, 13,051\\",\\"Maxi dress - Pale Violet Red, Print T-shirt - black\\",\\"Maxi dress - Pale Violet Red, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0332903329, ZO0159401594\\",\\"0, 0\\",\\"50, 13.992\\",\\"50, 13.992\\",\\"0, 0\\",\\"ZO0332903329, ZO0159401594\\",\\"63.969\\",\\"63.969\\",2,2,order,brigitte +VgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Shoes, Women's Accessories\\",\\"Men's Shoes, Women's Accessories\\",EUR,Abd,Abd,\\"Abd Foster\\",\\"Abd Foster\\",MALE,52,Foster,Foster,\\"(empty)\\",Monday,0,\\"abd@foster-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Elitelligence, Angeldale\\",\\"Low Tide Media, Elitelligence, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",717206,\\"sold_product_717206_13588, sold_product_717206_16372, sold_product_717206_20757, sold_product_717206_22434\\",\\"sold_product_717206_13588, sold_product_717206_16372, sold_product_717206_20757, sold_product_717206_22434\\",\\"60, 24.984, 80, 60\\",\\"60, 24.984, 80, 60\\",\\"Men's Shoes, Women's Accessories, Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Women's Accessories, Men's Shoes, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Elitelligence, Angeldale, Low Tide Media\\",\\"Low Tide Media, Elitelligence, Angeldale, Low Tide Media\\",\\"28.797, 12.742, 40.781, 30\\",\\"60, 24.984, 80, 60\\",\\"13,588, 16,372, 20,757, 22,434\\",\\"Lace-ups - cognac, Rucksack - black, Lace-up boots - dark brown, Casual lace-ups - cognac\\",\\"Lace-ups - cognac, Rucksack - black, Lace-up boots - dark brown, Casual lace-ups - cognac\\",\\"1, 1, 1, 1\\",\\"ZO0390403904, ZO0608306083, ZO0690906909, ZO0394403944\\",\\"0, 0, 0, 0\\",\\"60, 24.984, 80, 60\\",\\"60, 24.984, 80, 60\\",\\"0, 0, 0, 0\\",\\"ZO0390403904, ZO0608306083, ZO0690906909, ZO0394403944\\",225,225,4,4,order,abd +ggMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Bailey\\",\\"Abd Bailey\\",MALE,52,Bailey,Bailey,\\"(empty)\\",Monday,0,\\"abd@bailey-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",715081,\\"sold_product_715081_20855, sold_product_715081_15922, sold_product_715081_6851, sold_product_715081_1808\\",\\"sold_product_715081_20855, sold_product_715081_15922, sold_product_715081_6851, sold_product_715081_1808\\",\\"65, 65, 24.984, 50\\",\\"65, 65, 24.984, 50\\",\\"Men's Shoes, Men's Shoes, Men's Clothing, Men's Shoes\\",\\"Men's Shoes, Men's Shoes, Men's Clothing, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Low Tide Media, Low Tide Media, Low Tide Media\\",\\"Angeldale, Low Tide Media, Low Tide Media, Low Tide Media\\",\\"29.906, 32.5, 12.492, 23\\",\\"65, 65, 24.984, 50\\",\\"20,855, 15,922, 6,851, 1,808\\",\\"Lace-up boots - black, Lace-up boots - cognac, SLIM FIT - Formal shirt - dark blue, Lace-up boots - black\\",\\"Lace-up boots - black, Lace-up boots - cognac, SLIM FIT - Formal shirt - dark blue, Lace-up boots - black\\",\\"1, 1, 1, 1\\",\\"ZO0688806888, ZO0399003990, ZO0412404124, ZO0405304053\\",\\"0, 0, 0, 0\\",\\"65, 65, 24.984, 50\\",\\"65, 65, 24.984, 50\\",\\"0, 0, 0, 0\\",\\"ZO0688806888, ZO0399003990, ZO0412404124, ZO0405304053\\",205,205,4,4,order,abd +mwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Mary,Mary,\\"Mary Davidson\\",\\"Mary Davidson\\",FEMALE,20,Davidson,Davidson,\\"(empty)\\",Monday,0,\\"mary@davidson-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566428,\\"sold_product_566428_20712, sold_product_566428_18581\\",\\"sold_product_566428_20712, sold_product_566428_18581\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"15.07, 24\\",\\"28.984, 50\\",\\"20,712, 18,581\\",\\"Trainers - black, Summer dress - red ochre\\",\\"Trainers - black, Summer dress - red ochre\\",\\"1, 1\\",\\"ZO0136501365, ZO0339103391\\",\\"0, 0\\",\\"28.984, 50\\",\\"28.984, 50\\",\\"0, 0\\",\\"ZO0136501365, ZO0339103391\\",79,79,2,2,order,mary +zQMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Pia,Pia,\\"Pia Pope\\",\\"Pia Pope\\",FEMALE,45,Pope,Pope,\\"(empty)\\",Monday,0,\\"pia@pope-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566334,\\"sold_product_566334_17905, sold_product_566334_24273\\",\\"sold_product_566334_17905, sold_product_566334_24273\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"14.781, 6.469\\",\\"28.984, 11.992\\",\\"17,905, 24,273\\",\\"High heeled sandals - Rosy Brown, Jersey dress - beige\\",\\"High heeled sandals - Rosy Brown, Jersey dress - beige\\",\\"1, 1\\",\\"ZO0010800108, ZO0635706357\\",\\"0, 0\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"0, 0\\",\\"ZO0010800108, ZO0635706357\\",\\"40.969\\",\\"40.969\\",2,2,order,pia +zgMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Jacobs\\",\\"Elyssa Jacobs\\",FEMALE,27,Jacobs,Jacobs,\\"(empty)\\",Monday,0,\\"elyssa@jacobs-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566391,\\"sold_product_566391_15927, sold_product_566391_15841\\",\\"sold_product_566391_15927, sold_product_566391_15841\\",\\"33, 13.992\\",\\"33, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"Tigress Enterprises MAMA, Pyramidustries\\",\\"15.18, 6.719\\",\\"33, 13.992\\",\\"15,927, 15,841\\",\\"Jersey dress - peacoat, Long sleeved top - black\\",\\"Jersey dress - peacoat, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0228302283, ZO0167501675\\",\\"0, 0\\",\\"33, 13.992\\",\\"33, 13.992\\",\\"0, 0\\",\\"ZO0228302283, ZO0167501675\\",\\"46.969\\",\\"46.969\\",2,2,order,elyssa +IQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Adams\\",\\"Sultan Al Adams\\",MALE,19,Adams,Adams,\\"(empty)\\",Monday,0,\\"sultan al@adams-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",715133,\\"sold_product_715133_22059, sold_product_715133_13763, sold_product_715133_19774, sold_product_715133_15185\\",\\"sold_product_715133_22059, sold_product_715133_13763, sold_product_715133_19774, sold_product_715133_15185\\",\\"28.984, 16.984, 11.992, 24.984\\",\\"28.984, 16.984, 11.992, 24.984\\",\\"Men's Clothing, Men's Shoes, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Shoes, Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Elitelligence, Elitelligence, Microlutions\\",\\"Elitelligence, Elitelligence, Elitelligence, Microlutions\\",\\"15.07, 9.344, 5.879, 11.5\\",\\"28.984, 16.984, 11.992, 24.984\\",\\"22,059, 13,763, 19,774, 15,185\\",\\"Relaxed fit jeans - black, Trainers - dark brown, Print T-shirt - black/orange, Tracksuit bottoms - mottled grey\\",\\"Relaxed fit jeans - black, Trainers - dark brown, Print T-shirt - black/orange, Tracksuit bottoms - mottled grey\\",\\"1, 1, 1, 1\\",\\"ZO0537005370, ZO0508605086, ZO0566605666, ZO0111301113\\",\\"0, 0, 0, 0\\",\\"28.984, 16.984, 11.992, 24.984\\",\\"28.984, 16.984, 11.992, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0537005370, ZO0508605086, ZO0566605666, ZO0111301113\\",\\"82.938\\",\\"82.938\\",4,4,order,sultan +QAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Abd,Abd,\\"Abd Barnes\\",\\"Abd Barnes\\",MALE,52,Barnes,Barnes,\\"(empty)\\",Monday,0,\\"abd@barnes-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",717057,\\"sold_product_717057_18764, sold_product_717057_1195, sold_product_717057_13086, sold_product_717057_13470\\",\\"sold_product_717057_18764, sold_product_717057_1195, sold_product_717057_13086, sold_product_717057_13470\\",\\"65, 60, 50, 15.992\\",\\"65, 60, 50, 15.992\\",\\"Men's Clothing, Men's Shoes, Men's Shoes, Men's Clothing\\",\\"Men's Clothing, Men's Shoes, Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spritechnologies, Low Tide Media, Low Tide Media, Low Tide Media\\",\\"Spritechnologies, Low Tide Media, Low Tide Media, Low Tide Media\\",\\"30.547, 28.203, 23, 8.313\\",\\"65, 60, 50, 15.992\\",\\"18,764, 1,195, 13,086, 13,470\\",\\"Winter jacket - rubber, Lace-up boots - cognac, Casual lace-ups - light brown, 4 PACK - Shorts - grey\\",\\"Winter jacket - rubber, Lace-up boots - cognac, Casual lace-ups - light brown, 4 PACK - Shorts - grey\\",\\"1, 1, 1, 1\\",\\"ZO0623406234, ZO0404704047, ZO0384603846, ZO0476204762\\",\\"0, 0, 0, 0\\",\\"65, 60, 50, 15.992\\",\\"65, 60, 50, 15.992\\",\\"0, 0, 0, 0\\",\\"ZO0623406234, ZO0404704047, ZO0384603846, ZO0476204762\\",191,191,4,4,order,abd +SQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Diane,Diane,\\"Diane Parker\\",\\"Diane Parker\\",FEMALE,22,Parker,Parker,\\"(empty)\\",Monday,0,\\"diane@parker-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Karmanite, Pyramidustries\\",\\"Karmanite, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566315,\\"sold_product_566315_11724, sold_product_566315_18465\\",\\"sold_product_566315_11724, sold_product_566315_18465\\",\\"65, 42\\",\\"65, 42\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Karmanite, Pyramidustries\\",\\"Karmanite, Pyramidustries\\",\\"33.125, 19.313\\",\\"65, 42\\",\\"11,724, 18,465\\",\\"Sandals - black, Boots - black\\",\\"Sandals - black, Boots - black\\",\\"1, 1\\",\\"ZO0703707037, ZO0139601396\\",\\"0, 0\\",\\"65, 42\\",\\"65, 42\\",\\"0, 0\\",\\"ZO0703707037, ZO0139601396\\",107,107,2,2,order,diane +SgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Cross\\",\\"Abigail Cross\\",FEMALE,46,Cross,Cross,\\"(empty)\\",Monday,0,\\"abigail@cross-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565698,\\"sold_product_565698_13951, sold_product_565698_21969\\",\\"sold_product_565698_13951, sold_product_565698_21969\\",\\"50, 7.988\\",\\"50, 7.988\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"26.484, 3.68\\",\\"50, 7.988\\",\\"13,951, 21,969\\",\\"Summer dress - black, Vest - bordeaux\\",\\"Summer dress - black, Vest - bordeaux\\",\\"1, 1\\",\\"ZO0336503365, ZO0637006370\\",\\"0, 0\\",\\"50, 7.988\\",\\"50, 7.988\\",\\"0, 0\\",\\"ZO0336503365, ZO0637006370\\",\\"57.969\\",\\"57.969\\",2,2,order,abigail +UQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Valdez\\",\\"Wagdi Valdez\\",MALE,15,Valdez,Valdez,\\"(empty)\\",Monday,0,\\"wagdi@valdez-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566167,\\"sold_product_566167_3499, sold_product_566167_13386\\",\\"sold_product_566167_3499, sold_product_566167_13386\\",\\"60, 24.984\\",\\"60, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"28.203, 11.75\\",\\"60, 24.984\\",\\"3,499, 13,386\\",\\"Hardshell jacket - jet black, Trousers - black\\",\\"Hardshell jacket - jet black, Trousers - black\\",\\"1, 1\\",\\"ZO0623006230, ZO0419304193\\",\\"0, 0\\",\\"60, 24.984\\",\\"60, 24.984\\",\\"0, 0\\",\\"ZO0623006230, ZO0419304193\\",85,85,2,2,order,wagdi +UgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Rivera\\",\\"Mostafa Rivera\\",MALE,9,Rivera,Rivera,\\"(empty)\\",Monday,0,\\"mostafa@rivera-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566215,\\"sold_product_566215_864, sold_product_566215_23260\\",\\"sold_product_566215_864, sold_product_566215_23260\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"23.5, 13.742\\",\\"50, 24.984\\",\\"864, 23,260\\",\\"Smart lace-ups - brown, Jumper - khaki\\",\\"Smart lace-ups - brown, Jumper - khaki\\",\\"1, 1\\",\\"ZO0384903849, ZO0579305793\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0384903849, ZO0579305793\\",75,75,2,2,order,mostafa +UwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Mary,Mary,\\"Mary Underwood\\",\\"Mary Underwood\\",FEMALE,20,Underwood,Underwood,\\"(empty)\\",Monday,0,\\"mary@underwood-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566070,\\"sold_product_566070_23447, sold_product_566070_17406\\",\\"sold_product_566070_23447, sold_product_566070_17406\\",\\"33, 33\\",\\"33, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"17.813, 16.813\\",\\"33, 33\\",\\"23,447, 17,406\\",\\"Cocktail dress / Party dress - black, Summer dress - black\\",\\"Cocktail dress / Party dress - black, Summer dress - black\\",\\"1, 1\\",\\"ZO0046100461, ZO0151201512\\",\\"0, 0\\",\\"33, 33\\",\\"33, 33\\",\\"0, 0\\",\\"ZO0046100461, ZO0151201512\\",66,66,2,2,order,mary +VAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Jason,Jason,\\"Jason Jimenez\\",\\"Jason Jimenez\\",MALE,16,Jimenez,Jimenez,\\"(empty)\\",Monday,0,\\"jason@jimenez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566621,\\"sold_product_566621_21825, sold_product_566621_21628\\",\\"sold_product_566621_21825, sold_product_566621_21628\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"10.906, 33.75\\",\\"20.984, 75\\",\\"21,825, 21,628\\",\\"Jumper - khaki, Weekend bag - black\\",\\"Jumper - khaki, Weekend bag - black\\",\\"1, 1\\",\\"ZO0579605796, ZO0315803158\\",\\"0, 0\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"0, 0\\",\\"ZO0579605796, ZO0315803158\\",96,96,2,2,order,jason +VQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Miller\\",\\"Youssef Miller\\",MALE,31,Miller,Miller,\\"(empty)\\",Monday,0,\\"youssef@miller-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",566284,\\"sold_product_566284_6763, sold_product_566284_11234\\",\\"sold_product_566284_6763, sold_product_566284_11234\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"9, 21.828\\",\\"16.984, 42\\",\\"6,763, 11,234\\",\\"Jumper - black, Tracksuit top - black\\",\\"Jumper - black, Tracksuit top - black\\",\\"1, 1\\",\\"ZO0541405414, ZO0588205882\\",\\"0, 0\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"0, 0\\",\\"ZO0541405414, ZO0588205882\\",\\"58.969\\",\\"58.969\\",2,2,order,youssef +VgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Byrd\\",\\"Thad Byrd\\",MALE,30,Byrd,Byrd,\\"(empty)\\",Monday,0,\\"thad@byrd-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",566518,\\"sold_product_566518_22342, sold_product_566518_14729\\",\\"sold_product_566518_22342, sold_product_566518_14729\\",\\"11.992, 11.992\\",\\"11.992, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"5.762, 5.641\\",\\"11.992, 11.992\\",\\"22,342, 14,729\\",\\"Long sleeved top - mottled grey black, Long sleeved top - black\\",\\"Long sleeved top - mottled grey black, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0554605546, ZO0569005690\\",\\"0, 0\\",\\"11.992, 11.992\\",\\"11.992, 11.992\\",\\"0, 0\\",\\"ZO0554605546, ZO0569005690\\",\\"23.984\\",\\"23.984\\",2,2,order,thad +agMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Tariq,Tariq,\\"Tariq Byrd\\",\\"Tariq Byrd\\",MALE,25,Byrd,Byrd,\\"(empty)\\",Monday,0,\\"tariq@byrd-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565580,\\"sold_product_565580_1927, sold_product_565580_12828\\",\\"sold_product_565580_1927, sold_product_565580_12828\\",\\"60, 60\\",\\"60, 60\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"28.203, 29.406\\",\\"60, 60\\",\\"1,927, 12,828\\",\\"High-top trainers - nyco, Lace-ups - marron\\",\\"High-top trainers - nyco, Lace-ups - marron\\",\\"1, 1\\",\\"ZO0395303953, ZO0386703867\\",\\"0, 0\\",\\"60, 60\\",\\"60, 60\\",\\"0, 0\\",\\"ZO0395303953, ZO0386703867\\",120,120,2,2,order,tariq +cwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Valdez\\",\\"rania Valdez\\",FEMALE,24,Valdez,Valdez,\\"(empty)\\",Monday,0,\\"rania@valdez-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565830,\\"sold_product_565830_17256, sold_product_565830_23136\\",\\"sold_product_565830_17256, sold_product_565830_23136\\",\\"7.988, 7.988\\",\\"7.988, 7.988\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"4.148, 4.309\\",\\"7.988, 7.988\\",\\"17,256, 23,136\\",\\"3 PACK - Socks - off white/pink, Basic T-shirt - purple\\",\\"3 PACK - Socks - off white/pink, Basic T-shirt - purple\\",\\"1, 1\\",\\"ZO0215702157, ZO0638806388\\",\\"0, 0\\",\\"7.988, 7.988\\",\\"7.988, 7.988\\",\\"0, 0\\",\\"ZO0215702157, ZO0638806388\\",\\"15.977\\",\\"15.977\\",2,2,order,rani +GQMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jason,Jason,\\"Jason Morrison\\",\\"Jason Morrison\\",MALE,16,Morrison,Morrison,\\"(empty)\\",Monday,0,\\"jason@morrison-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566454,\\"sold_product_566454_15937, sold_product_566454_1557\\",\\"sold_product_566454_15937, sold_product_566454_1557\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"3.84, 31.188\\",\\"7.988, 60\\",\\"15,937, 1,557\\",\\"Basic T-shirt - dark grey, Lace-up boots - brown\\",\\"Basic T-shirt - dark grey, Lace-up boots - brown\\",\\"1, 1\\",\\"ZO0547405474, ZO0401104011\\",\\"0, 0\\",\\"7.988, 60\\",\\"7.988, 60\\",\\"0, 0\\",\\"ZO0547405474, ZO0401104011\\",68,68,2,2,order,jason +GgMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Thad,Thad,\\"Thad Larson\\",\\"Thad Larson\\",MALE,30,Larson,Larson,\\"(empty)\\",Monday,0,\\"thad@larson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566506,\\"sold_product_566506_12060, sold_product_566506_16803\\",\\"sold_product_566506_12060, sold_product_566506_16803\\",\\"50, 16.984\\",\\"50, 16.984\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"25.984, 8.492\\",\\"50, 16.984\\",\\"12,060, 16,803\\",\\"Lace-ups - black/red, Rucksack - grey/black\\",\\"Lace-ups - black/red, Rucksack - grey/black\\",\\"1, 1\\",\\"ZO0680806808, ZO0609306093\\",\\"0, 0\\",\\"50, 16.984\\",\\"50, 16.984\\",\\"0, 0\\",\\"ZO0680806808, ZO0609306093\\",67,67,2,2,order,thad +HAMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Diane,Diane,\\"Diane Romero\\",\\"Diane Romero\\",FEMALE,22,Romero,Romero,\\"(empty)\\",Monday,0,\\"diane@romero-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565948,\\"sold_product_565948_18390, sold_product_565948_24310\\",\\"sold_product_565948_18390, sold_product_565948_24310\\",\\"10.992, 22.984\\",\\"10.992, 22.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"5.93, 10.578\\",\\"10.992, 22.984\\",\\"18,390, 24,310\\",\\"Wallet - black, Jumper - light grey multicolor\\",\\"Wallet - black, Jumper - light grey multicolor\\",\\"1, 1\\",\\"ZO0190701907, ZO0654806548\\",\\"0, 0\\",\\"10.992, 22.984\\",\\"10.992, 22.984\\",\\"0, 0\\",\\"ZO0190701907, ZO0654806548\\",\\"33.969\\",\\"33.969\\",2,2,order,diane +HQMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Morrison\\",\\"Gwen Morrison\\",FEMALE,26,Morrison,Morrison,\\"(empty)\\",Monday,0,\\"gwen@morrison-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565998,\\"sold_product_565998_15531, sold_product_565998_8992\\",\\"sold_product_565998_15531, sold_product_565998_8992\\",\\"65, 20.984\\",\\"65, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"29.906, 10.703\\",\\"65, 20.984\\",\\"15,531, 8,992\\",\\"Classic heels - black, Blouse - black\\",\\"Classic heels - black, Blouse - black\\",\\"1, 1\\",\\"ZO0238802388, ZO0066600666\\",\\"0, 0\\",\\"65, 20.984\\",\\"65, 20.984\\",\\"0, 0\\",\\"ZO0238802388, ZO0066600666\\",86,86,2,2,order,gwen +kAMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Reese\\",\\"Elyssa Reese\\",FEMALE,27,Reese,Reese,\\"(empty)\\",Monday,0,\\"elyssa@reese-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565401,\\"sold_product_565401_24966, sold_product_565401_14951\\",\\"sold_product_565401_24966, sold_product_565401_14951\\",\\"42, 24.984\\",\\"42, 24.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"21.828, 11.75\\",\\"42, 24.984\\",\\"24,966, 14,951\\",\\"High heeled boots - black, Jersey dress - black\\",\\"High heeled boots - black, Jersey dress - black\\",\\"1, 1\\",\\"ZO0014800148, ZO0154501545\\",\\"0, 0\\",\\"42, 24.984\\",\\"42, 24.984\\",\\"0, 0\\",\\"ZO0014800148, ZO0154501545\\",67,67,2,2,order,elyssa +MQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Hopkins\\",\\"Elyssa Hopkins\\",FEMALE,27,Hopkins,Hopkins,\\"(empty)\\",Monday,0,\\"elyssa@hopkins-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565728,\\"sold_product_565728_22660, sold_product_565728_17747\\",\\"sold_product_565728_22660, sold_product_565728_17747\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"11.117, 38.25\\",\\"20.984, 75\\",\\"22,660, 17,747\\",\\"Tracksuit bottoms - dark grey multicolor, Ankle boots - black\\",\\"Tracksuit bottoms - dark grey multicolor, Ankle boots - black\\",\\"1, 1\\",\\"ZO0486404864, ZO0248602486\\",\\"0, 0\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"0, 0\\",\\"ZO0486404864, ZO0248602486\\",96,96,2,2,order,elyssa +DQMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Craig\\",\\"Rabbia Al Craig\\",FEMALE,5,Craig,Craig,\\"(empty)\\",Monday,0,\\"rabbia al@craig-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565489,\\"sold_product_565489_17610, sold_product_565489_23396\\",\\"sold_product_565489_17610, sold_product_565489_23396\\",\\"13.992, 7.988\\",\\"13.992, 7.988\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"7.41, 3.6\\",\\"13.992, 7.988\\",\\"17,610, 23,396\\",\\"Belt - black, Vest - black\\",\\"Belt - black, Vest - black\\",\\"1, 1\\",\\"ZO0077200772, ZO0643006430\\",\\"0, 0\\",\\"13.992, 7.988\\",\\"13.992, 7.988\\",\\"0, 0\\",\\"ZO0077200772, ZO0643006430\\",\\"21.984\\",\\"21.984\\",2,2,order,rabbia +EAMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Padilla\\",\\"Abdulraheem Al Padilla\\",MALE,33,Padilla,Padilla,\\"(empty)\\",Monday,0,\\"abdulraheem al@padilla-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565366,\\"sold_product_565366_2077, sold_product_565366_14547\\",\\"sold_product_565366_2077, sold_product_565366_14547\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"37.5, 12.25\\",\\"75, 24.984\\",\\"2,077, 14,547\\",\\"Trainers - black, Jumper - camel/black\\",\\"Trainers - black, Jumper - camel/black\\",\\"1, 1\\",\\"ZO0684906849, ZO0575905759\\",\\"0, 0\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"0, 0\\",\\"ZO0684906849, ZO0575905759\\",100,100,2,2,order,abdulraheem +xwMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",EUR,Tariq,Tariq,\\"Tariq Gilbert\\",\\"Tariq Gilbert\\",MALE,25,Gilbert,Gilbert,\\"(empty)\\",Monday,0,\\"tariq@gilbert-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",720445,\\"sold_product_720445_22855, sold_product_720445_19704, sold_product_720445_12699, sold_product_720445_13347\\",\\"sold_product_720445_22855, sold_product_720445_19704, sold_product_720445_12699, sold_product_720445_13347\\",\\"22.984, 13.992, 42, 11.992\\",\\"22.984, 13.992, 42, 11.992\\",\\"Men's Clothing, Men's Clothing, Women's Accessories, Women's Accessories\\",\\"Men's Clothing, Men's Clothing, Women's Accessories, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Oceanavigations, Oceanavigations, Oceanavigations\\",\\"Low Tide Media, Oceanavigations, Oceanavigations, Oceanavigations\\",\\"10.813, 6.859, 22.672, 6.23\\",\\"22.984, 13.992, 42, 11.992\\",\\"22,855, 19,704, 12,699, 13,347\\",\\"Shorts - black, Print T-shirt - grey multicolor, Weekend bag - dessert, Sunglasses - black\\",\\"Shorts - black, Print T-shirt - grey multicolor, Weekend bag - dessert, Sunglasses - black\\",\\"1, 1, 1, 1\\",\\"ZO0423004230, ZO0292702927, ZO0320003200, ZO0318303183\\",\\"0, 0, 0, 0\\",\\"22.984, 13.992, 42, 11.992\\",\\"22.984, 13.992, 42, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0423004230, ZO0292702927, ZO0320003200, ZO0318303183\\",\\"90.938\\",\\"90.938\\",4,4,order,tariq +0wMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Graham\\",\\"Youssef Graham\\",MALE,31,Graham,Graham,\\"(empty)\\",Monday,0,\\"youssef@graham-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565768,\\"sold_product_565768_19338, sold_product_565768_19206\\",\\"sold_product_565768_19338, sold_product_565768_19206\\",\\"22.984, 33\\",\\"22.984, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"12.18, 15.18\\",\\"22.984, 33\\",\\"19,338, 19,206\\",\\"Sweatshirt - dark grey multicolor, Suit trousers - navy\\",\\"Sweatshirt - dark grey multicolor, Suit trousers - navy\\",\\"1, 1\\",\\"ZO0458004580, ZO0273402734\\",\\"0, 0\\",\\"22.984, 33\\",\\"22.984, 33\\",\\"0, 0\\",\\"ZO0458004580, ZO0273402734\\",\\"55.969\\",\\"55.969\\",2,2,order,youssef +7gMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Gwen,Gwen,\\"Gwen Harvey\\",\\"Gwen Harvey\\",FEMALE,26,Harvey,Harvey,\\"(empty)\\",Monday,0,\\"gwen@harvey-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Champion Arts, Low Tide Media\\",\\"Champion Arts, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565538,\\"sold_product_565538_23676, sold_product_565538_16054\\",\\"sold_product_565538_23676, sold_product_565538_16054\\",\\"24.984, 55\\",\\"24.984, 55\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Low Tide Media\\",\\"Champion Arts, Low Tide Media\\",\\"12.25, 25.297\\",\\"24.984, 55\\",\\"23,676, 16,054\\",\\"Slim fit jeans - brown, Platform sandals - black\\",\\"Slim fit jeans - brown, Platform sandals - black\\",\\"1, 1\\",\\"ZO0486804868, ZO0371603716\\",\\"0, 0\\",\\"24.984, 55\\",\\"24.984, 55\\",\\"0, 0\\",\\"ZO0486804868, ZO0371603716\\",80,80,2,2,order,gwen +\\"-wMtOW0BH63Xcmy45Wq4\\",ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Gilbert\\",\\"Brigitte Gilbert\\",FEMALE,12,Gilbert,Gilbert,\\"(empty)\\",Monday,0,\\"brigitte@gilbert-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565404,\\"sold_product_565404_23482, sold_product_565404_19328\\",\\"sold_product_565404_23482, sold_product_565404_19328\\",\\"42, 33\\",\\"42, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"22.672, 17.813\\",\\"42, 33\\",\\"23,482, 19,328\\",\\"Cocktail dress / Party dress - pomegranate/black, Shift dress - black/champagne\\",\\"Cocktail dress / Party dress - pomegranate/black, Shift dress - black/champagne\\",\\"1, 1\\",\\"ZO0048900489, ZO0228702287\\",\\"0, 0\\",\\"42, 33\\",\\"42, 33\\",\\"0, 0\\",\\"ZO0048900489, ZO0228702287\\",75,75,2,2,order,brigitte +EwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Jimenez\\",\\"Sultan Al Jimenez\\",MALE,19,Jimenez,Jimenez,\\"(empty)\\",Monday,0,\\"sultan al@jimenez-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",715961,\\"sold_product_715961_18507, sold_product_715961_19182, sold_product_715961_17545, sold_product_715961_15806\\",\\"sold_product_715961_18507, sold_product_715961_19182, sold_product_715961_17545, sold_product_715961_15806\\",\\"24.984, 16.984, 7.988, 13.992\\",\\"24.984, 16.984, 7.988, 13.992\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Oceanavigations, Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Oceanavigations, Low Tide Media, Low Tide Media\\",\\"11.25, 8.156, 4.148, 7.27\\",\\"24.984, 16.984, 7.988, 13.992\\",\\"18,507, 19,182, 17,545, 15,806\\",\\"Vibrant Pattern Polo, Print T-shirt - light grey multicolor, Basic T-shirt - blue multicolor, Belt - dark brown\\",\\"Vibrant Pattern Polo, Print T-shirt - light grey multicolor, Basic T-shirt - blue multicolor, Belt - dark brown\\",\\"1, 1, 1, 1\\",\\"ZO0444904449, ZO0292502925, ZO0434604346, ZO0461804618\\",\\"0, 0, 0, 0\\",\\"24.984, 16.984, 7.988, 13.992\\",\\"24.984, 16.984, 7.988, 13.992\\",\\"0, 0, 0, 0\\",\\"ZO0444904449, ZO0292502925, ZO0434604346, ZO0461804618\\",\\"63.969\\",\\"63.969\\",4,4,order,sultan +VwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Wise\\",\\"Rabbia Al Wise\\",FEMALE,5,Wise,Wise,\\"(empty)\\",Monday,0,\\"rabbia al@wise-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566382,\\"sold_product_566382_15477, sold_product_566382_20551\\",\\"sold_product_566382_15477, sold_product_566382_20551\\",\\"18.984, 65\\",\\"18.984, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"9.68, 33.781\\",\\"18.984, 65\\",\\"15,477, 20,551\\",\\"Sweatshirt - black, Lace-ups - Purple\\",\\"Sweatshirt - black, Lace-ups - Purple\\",\\"1, 1\\",\\"ZO0503505035, ZO0240302403\\",\\"0, 0\\",\\"18.984, 65\\",\\"18.984, 65\\",\\"0, 0\\",\\"ZO0503505035, ZO0240302403\\",84,84,2,2,order,rabbia +XgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Frances,Frances,\\"Frances Salazar\\",\\"Frances Salazar\\",FEMALE,49,Salazar,Salazar,\\"(empty)\\",Monday,0,\\"frances@salazar-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",Microlutions,Microlutions,\\"Jun 23, 2019 @ 00:00:00.000\\",565877,\\"sold_product_565877_20689, sold_product_565877_19983\\",\\"sold_product_565877_20689, sold_product_565877_19983\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Microlutions\\",\\"Microlutions, Microlutions\\",\\"15.18, 15.07\\",\\"33, 28.984\\",\\"20,689, 19,983\\",\\"Sweatshirt - light grey, Sweatshirt - black\\",\\"Sweatshirt - light grey, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0125401254, ZO0123701237\\",\\"0, 0\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"0, 0\\",\\"ZO0125401254, ZO0123701237\\",\\"61.969\\",\\"61.969\\",2,2,order,frances +bgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Farmer\\",\\"Robbie Farmer\\",MALE,48,Farmer,Farmer,\\"(empty)\\",Monday,0,\\"robbie@farmer-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",566364,\\"sold_product_566364_15434, sold_product_566364_15384\\",\\"sold_product_566364_15434, sold_product_566364_15384\\",\\"33, 33\\",\\"33, 33\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"16.813, 17.156\\",\\"33, 33\\",\\"15,434, 15,384\\",\\"High-top trainers - black, Denim jacket - grey\\",\\"High-top trainers - black, Denim jacket - grey\\",\\"1, 1\\",\\"ZO0512505125, ZO0525005250\\",\\"0, 0\\",\\"33, 33\\",\\"33, 33\\",\\"0, 0\\",\\"ZO0512505125, ZO0525005250\\",66,66,2,2,order,robbie +vwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Robbie,Robbie,\\"Robbie Holland\\",\\"Robbie Holland\\",MALE,48,Holland,Holland,\\"(empty)\\",Monday,0,\\"robbie@holland-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565479,\\"sold_product_565479_16738, sold_product_565479_14474\\",\\"sold_product_565479_16738, sold_product_565479_14474\\",\\"20.984, 65\\",\\"20.984, 65\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"11.539, 34.438\\",\\"20.984, 65\\",\\"16,738, 14,474\\",\\"Tracksuit top - red, Briefcase - dark brown\\",\\"Tracksuit top - red, Briefcase - dark brown\\",\\"1, 1\\",\\"ZO0588805888, ZO0314903149\\",\\"0, 0\\",\\"20.984, 65\\",\\"20.984, 65\\",\\"0, 0\\",\\"ZO0588805888, ZO0314903149\\",86,86,2,2,order,robbie +wwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Butler\\",\\"Mostafa Butler\\",MALE,9,Butler,Butler,\\"(empty)\\",Monday,0,\\"mostafa@butler-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565360,\\"sold_product_565360_11937, sold_product_565360_6497\\",\\"sold_product_565360_11937, sold_product_565360_6497\\",\\"33, 60\\",\\"33, 60\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"18.141, 31.188\\",\\"33, 60\\",\\"11,937, 6,497\\",\\"Jumper - navy, Colorful Cardigan\\",\\"Jumper - navy, Colorful Cardigan\\",\\"1, 1\\",\\"ZO0448604486, ZO0450704507\\",\\"0, 0\\",\\"33, 60\\",\\"33, 60\\",\\"0, 0\\",\\"ZO0448604486, ZO0450704507\\",93,93,2,2,order,mostafa +zwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Kamal,Kamal,\\"Kamal Perkins\\",\\"Kamal Perkins\\",MALE,39,Perkins,Perkins,\\"(empty)\\",Monday,0,\\"kamal@perkins-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565734,\\"sold_product_565734_23476, sold_product_565734_15158\\",\\"sold_product_565734_23476, sold_product_565734_15158\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"12.492, 33.125\\",\\"24.984, 65\\",\\"23,476, 15,158\\",\\"High-top trainers - allblack, Boots - grey\\",\\"High-top trainers - allblack, Boots - grey\\",\\"1, 1\\",\\"ZO0513205132, ZO0258202582\\",\\"0, 0\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"0, 0\\",\\"ZO0513205132, ZO0258202582\\",90,90,2,2,order,kamal +gAMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Powell\\",\\"Sultan Al Powell\\",MALE,19,Powell,Powell,\\"(empty)\\",Monday,0,\\"sultan al@powell-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Elitelligence,Elitelligence,\\"Jun 23, 2019 @ 00:00:00.000\\",566514,\\"sold_product_566514_6827, sold_product_566514_11745\\",\\"sold_product_566514_6827, sold_product_566514_11745\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"17.156, 5.281\\",\\"33, 10.992\\",\\"6,827, 11,745\\",\\"Denim jacket - black denim, T-bar sandals - black/orange\\",\\"Denim jacket - black denim, T-bar sandals - black/orange\\",\\"1, 1\\",\\"ZO0539305393, ZO0522305223\\",\\"0, 0\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"0, 0\\",\\"ZO0539305393, ZO0522305223\\",\\"43.969\\",\\"43.969\\",2,2,order,sultan +gQMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Summers\\",\\"Clarice Summers\\",FEMALE,18,Summers,Summers,\\"(empty)\\",Monday,0,\\"clarice@summers-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565970,\\"sold_product_565970_25000, sold_product_565970_20678\\",\\"sold_product_565970_25000, sold_product_565970_20678\\",\\"85, 16.984\\",\\"85, 16.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"40.813, 7.82\\",\\"85, 16.984\\",\\"25,000, 20,678\\",\\"Ankle boots - setter, Long sleeved top - black\\",\\"Ankle boots - setter, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0673406734, ZO0165601656\\",\\"0, 0\\",\\"85, 16.984\\",\\"85, 16.984\\",\\"0, 0\\",\\"ZO0673406734, ZO0165601656\\",102,102,2,2,order,clarice +kgMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing, Women's Accessories\\",\\"Women's Shoes, Women's Clothing, Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Richards\\",\\"Elyssa Richards\\",FEMALE,27,Richards,Richards,\\"(empty)\\",Monday,0,\\"elyssa@richards-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Spherecords, Tigress Enterprises\\",\\"Oceanavigations, Spherecords, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",723242,\\"sold_product_723242_5979, sold_product_723242_12451, sold_product_723242_13462, sold_product_723242_14976\\",\\"sold_product_723242_5979, sold_product_723242_12451, sold_product_723242_13462, sold_product_723242_14976\\",\\"75, 7.988, 24.984, 16.984\\",\\"75, 7.988, 24.984, 16.984\\",\\"Women's Shoes, Women's Clothing, Women's Accessories, Women's Clothing\\",\\"Women's Shoes, Women's Clothing, Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, Spherecords, Tigress Enterprises, Spherecords\\",\\"Oceanavigations, Spherecords, Tigress Enterprises, Spherecords\\",\\"33.75, 3.68, 11.75, 9.172\\",\\"75, 7.988, 24.984, 16.984\\",\\"5,979, 12,451, 13,462, 14,976\\",\\"Ankle boots - Antique White, Vest - black, Handbag - cognac , Mini skirt - dark blue\\",\\"Ankle boots - Antique White, Vest - black, Handbag - cognac , Mini skirt - dark blue\\",\\"1, 1, 1, 1\\",\\"ZO0249702497, ZO0643306433, ZO0088900889, ZO0634406344\\",\\"0, 0, 0, 0\\",\\"75, 7.988, 24.984, 16.984\\",\\"75, 7.988, 24.984, 16.984\\",\\"0, 0, 0, 0\\",\\"ZO0249702497, ZO0643306433, ZO0088900889, ZO0634406344\\",\\"124.938\\",\\"124.938\\",4,4,order,elyssa +mAMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Cook\\",\\"Abd Cook\\",MALE,52,Cook,Cook,\\"(empty)\\",Monday,0,\\"abd@cook-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",720399,\\"sold_product_720399_11133, sold_product_720399_24282, sold_product_720399_1435, sold_product_720399_13054\\",\\"sold_product_720399_11133, sold_product_720399_24282, sold_product_720399_1435, sold_product_720399_13054\\",\\"24.984, 7.988, 75, 24.984\\",\\"24.984, 7.988, 75, 24.984\\",\\"Men's Shoes, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Elitelligence, Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence, Low Tide Media, Elitelligence\\",\\"12.25, 4.148, 34.5, 13.742\\",\\"24.984, 7.988, 75, 24.984\\",\\"11,133, 24,282, 1,435, 13,054\\",\\"Smart lace-ups - black, Print T-shirt - bordeaux, Lace-up boots - Peru, Sweatshirt - black/red/white\\",\\"Smart lace-ups - black, Print T-shirt - bordeaux, Lace-up boots - Peru, Sweatshirt - black/red/white\\",\\"1, 1, 1, 1\\",\\"ZO0386303863, ZO0561905619, ZO0397903979, ZO0590105901\\",\\"0, 0, 0, 0\\",\\"24.984, 7.988, 75, 24.984\\",\\"24.984, 7.988, 75, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0386303863, ZO0561905619, ZO0397903979, ZO0590105901\\",133,133,4,4,order,abd +vQMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Hopkins\\",\\"Hicham Hopkins\\",MALE,8,Hopkins,Hopkins,\\"(empty)\\",Monday,0,\\"hicham@hopkins-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566580,\\"sold_product_566580_19404, sold_product_566580_16718\\",\\"sold_product_566580_19404, sold_product_566580_16718\\",\\"33, 33\\",\\"33, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"17.484, 17.813\\",\\"33, 33\\",\\"19,404, 16,718\\",\\"Shirt - olive, Tracksuit top - black\\",\\"Shirt - olive, Tracksuit top - black\\",\\"1, 1\\",\\"ZO0417304173, ZO0123001230\\",\\"0, 0\\",\\"33, 33\\",\\"33, 33\\",\\"0, 0\\",\\"ZO0417304173, ZO0123001230\\",66,66,2,2,order,hicham +ygMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Moran\\",\\"Robbie Moran\\",MALE,48,Moran,Moran,\\"(empty)\\",Monday,0,\\"robbie@moran-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566671,\\"sold_product_566671_22991, sold_product_566671_17752\\",\\"sold_product_566671_22991, sold_product_566671_17752\\",\\"50, 37\\",\\"50, 37\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"23, 17.391\\",\\"50, 37\\",\\"22,991, 17,752\\",\\"SOLID - Summer jacket - mustard, Slim fit jeans - black denim\\",\\"SOLID - Summer jacket - mustard, Slim fit jeans - black denim\\",\\"1, 1\\",\\"ZO0427604276, ZO0113801138\\",\\"0, 0\\",\\"50, 37\\",\\"50, 37\\",\\"0, 0\\",\\"ZO0427604276, ZO0113801138\\",87,87,2,2,order,robbie +zgMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Watkins\\",\\"Abd Watkins\\",MALE,52,Watkins,Watkins,\\"(empty)\\",Monday,0,\\"abd@watkins-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566176,\\"sold_product_566176_15205, sold_product_566176_7038\\",\\"sold_product_566176_15205, sold_product_566176_7038\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"13.242, 44.188\\",\\"24.984, 85\\",\\"15,205, 7,038\\",\\"Briefcase - black , Parka - mustard\\",\\"Briefcase - black , Parka - mustard\\",\\"1, 1\\",\\"ZO0607206072, ZO0431404314\\",\\"0, 0\\",\\"24.984, 85\\",\\"24.984, 85\\",\\"0, 0\\",\\"ZO0607206072, ZO0431404314\\",110,110,2,2,order,abd +zwMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Carr\\",\\"rania Carr\\",FEMALE,24,Carr,Carr,\\"(empty)\\",Monday,0,\\"rania@carr-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566146,\\"sold_product_566146_24862, sold_product_566146_22163\\",\\"sold_product_566146_24862, sold_product_566146_22163\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"5.5, 10.703\\",\\"10.992, 20.984\\",\\"24,862, 22,163\\",\\"Print T-shirt - dark blue/off white, Leggings - black\\",\\"Print T-shirt - dark blue/off white, Leggings - black\\",\\"1, 1\\",\\"ZO0646206462, ZO0146201462\\",\\"0, 0\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"0, 0\\",\\"ZO0646206462, ZO0146201462\\",\\"31.984\\",\\"31.984\\",2,2,order,rani +kgMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Dawson\\",\\"Abigail Dawson\\",FEMALE,46,Dawson,Dawson,\\"(empty)\\",Monday,0,\\"abigail@dawson-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Champion Arts, Pyramidustries active\\",\\"Champion Arts, Pyramidustries active\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565760,\\"sold_product_565760_21930, sold_product_565760_9980\\",\\"sold_product_565760_21930, sold_product_565760_9980\\",\\"50, 20.984\\",\\"50, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Pyramidustries active\\",\\"Champion Arts, Pyramidustries active\\",\\"22.5, 9.867\\",\\"50, 20.984\\",\\"21,930, 9,980\\",\\"Classic coat - black/white, Tights - poseidon\\",\\"Classic coat - black/white, Tights - poseidon\\",\\"1, 1\\",\\"ZO0504505045, ZO0223802238\\",\\"0, 0\\",\\"50, 20.984\\",\\"50, 20.984\\",\\"0, 0\\",\\"ZO0504505045, ZO0223802238\\",71,71,2,2,order,abigail +mAMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane Lloyd\\",\\"Diane Lloyd\\",FEMALE,22,Lloyd,Lloyd,\\"(empty)\\",Monday,0,\\"diane@lloyd-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Spherecords, Crystal Lighting\\",\\"Spherecords, Crystal Lighting\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565521,\\"sold_product_565521_12423, sold_product_565521_11487\\",\\"sold_product_565521_12423, sold_product_565521_11487\\",\\"14.992, 85\\",\\"14.992, 85\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Crystal Lighting\\",\\"Spherecords, Crystal Lighting\\",\\"6.898, 38.25\\",\\"14.992, 85\\",\\"12,423, 11,487\\",\\"Nightie - black/off white, Snowboard jacket - coralle/grey multicolor\\",\\"Nightie - black/off white, Snowboard jacket - coralle/grey multicolor\\",\\"1, 1\\",\\"ZO0660406604, ZO0484504845\\",\\"0, 0\\",\\"14.992, 85\\",\\"14.992, 85\\",\\"0, 0\\",\\"ZO0660406604, ZO0484504845\\",100,100,2,2,order,diane +nQMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Mary,Mary,\\"Mary Martin\\",\\"Mary Martin\\",FEMALE,20,Martin,Martin,\\"(empty)\\",Monday,0,\\"mary@martin-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises Curvy, Spherecords\\",\\"Tigress Enterprises Curvy, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566320,\\"sold_product_566320_14149, sold_product_566320_23774\\",\\"sold_product_566320_14149, sold_product_566320_23774\\",\\"24.984, 14.992\\",\\"24.984, 14.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises Curvy, Spherecords\\",\\"Tigress Enterprises Curvy, Spherecords\\",\\"13.492, 7.941\\",\\"24.984, 14.992\\",\\"14,149, 23,774\\",\\"Blouse - Medium Sea Green, Cardigan - dark blue\\",\\"Blouse - Medium Sea Green, Cardigan - dark blue\\",\\"1, 1\\",\\"ZO0105001050, ZO0652306523\\",\\"0, 0\\",\\"24.984, 14.992\\",\\"24.984, 14.992\\",\\"0, 0\\",\\"ZO0105001050, ZO0652306523\\",\\"39.969\\",\\"39.969\\",2,2,order,mary +ngMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Cortez\\",\\"Stephanie Cortez\\",FEMALE,6,Cortez,Cortez,\\"(empty)\\",Monday,0,\\"stephanie@cortez-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566357,\\"sold_product_566357_14019, sold_product_566357_14225\\",\\"sold_product_566357_14019, sold_product_566357_14225\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"13.242, 7.82\\",\\"24.984, 16.984\\",\\"14,019, 14,225\\",\\"Vest - black, Sweatshirt - dark grey multicolor\\",\\"Vest - black, Sweatshirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0061600616, ZO0180701807\\",\\"0, 0\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"0, 0\\",\\"ZO0061600616, ZO0180701807\\",\\"41.969\\",\\"41.969\\",2,2,order,stephanie +nwMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,rania,rania,\\"rania Howell\\",\\"rania Howell\\",FEMALE,24,Howell,Howell,\\"(empty)\\",Monday,0,\\"rania@howell-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566415,\\"sold_product_566415_18928, sold_product_566415_17913\\",\\"sold_product_566415_18928, sold_product_566415_17913\\",\\"50, 75\\",\\"50, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"25.984, 36.75\\",\\"50, 75\\",\\"18,928, 17,913\\",\\"Summer dress - black/red, Wedges - white\\",\\"Summer dress - black/red, Wedges - white\\",\\"1, 1\\",\\"ZO0261102611, ZO0667106671\\",\\"0, 0\\",\\"50, 75\\",\\"50, 75\\",\\"0, 0\\",\\"ZO0261102611, ZO0667106671\\",125,125,2,2,order,rani +wQMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Jackson\\",\\"Mostafa Jackson\\",MALE,9,Jackson,Jackson,\\"(empty)\\",Monday,0,\\"mostafa@jackson-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566044,\\"sold_product_566044_19539, sold_product_566044_19704\\",\\"sold_product_566044_19539, sold_product_566044_19704\\",\\"10.992, 13.992\\",\\"10.992, 13.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"5.059, 6.859\\",\\"10.992, 13.992\\",\\"19,539, 19,704\\",\\"Print T-shirt - white, Print T-shirt - grey multicolor\\",\\"Print T-shirt - white, Print T-shirt - grey multicolor\\",\\"1, 1\\",\\"ZO0552605526, ZO0292702927\\",\\"0, 0\\",\\"10.992, 13.992\\",\\"10.992, 13.992\\",\\"0, 0\\",\\"ZO0552605526, ZO0292702927\\",\\"24.984\\",\\"24.984\\",2,2,order,mostafa +8QMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Diane,Diane,\\"Diane Reese\\",\\"Diane Reese\\",FEMALE,22,Reese,Reese,\\"(empty)\\",Monday,0,\\"diane@reese-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565473,\\"sold_product_565473_13838, sold_product_565473_13437\\",\\"sold_product_565473_13838, sold_product_565473_13437\\",\\"42, 50\\",\\"42, 50\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"19.734, 22.5\\",\\"42, 50\\",\\"13,838, 13,437\\",\\"Ballet pumps - cognac, Ballet pumps - black\\",\\"Ballet pumps - cognac, Ballet pumps - black\\",\\"1, 1\\",\\"ZO0365303653, ZO0235802358\\",\\"0, 0\\",\\"42, 50\\",\\"42, 50\\",\\"0, 0\\",\\"ZO0365303653, ZO0235802358\\",92,92,2,2,order,diane +9AMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Clarice,Clarice,\\"Clarice Mccormick\\",\\"Clarice Mccormick\\",FEMALE,18,Mccormick,Mccormick,\\"(empty)\\",Monday,0,\\"clarice@mccormick-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Gnomehouse, Angeldale\\",\\"Gnomehouse, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565339,\\"sold_product_565339_21573, sold_product_565339_15153\\",\\"sold_product_565339_21573, sold_product_565339_15153\\",\\"33, 75\\",\\"33, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Angeldale\\",\\"Gnomehouse, Angeldale\\",\\"17.156, 39\\",\\"33, 75\\",\\"21,573, 15,153\\",\\"Print T-shirt - Yellow, Ankle boots - black\\",\\"Print T-shirt - Yellow, Ankle boots - black\\",\\"1, 1\\",\\"ZO0346503465, ZO0678406784\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0346503465, ZO0678406784\\",108,108,2,2,order,clarice +ZgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Irwin,Irwin,\\"Irwin Bryant\\",\\"Irwin Bryant\\",MALE,14,Bryant,Bryant,\\"(empty)\\",Monday,0,\\"irwin@bryant-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565591,\\"sold_product_565591_1910, sold_product_565591_12445\\",\\"sold_product_565591_1910, sold_product_565591_12445\\",\\"65, 42\\",\\"65, 42\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"31.844, 21.406\\",\\"65, 42\\",\\"1,910, 12,445\\",\\"Smart lace-ups - black, Waistcoat - light grey\\",\\"Smart lace-ups - black, Waistcoat - light grey\\",\\"1, 1\\",\\"ZO0683806838, ZO0429204292\\",\\"0, 0\\",\\"65, 42\\",\\"65, 42\\",\\"0, 0\\",\\"ZO0683806838, ZO0429204292\\",107,107,2,2,order,irwin +eAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",\\"Women's Clothing, Women's Accessories, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Maldonado\\",\\"Rabbia Al Maldonado\\",FEMALE,5,Maldonado,Maldonado,\\"(empty)\\",Monday,0,\\"rabbia al@maldonado-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Champion Arts, Pyramidustries, Primemaster, Angeldale\\",\\"Champion Arts, Pyramidustries, Primemaster, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",730725,\\"sold_product_730725_17276, sold_product_730725_15007, sold_product_730725_5421, sold_product_730725_16594\\",\\"sold_product_730725_17276, sold_product_730725_15007, sold_product_730725_5421, sold_product_730725_16594\\",\\"20.984, 11.992, 185, 65\\",\\"20.984, 11.992, 185, 65\\",\\"Women's Clothing, Women's Accessories, Women's Shoes, Women's Accessories\\",\\"Women's Clothing, Women's Accessories, Women's Shoes, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Champion Arts, Pyramidustries, Primemaster, Angeldale\\",\\"Champion Arts, Pyramidustries, Primemaster, Angeldale\\",\\"10.078, 5.52, 83.25, 29.906\\",\\"20.984, 11.992, 185, 65\\",\\"17,276, 15,007, 5,421, 16,594\\",\\"Jumper - blue multicolor, Watch - grey, High heeled boots - brown, Handbag - black\\",\\"Jumper - blue multicolor, Watch - grey, High heeled boots - brown, Handbag - black\\",\\"1, 1, 1, 1\\",\\"ZO0501605016, ZO0189601896, ZO0363003630, ZO0699306993\\",\\"0, 0, 0, 0\\",\\"20.984, 11.992, 185, 65\\",\\"20.984, 11.992, 185, 65\\",\\"0, 0, 0, 0\\",\\"ZO0501605016, ZO0189601896, ZO0363003630, ZO0699306993\\",283,283,4,4,order,rabbia +1wMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Craig\\",\\"Pia Craig\\",FEMALE,45,Craig,Craig,\\"(empty)\\",Monday,0,\\"pia@craig-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566443,\\"sold_product_566443_22619, sold_product_566443_24107\\",\\"sold_product_566443_22619, sold_product_566443_24107\\",\\"17.984, 33\\",\\"17.984, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"8.102, 15.18\\",\\"17.984, 33\\",\\"22,619, 24,107\\",\\"Long sleeved top - black, Jumper dress - grey multicolor\\",\\"Long sleeved top - black, Jumper dress - grey multicolor\\",\\"1, 1\\",\\"ZO0160201602, ZO0261502615\\",\\"0, 0\\",\\"17.984, 33\\",\\"17.984, 33\\",\\"0, 0\\",\\"ZO0160201602, ZO0261502615\\",\\"50.969\\",\\"50.969\\",2,2,order,pia +2AMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Little\\",\\"Marwan Little\\",MALE,51,Little,Little,\\"(empty)\\",Monday,0,\\"marwan@little-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566498,\\"sold_product_566498_17075, sold_product_566498_11878\\",\\"sold_product_566498_17075, sold_product_566498_11878\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"31.797, 5.059\\",\\"60, 10.992\\",\\"17,075, 11,878\\",\\"Smart lace-ups - cognac, Long sleeved top - bordeaux\\",\\"Smart lace-ups - cognac, Long sleeved top - bordeaux\\",\\"1, 1\\",\\"ZO0387103871, ZO0550005500\\",\\"0, 0\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"0, 0\\",\\"ZO0387103871, ZO0550005500\\",71,71,2,2,order,marwan +2wMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Perkins\\",\\"Abdulraheem Al Perkins\\",MALE,33,Perkins,Perkins,\\"(empty)\\",Monday,0,\\"abdulraheem al@perkins-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565985,\\"sold_product_565985_22376, sold_product_565985_6969\\",\\"sold_product_565985_22376, sold_product_565985_6969\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"5.602, 12.742\\",\\"10.992, 24.984\\",\\"22,376, 6,969\\",\\"Long sleeved top - white, Shirt - blue\\",\\"Long sleeved top - white, Shirt - blue\\",\\"1, 1\\",\\"ZO0436604366, ZO0280302803\\",\\"0, 0\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"0, 0\\",\\"ZO0436604366, ZO0280302803\\",\\"35.969\\",\\"35.969\\",2,2,order,abdulraheem +3QMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Dawson\\",\\"Abigail Dawson\\",FEMALE,46,Dawson,Dawson,\\"(empty)\\",Monday,0,\\"abigail@dawson-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565640,\\"sold_product_565640_11983, sold_product_565640_18500\\",\\"sold_product_565640_11983, sold_product_565640_18500\\",\\"24.984, 44\\",\\"24.984, 44\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"12.492, 22\\",\\"24.984, 44\\",\\"11,983, 18,500\\",\\"Summer dress - red, Jersey dress - black/grey\\",\\"Summer dress - red, Jersey dress - black/grey\\",\\"1, 1\\",\\"ZO0631606316, ZO0045300453\\",\\"0, 0\\",\\"24.984, 44\\",\\"24.984, 44\\",\\"0, 0\\",\\"ZO0631606316, ZO0045300453\\",69,69,2,2,order,abigail +3gMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Frances,Frances,\\"Frances Morrison\\",\\"Frances Morrison\\",FEMALE,49,Morrison,Morrison,\\"(empty)\\",Monday,0,\\"frances@morrison-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565683,\\"sold_product_565683_11862, sold_product_565683_16135\\",\\"sold_product_565683_11862, sold_product_565683_16135\\",\\"22.984, 16.984\\",\\"22.984, 16.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"11.492, 8.656\\",\\"22.984, 16.984\\",\\"11,862, 16,135\\",\\"Jumper - black, Belt - dark brown\\",\\"Jumper - black, Belt - dark brown\\",\\"1, 1\\",\\"ZO0573205732, ZO0310303103\\",\\"0, 0\\",\\"22.984, 16.984\\",\\"22.984, 16.984\\",\\"0, 0\\",\\"ZO0573205732, ZO0310303103\\",\\"39.969\\",\\"39.969\\",2,2,order,frances +\\"-QMtOW0BH63Xcmy4524Z\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Wise\\",\\"Yuri Wise\\",MALE,21,Wise,Wise,\\"(empty)\\",Monday,0,\\"yuri@wise-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565767,\\"sold_product_565767_18958, sold_product_565767_24243\\",\\"sold_product_565767_18958, sold_product_565767_24243\\",\\"26.984, 24.984\\",\\"26.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"14.031, 13.242\\",\\"26.984, 24.984\\",\\"18,958, 24,243\\",\\"Formal shirt - white, Slim fit jeans - dirty denim\\",\\"Formal shirt - white, Slim fit jeans - dirty denim\\",\\"1, 1\\",\\"ZO0414304143, ZO0425204252\\",\\"0, 0\\",\\"26.984, 24.984\\",\\"26.984, 24.984\\",\\"0, 0\\",\\"ZO0414304143, ZO0425204252\\",\\"51.969\\",\\"51.969\\",2,2,order,yuri +IAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Sonya,Sonya,\\"Sonya Salazar\\",\\"Sonya Salazar\\",FEMALE,28,Salazar,Salazar,\\"(empty)\\",Monday,0,\\"sonya@salazar-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566452,\\"sold_product_566452_11504, sold_product_566452_16385\\",\\"sold_product_566452_11504, sold_product_566452_16385\\",\\"11.992, 28.984\\",\\"11.992, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"5.879, 13.047\\",\\"11.992, 28.984\\",\\"11,504, 16,385\\",\\"Basic T-shirt - darkblue/white, Sandals - gold\\",\\"Basic T-shirt - darkblue/white, Sandals - gold\\",\\"1, 1\\",\\"ZO0706307063, ZO0011300113\\",\\"0, 0\\",\\"11.992, 28.984\\",\\"11.992, 28.984\\",\\"0, 0\\",\\"ZO0706307063, ZO0011300113\\",\\"40.969\\",\\"40.969\\",2,2,order,sonya +IgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Jackson,Jackson,\\"Jackson Willis\\",\\"Jackson Willis\\",MALE,13,Willis,Willis,\\"(empty)\\",Monday,0,\\"jackson@willis-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565982,\\"sold_product_565982_15828, sold_product_565982_15722\\",\\"sold_product_565982_15828, sold_product_565982_15722\\",\\"10.992, 13.992\\",\\"10.992, 13.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"5.172, 7.41\\",\\"10.992, 13.992\\",\\"15,828, 15,722\\",\\"Tie - black, Belt - brown\\",\\"Tie - black, Belt - brown\\",\\"1, 1\\",\\"ZO0410804108, ZO0309303093\\",\\"0, 0\\",\\"10.992, 13.992\\",\\"10.992, 13.992\\",\\"0, 0\\",\\"ZO0410804108, ZO0309303093\\",\\"24.984\\",\\"24.984\\",2,2,order,jackson +UAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Simpson\\",\\"Rabbia Al Simpson\\",FEMALE,5,Simpson,Simpson,\\"(empty)\\",Monday,0,\\"rabbia al@simpson-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Pyramidustries, Spherecords, Tigress Enterprises MAMA\\",\\"Pyramidustries, Spherecords, Tigress Enterprises MAMA\\",\\"Jun 23, 2019 @ 00:00:00.000\\",726754,\\"sold_product_726754_17171, sold_product_726754_25083, sold_product_726754_21081, sold_product_726754_13554\\",\\"sold_product_726754_17171, sold_product_726754_25083, sold_product_726754_21081, sold_product_726754_13554\\",\\"33, 10.992, 16.984, 24.984\\",\\"33, 10.992, 16.984, 24.984\\",\\"Women's Shoes, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Shoes, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Spherecords, Pyramidustries, Tigress Enterprises MAMA\\",\\"Pyramidustries, Spherecords, Pyramidustries, Tigress Enterprises MAMA\\",\\"16.813, 5.172, 8.156, 12.25\\",\\"33, 10.992, 16.984, 24.984\\",\\"17,171, 25,083, 21,081, 13,554\\",\\"Platform sandals - black, Basic T-shirt - dark blue, Cape - black/offwhite, Jersey dress - black\\",\\"Platform sandals - black, Basic T-shirt - dark blue, Cape - black/offwhite, Jersey dress - black\\",\\"1, 1, 1, 1\\",\\"ZO0138001380, ZO0648006480, ZO0193501935, ZO0228402284\\",\\"0, 0, 0, 0\\",\\"33, 10.992, 16.984, 24.984\\",\\"33, 10.992, 16.984, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0138001380, ZO0648006480, ZO0193501935, ZO0228402284\\",\\"85.938\\",\\"85.938\\",4,4,order,rabbia +YAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,rania,rania,\\"rania Nash\\",\\"rania Nash\\",FEMALE,24,Nash,Nash,\\"(empty)\\",Monday,0,\\"rania@nash-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Oceanavigations,Oceanavigations,\\"Jun 23, 2019 @ 00:00:00.000\\",565723,\\"sold_product_565723_15629, sold_product_565723_18709\\",\\"sold_product_565723_15629, sold_product_565723_18709\\",\\"33, 75\\",\\"33, 75\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"15.18, 39.75\\",\\"33, 75\\",\\"15,629, 18,709\\",\\"Watch - gold-coloured, Boots - nude\\",\\"Watch - gold-coloured, Boots - nude\\",\\"1, 1\\",\\"ZO0302303023, ZO0246602466\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0302303023, ZO0246602466\\",108,108,2,2,order,rani +agMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Hayes\\",\\"Youssef Hayes\\",MALE,31,Hayes,Hayes,\\"(empty)\\",Monday,0,\\"youssef@hayes-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565896,\\"sold_product_565896_13186, sold_product_565896_15296\\",\\"sold_product_565896_13186, sold_product_565896_15296\\",\\"42, 18.984\\",\\"42, 18.984\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"21.828, 9.117\\",\\"42, 18.984\\",\\"13,186, 15,296\\",\\"Across body bag - navy, Polo shirt - red\\",\\"Across body bag - navy, Polo shirt - red\\",\\"1, 1\\",\\"ZO0466104661, ZO0444104441\\",\\"0, 0\\",\\"42, 18.984\\",\\"42, 18.984\\",\\"0, 0\\",\\"ZO0466104661, ZO0444104441\\",\\"60.969\\",\\"60.969\\",2,2,order,youssef +jgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Abd,Abd,\\"Abd Summers\\",\\"Abd Summers\\",MALE,52,Summers,Summers,\\"(empty)\\",Monday,0,\\"abd@summers-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Microlutions, Oceanavigations, Elitelligence\\",\\"Microlutions, Oceanavigations, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",718085,\\"sold_product_718085_20302, sold_product_718085_15787, sold_product_718085_11532, sold_product_718085_13238\\",\\"sold_product_718085_20302, sold_product_718085_15787, sold_product_718085_11532, sold_product_718085_13238\\",\\"13.992, 15.992, 7.988, 10.992\\",\\"13.992, 15.992, 7.988, 10.992\\",\\"Men's Clothing, Men's Accessories, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Accessories, Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Microlutions, Oceanavigations, Elitelligence, Elitelligence\\",\\"Microlutions, Oceanavigations, Elitelligence, Elitelligence\\",\\"7.27, 8.469, 3.76, 4.949\\",\\"13.992, 15.992, 7.988, 10.992\\",\\"20,302, 15,787, 11,532, 13,238\\",\\"3 PACK - Shorts - khaki/camo, Belt - black, Basic T-shirt - khaki, Print T-shirt - beige\\",\\"3 PACK - Shorts - khaki/camo, Belt - black, Basic T-shirt - khaki, Print T-shirt - beige\\",\\"1, 1, 1, 1\\",\\"ZO0129001290, ZO0310103101, ZO0547805478, ZO0560805608\\",\\"0, 0, 0, 0\\",\\"13.992, 15.992, 7.988, 10.992\\",\\"13.992, 15.992, 7.988, 10.992\\",\\"0, 0, 0, 0\\",\\"ZO0129001290, ZO0310103101, ZO0547805478, ZO0560805608\\",\\"48.969\\",\\"48.969\\",4,4,order,abd +zQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Bryant\\",\\"Rabbia Al Bryant\\",FEMALE,5,Bryant,Bryant,\\"(empty)\\",Monday,0,\\"rabbia al@bryant-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566248,\\"sold_product_566248_14303, sold_product_566248_14542\\",\\"sold_product_566248_14303, sold_product_566248_14542\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"36, 13.242\\",\\"75, 24.984\\",\\"14,303, 14,542\\",\\"Ankle boots - black, Tote bag - black\\",\\"Ankle boots - black, Tote bag - black\\",\\"1, 1\\",\\"ZO0678806788, ZO0186101861\\",\\"0, 0\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"0, 0\\",\\"ZO0678806788, ZO0186101861\\",100,100,2,2,order,rabbia +2QMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Alvarez\\",\\"Fitzgerald Alvarez\\",MALE,11,Alvarez,Alvarez,\\"(empty)\\",Monday,0,\\"fitzgerald@alvarez-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565560,\\"sold_product_565560_23771, sold_product_565560_18408\\",\\"sold_product_565560_23771, sold_product_565560_18408\\",\\"10.992, 11.992\\",\\"10.992, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.5, 6.352\\",\\"10.992, 11.992\\",\\"23,771, 18,408\\",\\"Basic T-shirt - Medium Slate Blue, Polo shirt - black\\",\\"Basic T-shirt - Medium Slate Blue, Polo shirt - black\\",\\"1, 1\\",\\"ZO0567505675, ZO0442104421\\",\\"0, 0\\",\\"10.992, 11.992\\",\\"10.992, 11.992\\",\\"0, 0\\",\\"ZO0567505675, ZO0442104421\\",\\"22.984\\",\\"22.984\\",2,2,order,fuzzy +IQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Hale\\",\\"Hicham Hale\\",MALE,8,Hale,Hale,\\"(empty)\\",Monday,0,\\"hicham@hale-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566186,\\"sold_product_566186_24868, sold_product_566186_23962\\",\\"sold_product_566186_24868, sold_product_566186_23962\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"10.703, 11.5\\",\\"20.984, 24.984\\",\\"24,868, 23,962\\",\\"Walking sandals - white/grey/black, Sweatshirt - navy multicolor \\",\\"Walking sandals - white/grey/black, Sweatshirt - navy multicolor \\",\\"1, 1\\",\\"ZO0522105221, ZO0459104591\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0522105221, ZO0459104591\\",\\"45.969\\",\\"45.969\\",2,2,order,hicham +IgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Foster\\",\\"Wilhemina St. Foster\\",FEMALE,17,Foster,Foster,\\"(empty)\\",Monday,0,\\"wilhemina st.@foster-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Champion Arts, Pyramidustries\\",\\"Champion Arts, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566155,\\"sold_product_566155_13946, sold_product_566155_21158\\",\\"sold_product_566155_13946, sold_product_566155_21158\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Pyramidustries\\",\\"Champion Arts, Pyramidustries\\",\\"9.656, 12.25\\",\\"20.984, 24.984\\",\\"13,946, 21,158\\",\\"Hoodie - dark grey multicolor, Pyjamas - light pink\\",\\"Hoodie - dark grey multicolor, Pyjamas - light pink\\",\\"1, 1\\",\\"ZO0501005010, ZO0214002140\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0501005010, ZO0214002140\\",\\"45.969\\",\\"45.969\\",2,2,order,wilhemina +IwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Dawson\\",\\"Sonya Dawson\\",FEMALE,28,Dawson,Dawson,\\"(empty)\\",Monday,0,\\"sonya@dawson-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566628,\\"sold_product_566628_11077, sold_product_566628_19514\\",\\"sold_product_566628_11077, sold_product_566628_19514\\",\\"24.984, 11.992\\",\\"24.984, 11.992\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"12.492, 6.352\\",\\"24.984, 11.992\\",\\"11,077, 19,514\\",\\"Tote bag - cognac, 3 PACK - Shorts - teal/dark purple/black\\",\\"Tote bag - cognac, 3 PACK - Shorts - teal/dark purple/black\\",\\"1, 1\\",\\"ZO0195601956, ZO0098900989\\",\\"0, 0\\",\\"24.984, 11.992\\",\\"24.984, 11.992\\",\\"0, 0\\",\\"ZO0195601956, ZO0098900989\\",\\"36.969\\",\\"36.969\\",2,2,order,sonya +JAMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Phillips\\",\\"Mostafa Phillips\\",MALE,9,Phillips,Phillips,\\"(empty)\\",Monday,0,\\"mostafa@phillips-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Angeldale, Microlutions\\",\\"Angeldale, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566519,\\"sold_product_566519_21909, sold_product_566519_12714\\",\\"sold_product_566519_21909, sold_product_566519_12714\\",\\"16.984, 85\\",\\"16.984, 85\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Microlutions\\",\\"Angeldale, Microlutions\\",\\"9.172, 40.813\\",\\"16.984, 85\\",\\"21,909, 12,714\\",\\"Belt - black, Classic coat - black\\",\\"Belt - black, Classic coat - black\\",\\"1, 1\\",\\"ZO0700907009, ZO0115801158\\",\\"0, 0\\",\\"16.984, 85\\",\\"16.984, 85\\",\\"0, 0\\",\\"ZO0700907009, ZO0115801158\\",102,102,2,2,order,mostafa +JQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Powell\\",\\"Stephanie Powell\\",FEMALE,6,Powell,Powell,\\"(empty)\\",Monday,0,\\"stephanie@powell-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Champion Arts, Spherecords\\",\\"Champion Arts, Spherecords\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565697,\\"sold_product_565697_11530, sold_product_565697_17565\\",\\"sold_product_565697_11530, sold_product_565697_17565\\",\\"16.984, 11.992\\",\\"16.984, 11.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Spherecords\\",\\"Champion Arts, Spherecords\\",\\"8.156, 6\\",\\"16.984, 11.992\\",\\"11,530, 17,565\\",\\"Hoodie - dark red, 2 PACK - Vest - black/nude\\",\\"Hoodie - dark red, 2 PACK - Vest - black/nude\\",\\"1, 1\\",\\"ZO0498904989, ZO0641706417\\",\\"0, 0\\",\\"16.984, 11.992\\",\\"16.984, 11.992\\",\\"0, 0\\",\\"ZO0498904989, ZO0641706417\\",\\"28.984\\",\\"28.984\\",2,2,order,stephanie +JgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Pia,Pia,\\"Pia Ramsey\\",\\"Pia Ramsey\\",FEMALE,45,Ramsey,Ramsey,\\"(empty)\\",Monday,0,\\"pia@ramsey-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566417,\\"sold_product_566417_14379, sold_product_566417_13936\\",\\"sold_product_566417_14379, sold_product_566417_13936\\",\\"11.992, 11.992\\",\\"11.992, 11.992\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"6.469, 5.52\\",\\"11.992, 11.992\\",\\"14,379, 13,936\\",\\"Snood - grey, Scarf - bordeaux\\",\\"Snood - grey, Scarf - bordeaux\\",\\"1, 1\\",\\"ZO0084900849, ZO0194701947\\",\\"0, 0\\",\\"11.992, 11.992\\",\\"11.992, 11.992\\",\\"0, 0\\",\\"ZO0084900849, ZO0194701947\\",\\"23.984\\",\\"23.984\\",2,2,order,pia +fwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Mccarthy\\",\\"Pia Mccarthy\\",FEMALE,45,Mccarthy,Mccarthy,\\"(empty)\\",Monday,0,\\"pia@mccarthy-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565722,\\"sold_product_565722_12551, sold_product_565722_22941\\",\\"sold_product_565722_12551, sold_product_565722_22941\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"8.328, 5.82\\",\\"16.984, 10.992\\",\\"12,551, 22,941\\",\\"Cardigan - light grey multicolor, Print T-shirt - dark blue/red\\",\\"Cardigan - light grey multicolor, Print T-shirt - dark blue/red\\",\\"1, 1\\",\\"ZO0656406564, ZO0495504955\\",\\"0, 0\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"0, 0\\",\\"ZO0656406564, ZO0495504955\\",\\"27.984\\",\\"27.984\\",2,2,order,pia +lAMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Foster\\",\\"Boris Foster\\",MALE,36,Foster,Foster,\\"(empty)\\",Monday,0,\\"boris@foster-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",Spritechnologies,Spritechnologies,\\"Jun 23, 2019 @ 00:00:00.000\\",565330,\\"sold_product_565330_16276, sold_product_565330_24760\\",\\"sold_product_565330_16276, sold_product_565330_24760\\",\\"20.984, 50\\",\\"20.984, 50\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Spritechnologies\\",\\"Spritechnologies, Spritechnologies\\",\\"9.453, 26.484\\",\\"20.984, 50\\",\\"16,276, 24,760\\",\\"Tracksuit bottoms - dark grey multicolor, Sweatshirt - black\\",\\"Tracksuit bottoms - dark grey multicolor, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0621606216, ZO0628806288\\",\\"0, 0\\",\\"20.984, 50\\",\\"20.984, 50\\",\\"0, 0\\",\\"ZO0621606216, ZO0628806288\\",71,71,2,2,order,boris +lQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Betty,Betty,\\"Betty Graham\\",\\"Betty Graham\\",FEMALE,44,Graham,Graham,\\"(empty)\\",Monday,0,\\"betty@graham-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565381,\\"sold_product_565381_23349, sold_product_565381_12141\\",\\"sold_product_565381_23349, sold_product_565381_12141\\",\\"16.984, 7.988\\",\\"16.984, 7.988\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"8.328, 4.148\\",\\"16.984, 7.988\\",\\"23,349, 12,141\\",\\"Basic T-shirt - black, Belt - taupe\\",\\"Basic T-shirt - black, Belt - taupe\\",\\"1, 1\\",\\"ZO0060200602, ZO0076300763\\",\\"0, 0\\",\\"16.984, 7.988\\",\\"16.984, 7.988\\",\\"0, 0\\",\\"ZO0060200602, ZO0076300763\\",\\"24.984\\",\\"24.984\\",2,2,order,betty +vQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Kamal,Kamal,\\"Kamal Riley\\",\\"Kamal Riley\\",MALE,39,Riley,Riley,\\"(empty)\\",Monday,0,\\"kamal@riley-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565564,\\"sold_product_565564_19843, sold_product_565564_10979\\",\\"sold_product_565564_19843, sold_product_565564_10979\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"12.492, 7.988\\",\\"24.984, 16.984\\",\\"19,843, 10,979\\",\\"Cardigan - white/blue/khaki, Print T-shirt - dark green\\",\\"Cardigan - white/blue/khaki, Print T-shirt - dark green\\",\\"1, 1\\",\\"ZO0576305763, ZO0116801168\\",\\"0, 0\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"0, 0\\",\\"ZO0576305763, ZO0116801168\\",\\"41.969\\",\\"41.969\\",2,2,order,kamal +wAMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Parker\\",\\"Thad Parker\\",MALE,30,Parker,Parker,\\"(empty)\\",Monday,0,\\"thad@parker-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565392,\\"sold_product_565392_17873, sold_product_565392_14058\\",\\"sold_product_565392_17873, sold_product_565392_14058\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"5.602, 10.492\\",\\"10.992, 20.984\\",\\"17,873, 14,058\\",\\"Sports shirt - Seashell, Sweatshirt - mottled light grey\\",\\"Sports shirt - Seashell, Sweatshirt - mottled light grey\\",\\"1, 1\\",\\"ZO0616606166, ZO0592205922\\",\\"0, 0\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"0, 0\\",\\"ZO0616606166, ZO0592205922\\",\\"31.984\\",\\"31.984\\",2,2,order,thad +wQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Stephanie,Stephanie,\\"Stephanie Henderson\\",\\"Stephanie Henderson\\",FEMALE,6,Henderson,Henderson,\\"(empty)\\",Monday,0,\\"stephanie@henderson-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Karmanite\\",\\"Tigress Enterprises, Karmanite\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565410,\\"sold_product_565410_22028, sold_product_565410_5066\\",\\"sold_product_565410_22028, sold_product_565410_5066\\",\\"33, 100\\",\\"33, 100\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Karmanite\\",\\"Tigress Enterprises, Karmanite\\",\\"15.844, 45\\",\\"33, 100\\",\\"22,028, 5,066\\",\\"Ankle boots - cognac, Boots - black\\",\\"Ankle boots - cognac, Boots - black\\",\\"1, 1\\",\\"ZO0023600236, ZO0704307043\\",\\"0, 0\\",\\"33, 100\\",\\"33, 100\\",\\"0, 0\\",\\"ZO0023600236, ZO0704307043\\",133,133,2,2,order,stephanie +\\"-AMtOW0BH63Xcmy453H9\\",ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Walters\\",\\"Elyssa Walters\\",FEMALE,27,Walters,Walters,\\"(empty)\\",Monday,0,\\"elyssa@walters-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565504,\\"sold_product_565504_21839, sold_product_565504_19546\\",\\"sold_product_565504_21839, sold_product_565504_19546\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"11.75, 21\\",\\"24.984, 42\\",\\"21,839, 19,546\\",\\"Jumper - dark grey multicolor, Summer dress - black\\",\\"Jumper - dark grey multicolor, Summer dress - black\\",\\"1, 1\\",\\"ZO0653406534, ZO0049300493\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0653406534, ZO0049300493\\",67,67,2,2,order,elyssa +\\"-wMtOW0BH63Xcmy453H9\\",ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Betty,Betty,\\"Betty Allison\\",\\"Betty Allison\\",FEMALE,44,Allison,Allison,\\"(empty)\\",Monday,0,\\"betty@allison-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565334,\\"sold_product_565334_17565, sold_product_565334_24798\\",\\"sold_product_565334_17565, sold_product_565334_24798\\",\\"11.992, 75\\",\\"11.992, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"6, 35.25\\",\\"11.992, 75\\",\\"17,565, 24,798\\",\\"2 PACK - Vest - black/nude, Lace-up boots - black\\",\\"2 PACK - Vest - black/nude, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0641706417, ZO0382303823\\",\\"0, 0\\",\\"11.992, 75\\",\\"11.992, 75\\",\\"0, 0\\",\\"ZO0641706417, ZO0382303823\\",87,87,2,2,order,betty +IQMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Phil,Phil,\\"Phil Strickland\\",\\"Phil Strickland\\",MALE,50,Strickland,Strickland,\\"(empty)\\",Monday,0,\\"phil@strickland-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Spherecords, Angeldale\\",\\"Spherecords, Angeldale\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566079,\\"sold_product_566079_22969, sold_product_566079_775\\",\\"sold_product_566079_22969, sold_product_566079_775\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Angeldale\\",\\"Spherecords, Angeldale\\",\\"12.992, 30.594\\",\\"24.984, 60\\",\\"22,969, 775\\",\\"Pyjamas - blue, Boots - black\\",\\"Pyjamas - blue, Boots - black\\",\\"1, 1\\",\\"ZO0663306633, ZO0687306873\\",\\"0, 0\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"0, 0\\",\\"ZO0663306633, ZO0687306873\\",85,85,2,2,order,phil +IgMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Gilbert\\",\\"Betty Gilbert\\",FEMALE,44,Gilbert,Gilbert,\\"(empty)\\",Monday,0,\\"betty@gilbert-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566622,\\"sold_product_566622_13554, sold_product_566622_11691\\",\\"sold_product_566622_13554, sold_product_566622_11691\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Tigress Enterprises MAMA, Tigress Enterprises\\",\\"12.25, 13.492\\",\\"24.984, 24.984\\",\\"13,554, 11,691\\",\\"Jersey dress - black, Cape - grey multicolor\\",\\"Jersey dress - black, Cape - grey multicolor\\",\\"1, 1\\",\\"ZO0228402284, ZO0082300823\\",\\"0, 0\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"0, 0\\",\\"ZO0228402284, ZO0082300823\\",\\"49.969\\",\\"49.969\\",2,2,order,betty +IwMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Long\\",\\"Elyssa Long\\",FEMALE,27,Long,Long,\\"(empty)\\",Monday,0,\\"elyssa@long-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566650,\\"sold_product_566650_20286, sold_product_566650_16948\\",\\"sold_product_566650_20286, sold_product_566650_16948\\",\\"65, 14.992\\",\\"65, 14.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"34.438, 7.941\\",\\"65, 14.992\\",\\"20,286, 16,948\\",\\"Long-sleeved Maxi Dress, Scarf - black\\",\\"Long-sleeved Maxi Dress, Scarf - black\\",\\"1, 1\\",\\"ZO0049100491, ZO0194801948\\",\\"0, 0\\",\\"65, 14.992\\",\\"65, 14.992\\",\\"0, 0\\",\\"ZO0049100491, ZO0194801948\\",80,80,2,2,order,elyssa +JAMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Strickland\\",\\"Abigail Strickland\\",FEMALE,46,Strickland,Strickland,\\"(empty)\\",Monday,0,\\"abigail@strickland-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566295,\\"sold_product_566295_17554, sold_product_566295_22815\\",\\"sold_product_566295_17554, sold_product_566295_22815\\",\\"18.984, 24.984\\",\\"18.984, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"9.313, 13.242\\",\\"18.984, 24.984\\",\\"17,554, 22,815\\",\\"Maxi dress - black, Jersey dress - black\\",\\"Maxi dress - black, Jersey dress - black\\",\\"1, 1\\",\\"ZO0635606356, ZO0043100431\\",\\"0, 0\\",\\"18.984, 24.984\\",\\"18.984, 24.984\\",\\"0, 0\\",\\"ZO0635606356, ZO0043100431\\",\\"43.969\\",\\"43.969\\",2,2,order,abigail +JQMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Kim\\",\\"Clarice Kim\\",FEMALE,18,Kim,Kim,\\"(empty)\\",Monday,0,\\"clarice@kim-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566538,\\"sold_product_566538_9847, sold_product_566538_16537\\",\\"sold_product_566538_9847, sold_product_566538_16537\\",\\"24.984, 50\\",\\"24.984, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Gnomehouse\\",\\"Pyramidustries active, Gnomehouse\\",\\"13.492, 25.984\\",\\"24.984, 50\\",\\"9,847, 16,537\\",\\"Tights - black, Cocktail dress / Party dress - rose cloud\\",\\"Tights - black, Cocktail dress / Party dress - rose cloud\\",\\"1, 1\\",\\"ZO0224402244, ZO0342403424\\",\\"0, 0\\",\\"24.984, 50\\",\\"24.984, 50\\",\\"0, 0\\",\\"ZO0224402244, ZO0342403424\\",75,75,2,2,order,clarice +JgMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Allison\\",\\"Clarice Allison\\",FEMALE,18,Allison,Allison,\\"(empty)\\",Monday,0,\\"clarice@allison-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565918,\\"sold_product_565918_14195, sold_product_565918_7629\\",\\"sold_product_565918_14195, sold_product_565918_7629\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"7.648, 14.492\\",\\"16.984, 28.984\\",\\"14,195, 7,629\\",\\"Jersey dress - black, Jumper - peacoat/winter white\\",\\"Jersey dress - black, Jumper - peacoat/winter white\\",\\"1, 1\\",\\"ZO0155001550, ZO0072100721\\",\\"0, 0\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"0, 0\\",\\"ZO0155001550, ZO0072100721\\",\\"45.969\\",\\"45.969\\",2,2,order,clarice +UAMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Morrison\\",\\"Gwen Morrison\\",FEMALE,26,Morrison,Morrison,\\"(empty)\\",Monday,0,\\"gwen@morrison-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises, Crystal Lighting\\",\\"Tigress Enterprises, Crystal Lighting\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565678,\\"sold_product_565678_13792, sold_product_565678_22639\\",\\"sold_product_565678_13792, sold_product_565678_22639\\",\\"12.992, 24.984\\",\\"12.992, 24.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Crystal Lighting\\",\\"Tigress Enterprises, Crystal Lighting\\",\\"6.109, 11.25\\",\\"12.992, 24.984\\",\\"13,792, 22,639\\",\\"Scarf - white/grey, Wool jumper - white\\",\\"Scarf - white/grey, Wool jumper - white\\",\\"1, 1\\",\\"ZO0081800818, ZO0485604856\\",\\"0, 0\\",\\"12.992, 24.984\\",\\"12.992, 24.984\\",\\"0, 0\\",\\"ZO0081800818, ZO0485604856\\",\\"37.969\\",\\"37.969\\",2,2,order,gwen +UQMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jason,Jason,\\"Jason Graves\\",\\"Jason Graves\\",MALE,16,Graves,Graves,\\"(empty)\\",Monday,0,\\"jason@graves-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566564,\\"sold_product_566564_11560, sold_product_566564_17533\\",\\"sold_product_566564_11560, sold_product_566564_17533\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"29.406, 5.641\\",\\"60, 11.992\\",\\"11,560, 17,533\\",\\"Trainers - white, Print T-shirt - dark grey\\",\\"Trainers - white, Print T-shirt - dark grey\\",\\"1, 1\\",\\"ZO0107301073, ZO0293002930\\",\\"0, 0\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"0, 0\\",\\"ZO0107301073, ZO0293002930\\",72,72,2,2,order,jason +ZgMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Dixon\\",\\"rania Dixon\\",FEMALE,24,Dixon,Dixon,\\"(empty)\\",Monday,0,\\"rania@dixon-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565498,\\"sold_product_565498_15436, sold_product_565498_16548\\",\\"sold_product_565498_15436, sold_product_565498_16548\\",\\"28.984, 16.984\\",\\"28.984, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"14.781, 9\\",\\"28.984, 16.984\\",\\"15,436, 16,548\\",\\"Jersey dress - anthra/black, Sweatshirt - black\\",\\"Jersey dress - anthra/black, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0046600466, ZO0503305033\\",\\"0, 0\\",\\"28.984, 16.984\\",\\"28.984, 16.984\\",\\"0, 0\\",\\"ZO0046600466, ZO0503305033\\",\\"45.969\\",\\"45.969\\",2,2,order,rani +gAMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Yasmine,Yasmine,\\"Yasmine Sutton\\",\\"Yasmine Sutton\\",FEMALE,43,Sutton,Sutton,\\"(empty)\\",Monday,0,\\"yasmine@sutton-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Jun 23, 2019 @ 00:00:00.000\\",565793,\\"sold_product_565793_14151, sold_product_565793_22488\\",\\"sold_product_565793_14151, sold_product_565793_22488\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"11.75, 15.07\\",\\"24.984, 28.984\\",\\"14,151, 22,488\\",\\"Slim fit jeans - mid blue denim, Lace-ups - black glitter\\",\\"Slim fit jeans - mid blue denim, Lace-ups - black glitter\\",\\"1, 1\\",\\"ZO0712807128, ZO0007500075\\",\\"0, 0\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"0, 0\\",\\"ZO0712807128, ZO0007500075\\",\\"53.969\\",\\"53.969\\",2,2,order,yasmine +gQMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jason,Jason,\\"Jason Fletcher\\",\\"Jason Fletcher\\",MALE,16,Fletcher,Fletcher,\\"(empty)\\",Monday,0,\\"jason@fletcher-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566232,\\"sold_product_566232_21255, sold_product_566232_12532\\",\\"sold_product_566232_21255, sold_product_566232_12532\\",\\"7.988, 11.992\\",\\"7.988, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"3.76, 6.352\\",\\"7.988, 11.992\\",\\"21,255, 12,532\\",\\"Basic T-shirt - black, Print T-shirt - navy ecru\\",\\"Basic T-shirt - black, Print T-shirt - navy ecru\\",\\"1, 1\\",\\"ZO0545205452, ZO0437304373\\",\\"0, 0\\",\\"7.988, 11.992\\",\\"7.988, 11.992\\",\\"0, 0\\",\\"ZO0545205452, ZO0437304373\\",\\"19.984\\",\\"19.984\\",2,2,order,jason +ggMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Larson\\",\\"Tariq Larson\\",MALE,25,Larson,Larson,\\"(empty)\\",Monday,0,\\"tariq@larson-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566259,\\"sold_product_566259_22713, sold_product_566259_21314\\",\\"sold_product_566259_22713, sold_product_566259_21314\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"32.375, 6.039\\",\\"60, 10.992\\",\\"22,713, 21,314\\",\\"Boots - black, Print T-shirt - white\\",\\"Boots - black, Print T-shirt - white\\",\\"1, 1\\",\\"ZO0694206942, ZO0553805538\\",\\"0, 0\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"0, 0\\",\\"ZO0694206942, ZO0553805538\\",71,71,2,2,order,tariq +pwMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Gwen,Gwen,\\"Gwen Walters\\",\\"Gwen Walters\\",FEMALE,26,Walters,Walters,\\"(empty)\\",Monday,0,\\"gwen@walters-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Champion Arts, Low Tide Media\\",\\"Champion Arts, Low Tide Media\\",\\"Jun 23, 2019 @ 00:00:00.000\\",566591,\\"sold_product_566591_19909, sold_product_566591_12575\\",\\"sold_product_566591_19909, sold_product_566591_12575\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 12, 2016 @ 00:00:00.000, Dec 12, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Low Tide Media\\",\\"Champion Arts, Low Tide Media\\",\\"13.047, 19.313\\",\\"28.984, 42\\",\\"19,909, 12,575\\",\\"Hoodie - black/white, Classic heels - nude\\",\\"Hoodie - black/white, Classic heels - nude\\",\\"1, 1\\",\\"ZO0502405024, ZO0366003660\\",\\"0, 0\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"0, 0\\",\\"ZO0502405024, ZO0366003660\\",71,71,2,2,order,gwen +WQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Yahya,Yahya,\\"Yahya Foster\\",\\"Yahya Foster\\",MALE,23,Foster,Foster,\\"(empty)\\",Sunday,6,\\"yahya@foster-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564670,\\"sold_product_564670_11411, sold_product_564670_23904\\",\\"sold_product_564670_11411, sold_product_564670_23904\\",\\"14.992, 85\\",\\"14.992, 85\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"8.094, 38.25\\",\\"14.992, 85\\",\\"11,411, 23,904\\",\\"Shorts - bordeaux mel, High-top trainers - black\\",\\"Shorts - bordeaux mel, High-top trainers - black\\",\\"1, 1\\",\\"ZO0531205312, ZO0684706847\\",\\"0, 0\\",\\"14.992, 85\\",\\"14.992, 85\\",\\"0, 0\\",\\"ZO0531205312, ZO0684706847\\",100,100,2,2,order,yahya +WgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Jimenez\\",\\"Betty Jimenez\\",FEMALE,44,Jimenez,Jimenez,\\"(empty)\\",Sunday,6,\\"betty@jimenez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Oceanavigations, Champion Arts\\",\\"Oceanavigations, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564710,\\"sold_product_564710_21089, sold_product_564710_10916\\",\\"sold_product_564710_21089, sold_product_564710_10916\\",\\"33, 20.984\\",\\"33, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Champion Arts\\",\\"Oceanavigations, Champion Arts\\",\\"17.156, 10.906\\",\\"33, 20.984\\",\\"21,089, 10,916\\",\\"Jersey dress - black, Sweatshirt - black\\",\\"Jersey dress - black, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0263402634, ZO0499404994\\",\\"0, 0\\",\\"33, 20.984\\",\\"33, 20.984\\",\\"0, 0\\",\\"ZO0263402634, ZO0499404994\\",\\"53.969\\",\\"53.969\\",2,2,order,betty +YAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Daniels\\",\\"Clarice Daniels\\",FEMALE,18,Daniels,Daniels,\\"(empty)\\",Sunday,6,\\"clarice@daniels-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Oceanavigations, Champion Arts\\",\\"Oceanavigations, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564429,\\"sold_product_564429_19198, sold_product_564429_20939\\",\\"sold_product_564429_19198, sold_product_564429_20939\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Champion Arts\\",\\"Oceanavigations, Champion Arts\\",\\"24, 11.75\\",\\"50, 24.984\\",\\"19,198, 20,939\\",\\"Summer dress - grey, Shirt - black/white\\",\\"Summer dress - grey, Shirt - black/white\\",\\"1, 1\\",\\"ZO0260702607, ZO0495804958\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0260702607, ZO0495804958\\",75,75,2,2,order,clarice +YQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Clayton\\",\\"Jackson Clayton\\",MALE,13,Clayton,Clayton,\\"(empty)\\",Sunday,6,\\"jackson@clayton-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564479,\\"sold_product_564479_6603, sold_product_564479_21164\\",\\"sold_product_564479_6603, sold_product_564479_21164\\",\\"75, 10.992\\",\\"75, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"39, 5.93\\",\\"75, 10.992\\",\\"6,603, 21,164\\",\\"Suit jacket - navy, Long sleeved top - dark blue\\",\\"Suit jacket - navy, Long sleeved top - dark blue\\",\\"1, 1\\",\\"ZO0409304093, ZO0436904369\\",\\"0, 0\\",\\"75, 10.992\\",\\"75, 10.992\\",\\"0, 0\\",\\"ZO0409304093, ZO0436904369\\",86,86,2,2,order,jackson +YgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Davidson\\",\\"Abd Davidson\\",MALE,52,Davidson,Davidson,\\"(empty)\\",Sunday,6,\\"abd@davidson-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564513,\\"sold_product_564513_1824, sold_product_564513_19618\\",\\"sold_product_564513_1824, sold_product_564513_19618\\",\\"42, 42\\",\\"42, 42\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"20.156, 21\\",\\"42, 42\\",\\"1,824, 19,618\\",\\"Casual lace-ups - Violet, Waistcoat - petrol\\",\\"Casual lace-ups - Violet, Waistcoat - petrol\\",\\"1, 1\\",\\"ZO0390003900, ZO0287902879\\",\\"0, 0\\",\\"42, 42\\",\\"42, 42\\",\\"0, 0\\",\\"ZO0390003900, ZO0287902879\\",84,84,2,2,order,abd +xAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Stephanie,Stephanie,\\"Stephanie Rowe\\",\\"Stephanie Rowe\\",FEMALE,6,Rowe,Rowe,\\"(empty)\\",Sunday,6,\\"stephanie@rowe-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564885,\\"sold_product_564885_16366, sold_product_564885_11518\\",\\"sold_product_564885_16366, sold_product_564885_11518\\",\\"21.984, 10.992\\",\\"21.984, 10.992\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"10.344, 5.281\\",\\"21.984, 10.992\\",\\"16,366, 11,518\\",\\"Wallet - red, Scarf - white/navy/red\\",\\"Wallet - red, Scarf - white/navy/red\\",\\"1, 1\\",\\"ZO0303803038, ZO0192501925\\",\\"0, 0\\",\\"21.984, 10.992\\",\\"21.984, 10.992\\",\\"0, 0\\",\\"ZO0303803038, ZO0192501925\\",\\"32.969\\",\\"32.969\\",2,2,order,stephanie +UwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Bryant\\",\\"Mostafa Bryant\\",MALE,9,Bryant,Bryant,\\"(empty)\\",Sunday,6,\\"mostafa@bryant-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565150,\\"sold_product_565150_14275, sold_product_565150_22504\\",\\"sold_product_565150_14275, sold_product_565150_22504\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"25, 13.492\\",\\"50, 24.984\\",\\"14,275, 22,504\\",\\"Winter jacket - black, Shirt - red-blue\\",\\"Winter jacket - black, Shirt - red-blue\\",\\"1, 1\\",\\"ZO0624906249, ZO0411604116\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0624906249, ZO0411604116\\",75,75,2,2,order,mostafa +VAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Wood\\",\\"Jackson Wood\\",MALE,13,Wood,Wood,\\"(empty)\\",Sunday,6,\\"jackson@wood-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565206,\\"sold_product_565206_18416, sold_product_565206_16131\\",\\"sold_product_565206_18416, sold_product_565206_16131\\",\\"85, 60\\",\\"85, 60\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"45.031, 27\\",\\"85, 60\\",\\"18,416, 16,131\\",\\"Briefcase - dark brown, Lace-up boots - black\\",\\"Briefcase - dark brown, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0316303163, ZO0401004010\\",\\"0, 0\\",\\"85, 60\\",\\"85, 60\\",\\"0, 0\\",\\"ZO0316303163, ZO0401004010\\",145,145,2,2,order,jackson +9QMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Baker\\",\\"rania Baker\\",FEMALE,24,Baker,Baker,\\"(empty)\\",Sunday,6,\\"rania@baker-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Pyramidustries active, Champion Arts\\",\\"Pyramidustries active, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564759,\\"sold_product_564759_10104, sold_product_564759_20756\\",\\"sold_product_564759_10104, sold_product_564759_20756\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Champion Arts\\",\\"Pyramidustries active, Champion Arts\\",\\"8.828, 5.059\\",\\"16.984, 10.992\\",\\"10,104, 20,756\\",\\"Print T-shirt - black, Print T-shirt - red\\",\\"Print T-shirt - black, Print T-shirt - red\\",\\"1, 1\\",\\"ZO0218802188, ZO0492604926\\",\\"0, 0\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"0, 0\\",\\"ZO0218802188, ZO0492604926\\",\\"27.984\\",\\"27.984\\",2,2,order,rani +BAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Massey\\",\\"Wilhemina St. Massey\\",FEMALE,17,Massey,Massey,\\"(empty)\\",Sunday,6,\\"wilhemina st.@massey-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Pyramidustries active, Champion Arts\\",\\"Pyramidustries active, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564144,\\"sold_product_564144_20744, sold_product_564144_13946\\",\\"sold_product_564144_20744, sold_product_564144_13946\\",\\"16.984, 20.984\\",\\"16.984, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Champion Arts\\",\\"Pyramidustries active, Champion Arts\\",\\"8.328, 9.656\\",\\"16.984, 20.984\\",\\"20,744, 13,946\\",\\"Long sleeved top - black, Hoodie - dark grey multicolor\\",\\"Long sleeved top - black, Hoodie - dark grey multicolor\\",\\"1, 1\\",\\"ZO0218602186, ZO0501005010\\",\\"0, 0\\",\\"16.984, 20.984\\",\\"16.984, 20.984\\",\\"0, 0\\",\\"ZO0218602186, ZO0501005010\\",\\"37.969\\",\\"37.969\\",2,2,order,wilhemina +BgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Smith\\",\\"Abd Smith\\",MALE,52,Smith,Smith,\\"(empty)\\",Sunday,6,\\"abd@smith-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563909,\\"sold_product_563909_15619, sold_product_563909_17976\\",\\"sold_product_563909_15619, sold_product_563909_17976\\",\\"28.984, 24.984\\",\\"28.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"13.633, 12.25\\",\\"28.984, 24.984\\",\\"15,619, 17,976\\",\\"Jumper - dark blue, Jumper - blue\\",\\"Jumper - dark blue, Jumper - blue\\",\\"1, 1\\",\\"ZO0452804528, ZO0453604536\\",\\"0, 0\\",\\"28.984, 24.984\\",\\"28.984, 24.984\\",\\"0, 0\\",\\"ZO0452804528, ZO0453604536\\",\\"53.969\\",\\"53.969\\",2,2,order,abd +QgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Sonya,Sonya,\\"Sonya Thompson\\",\\"Sonya Thompson\\",FEMALE,28,Thompson,Thompson,\\"(empty)\\",Sunday,6,\\"sonya@thompson-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564869,\\"sold_product_564869_19715, sold_product_564869_7445\\",\\"sold_product_564869_19715, sold_product_564869_7445\\",\\"10.992, 42\\",\\"10.992, 42\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"5.93, 20.578\\",\\"10.992, 42\\",\\"19,715, 7,445\\",\\"Snood - nude/turquoise/pink, High heels - black\\",\\"Snood - nude/turquoise/pink, High heels - black\\",\\"1, 1\\",\\"ZO0192401924, ZO0366703667\\",\\"0, 0\\",\\"10.992, 42\\",\\"10.992, 42\\",\\"0, 0\\",\\"ZO0192401924, ZO0366703667\\",\\"52.969\\",\\"52.969\\",2,2,order,sonya +jQMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Recip,Recip,\\"Recip Tran\\",\\"Recip Tran\\",MALE,10,Tran,Tran,\\"(empty)\\",Sunday,6,\\"recip@tran-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564619,\\"sold_product_564619_19268, sold_product_564619_20016\\",\\"sold_product_564619_19268, sold_product_564619_20016\\",\\"85, 60\\",\\"85, 60\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"42.5, 28.203\\",\\"85, 60\\",\\"19,268, 20,016\\",\\"Briefcase - antique cognac, Lace-up boots - khaki\\",\\"Briefcase - antique cognac, Lace-up boots - khaki\\",\\"1, 1\\",\\"ZO0470304703, ZO0406204062\\",\\"0, 0\\",\\"85, 60\\",\\"85, 60\\",\\"0, 0\\",\\"ZO0470304703, ZO0406204062\\",145,145,2,2,order,recip +mwMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Samir,Samir,\\"Samir Moss\\",\\"Samir Moss\\",MALE,34,Moss,Moss,\\"(empty)\\",Sunday,6,\\"samir@moss-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564237,\\"sold_product_564237_19840, sold_product_564237_13857\\",\\"sold_product_564237_19840, sold_product_564237_13857\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"10.289, 17.156\\",\\"20.984, 33\\",\\"19,840, 13,857\\",\\"Watch - black, Trainers - beige\\",\\"Watch - black, Trainers - beige\\",\\"1, 1\\",\\"ZO0311203112, ZO0395703957\\",\\"0, 0\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"0, 0\\",\\"ZO0311203112, ZO0395703957\\",\\"53.969\\",\\"53.969\\",2,2,order,samir +\\"-QMtOW0BH63Xcmy44WNv\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Moss\\",\\"Fitzgerald Moss\\",MALE,11,Moss,Moss,\\"(empty)\\",Sunday,6,\\"fitzgerald@moss-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564269,\\"sold_product_564269_18446, sold_product_564269_19731\\",\\"sold_product_564269_18446, sold_product_564269_19731\\",\\"37, 10.992\\",\\"37, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"17.016, 5.059\\",\\"37, 10.992\\",\\"18,446, 19,731\\",\\"Shirt - dark grey multicolor, Print T-shirt - white/dark blue\\",\\"Shirt - dark grey multicolor, Print T-shirt - white/dark blue\\",\\"1, 1\\",\\"ZO0281102811, ZO0555705557\\",\\"0, 0\\",\\"37, 10.992\\",\\"37, 10.992\\",\\"0, 0\\",\\"ZO0281102811, ZO0555705557\\",\\"47.969\\",\\"47.969\\",2,2,order,fuzzy +NAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Kamal,Kamal,\\"Kamal Schultz\\",\\"Kamal Schultz\\",MALE,39,Schultz,Schultz,\\"(empty)\\",Sunday,6,\\"kamal@schultz-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564842,\\"sold_product_564842_13508, sold_product_564842_24934\\",\\"sold_product_564842_13508, sold_product_564842_24934\\",\\"85, 50\\",\\"85, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"43.344, 22.5\\",\\"85, 50\\",\\"13,508, 24,934\\",\\"Light jacket - tan, Lace-up boots - resin coffee\\",\\"Light jacket - tan, Lace-up boots - resin coffee\\",\\"1, 1\\",\\"ZO0432004320, ZO0403504035\\",\\"0, 0\\",\\"85, 50\\",\\"85, 50\\",\\"0, 0\\",\\"ZO0432004320, ZO0403504035\\",135,135,2,2,order,kamal +NQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Roberson\\",\\"Yasmine Roberson\\",FEMALE,43,Roberson,Roberson,\\"(empty)\\",Sunday,6,\\"yasmine@roberson-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Gnomehouse, Tigress Enterprises MAMA\\",\\"Gnomehouse, Tigress Enterprises MAMA\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564893,\\"sold_product_564893_24371, sold_product_564893_20755\\",\\"sold_product_564893_24371, sold_product_564893_20755\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises MAMA\\",\\"Gnomehouse, Tigress Enterprises MAMA\\",\\"25.984, 14.781\\",\\"50, 28.984\\",\\"24,371, 20,755\\",\\"Lace-ups - rose, Trousers - black denim\\",\\"Lace-ups - rose, Trousers - black denim\\",\\"1, 1\\",\\"ZO0322403224, ZO0227802278\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0322403224, ZO0227802278\\",79,79,2,2,order,yasmine +SQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Fletcher\\",\\"Betty Fletcher\\",FEMALE,44,Fletcher,Fletcher,\\"(empty)\\",Sunday,6,\\"betty@fletcher-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 22, 2019 @ 00:00:00.000\\",564215,\\"sold_product_564215_17589, sold_product_564215_17920\\",\\"sold_product_564215_17589, sold_product_564215_17920\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"17.484, 12.492\\",\\"33, 24.984\\",\\"17,589, 17,920\\",\\"Jumpsuit - black, Maxi dress - black\\",\\"Jumpsuit - black, Maxi dress - black\\",\\"1, 1\\",\\"ZO0147201472, ZO0152201522\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0147201472, ZO0152201522\\",\\"57.969\\",\\"57.969\\",2,2,order,betty +TAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Yasmine,Yasmine,\\"Yasmine Marshall\\",\\"Yasmine Marshall\\",FEMALE,43,Marshall,Marshall,\\"(empty)\\",Sunday,6,\\"yasmine@marshall-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Tigress Enterprises, Primemaster\\",\\"Tigress Enterprises, Primemaster\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564725,\\"sold_product_564725_21497, sold_product_564725_14166\\",\\"sold_product_564725_21497, sold_product_564725_14166\\",\\"24.984, 125\\",\\"24.984, 125\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Primemaster\\",\\"Tigress Enterprises, Primemaster\\",\\"13.492, 61.25\\",\\"24.984, 125\\",\\"21,497, 14,166\\",\\"Jumper - sand, Platform boots - golden\\",\\"Jumper - sand, Platform boots - golden\\",\\"1, 1\\",\\"ZO0071700717, ZO0364303643\\",\\"0, 0\\",\\"24.984, 125\\",\\"24.984, 125\\",\\"0, 0\\",\\"ZO0071700717, ZO0364303643\\",150,150,2,2,order,yasmine +TQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Allison\\",\\"Muniz Allison\\",MALE,37,Allison,Allison,\\"(empty)\\",Sunday,6,\\"muniz@allison-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564733,\\"sold_product_564733_1550, sold_product_564733_13038\\",\\"sold_product_564733_1550, sold_product_564733_13038\\",\\"33, 65\\",\\"33, 65\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"14.852, 31.203\\",\\"33, 65\\",\\"1,550, 13,038\\",\\"Casual lace-ups - dark brown, Suit jacket - grey\\",\\"Casual lace-ups - dark brown, Suit jacket - grey\\",\\"1, 1\\",\\"ZO0384303843, ZO0273702737\\",\\"0, 0\\",\\"33, 65\\",\\"33, 65\\",\\"0, 0\\",\\"ZO0384303843, ZO0273702737\\",98,98,2,2,order,muniz +mAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Mccarthy\\",\\"Rabbia Al Mccarthy\\",FEMALE,5,Mccarthy,Mccarthy,\\"(empty)\\",Sunday,6,\\"rabbia al@mccarthy-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises MAMA, Oceanavigations\\",\\"Tigress Enterprises MAMA, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564331,\\"sold_product_564331_24927, sold_product_564331_11378\\",\\"sold_product_564331_24927, sold_product_564331_11378\\",\\"37, 11.992\\",\\"37, 11.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Oceanavigations\\",\\"Tigress Enterprises MAMA, Oceanavigations\\",\\"18.859, 5.762\\",\\"37, 11.992\\",\\"24,927, 11,378\\",\\"Summer dress - black, Wallet - black\\",\\"Summer dress - black, Wallet - black\\",\\"1, 1\\",\\"ZO0229402294, ZO0303303033\\",\\"0, 0\\",\\"37, 11.992\\",\\"37, 11.992\\",\\"0, 0\\",\\"ZO0229402294, ZO0303303033\\",\\"48.969\\",\\"48.969\\",2,2,order,rabbia +mQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jason,Jason,\\"Jason Gregory\\",\\"Jason Gregory\\",MALE,16,Gregory,Gregory,\\"(empty)\\",Sunday,6,\\"jason@gregory-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564350,\\"sold_product_564350_15296, sold_product_564350_19902\\",\\"sold_product_564350_15296, sold_product_564350_19902\\",\\"18.984, 13.992\\",\\"18.984, 13.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"9.117, 7.41\\",\\"18.984, 13.992\\",\\"15,296, 19,902\\",\\"Polo shirt - red, TARTAN 3 PACK - Shorts - tartan/Blue Violety/dark grey\\",\\"Polo shirt - red, TARTAN 3 PACK - Shorts - tartan/Blue Violety/dark grey\\",\\"1, 1\\",\\"ZO0444104441, ZO0476804768\\",\\"0, 0\\",\\"18.984, 13.992\\",\\"18.984, 13.992\\",\\"0, 0\\",\\"ZO0444104441, ZO0476804768\\",\\"32.969\\",\\"32.969\\",2,2,order,jason +mgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Mccarthy\\",\\"Betty Mccarthy\\",FEMALE,44,Mccarthy,Mccarthy,\\"(empty)\\",Sunday,6,\\"betty@mccarthy-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Gnomehouse,Gnomehouse,\\"Jun 22, 2019 @ 00:00:00.000\\",564398,\\"sold_product_564398_15957, sold_product_564398_18712\\",\\"sold_product_564398_15957, sold_product_564398_18712\\",\\"37, 75\\",\\"37, 75\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Gnomehouse\\",\\"Gnomehouse, Gnomehouse\\",\\"19.234, 39.75\\",\\"37, 75\\",\\"15,957, 18,712\\",\\"A-line skirt - Pale Violet Red, Classic coat - navy blazer\\",\\"A-line skirt - Pale Violet Red, Classic coat - navy blazer\\",\\"1, 1\\",\\"ZO0328703287, ZO0351003510\\",\\"0, 0\\",\\"37, 75\\",\\"37, 75\\",\\"0, 0\\",\\"ZO0328703287, ZO0351003510\\",112,112,2,2,order,betty +mwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane Gibbs\\",\\"Diane Gibbs\\",FEMALE,22,Gibbs,Gibbs,\\"(empty)\\",Sunday,6,\\"diane@gibbs-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Pyramidustries, Champion Arts\\",\\"Pyramidustries, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564409,\\"sold_product_564409_23179, sold_product_564409_22261\\",\\"sold_product_564409_23179, sold_product_564409_22261\\",\\"20.984, 50\\",\\"20.984, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Champion Arts\\",\\"Pyramidustries, Champion Arts\\",\\"9.656, 22.5\\",\\"20.984, 50\\",\\"23,179, 22,261\\",\\"Sweatshirt - berry, Winter jacket - bordeaux\\",\\"Sweatshirt - berry, Winter jacket - bordeaux\\",\\"1, 1\\",\\"ZO0178501785, ZO0503805038\\",\\"0, 0\\",\\"20.984, 50\\",\\"20.984, 50\\",\\"0, 0\\",\\"ZO0178501785, ZO0503805038\\",71,71,2,2,order,diane +nAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Baker\\",\\"Hicham Baker\\",MALE,8,Baker,Baker,\\"(empty)\\",Sunday,6,\\"hicham@baker-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564024,\\"sold_product_564024_24786, sold_product_564024_19600\\",\\"sold_product_564024_24786, sold_product_564024_19600\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"11.25, 7.648\\",\\"24.984, 16.984\\",\\"24,786, 19,600\\",\\"Slim fit jeans - black, Sports shorts - mottled grey\\",\\"Slim fit jeans - black, Sports shorts - mottled grey\\",\\"1, 1\\",\\"ZO0534405344, ZO0619006190\\",\\"0, 0\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"0, 0\\",\\"ZO0534405344, ZO0619006190\\",\\"41.969\\",\\"41.969\\",2,2,order,hicham +sgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Perkins\\",\\"Robbie Perkins\\",MALE,48,Perkins,Perkins,\\"(empty)\\",Sunday,6,\\"robbie@perkins-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564271,\\"sold_product_564271_12818, sold_product_564271_18444\\",\\"sold_product_564271_12818, sold_product_564271_18444\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"8.328, 26.984\\",\\"16.984, 50\\",\\"12,818, 18,444\\",\\"Trainers - black, Summer jacket - dark blue\\",\\"Trainers - black, Summer jacket - dark blue\\",\\"1, 1\\",\\"ZO0507905079, ZO0430804308\\",\\"0, 0\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"0, 0\\",\\"ZO0507905079, ZO0430804308\\",67,67,2,2,order,robbie +DgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Sonya,Sonya,\\"Sonya Rodriguez\\",\\"Sonya Rodriguez\\",FEMALE,28,Rodriguez,Rodriguez,\\"(empty)\\",Sunday,6,\\"sonya@rodriguez-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Microlutions, Pyramidustries\\",\\"Microlutions, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564676,\\"sold_product_564676_22697, sold_product_564676_12704\\",\\"sold_product_564676_22697, sold_product_564676_12704\\",\\"33, 33\\",\\"33, 33\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Pyramidustries\\",\\"Microlutions, Pyramidustries\\",\\"14.852, 16.172\\",\\"33, 33\\",\\"22,697, 12,704\\",\\"Dress - red/black, Ankle boots - cognac\\",\\"Dress - red/black, Ankle boots - cognac\\",\\"1, 1\\",\\"ZO0108401084, ZO0139301393\\",\\"0, 0\\",\\"33, 33\\",\\"33, 33\\",\\"0, 0\\",\\"ZO0108401084, ZO0139301393\\",66,66,2,2,order,sonya +FAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Bryan\\",\\"Sultan Al Bryan\\",MALE,19,Bryan,Bryan,\\"(empty)\\",Sunday,6,\\"sultan al@bryan-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564445,\\"sold_product_564445_14799, sold_product_564445_15411\\",\\"sold_product_564445_14799, sold_product_564445_15411\\",\\"22.984, 16.984\\",\\"22.984, 16.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"11.953, 7.82\\",\\"22.984, 16.984\\",\\"14,799, 15,411\\",\\"Sweatshirt - mottled grey, Belt - black\\",\\"Sweatshirt - mottled grey, Belt - black\\",\\"1, 1\\",\\"ZO0593805938, ZO0701407014\\",\\"0, 0\\",\\"22.984, 16.984\\",\\"22.984, 16.984\\",\\"0, 0\\",\\"ZO0593805938, ZO0701407014\\",\\"39.969\\",\\"39.969\\",2,2,order,sultan +fgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Phil,Phil,\\"Phil Hodges\\",\\"Phil Hodges\\",MALE,50,Hodges,Hodges,\\"(empty)\\",Sunday,6,\\"phil@hodges-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",Elitelligence,Elitelligence,\\"Jun 22, 2019 @ 00:00:00.000\\",564241,\\"sold_product_564241_11300, sold_product_564241_16698\\",\\"sold_product_564241_11300, sold_product_564241_16698\\",\\"20.984, 7.988\\",\\"20.984, 7.988\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"9.867, 4.309\\",\\"20.984, 7.988\\",\\"11,300, 16,698\\",\\"Rucksack - black/grey multicolor , Basic T-shirt - light red\\",\\"Rucksack - black/grey multicolor , Basic T-shirt - light red\\",\\"1, 1\\",\\"ZO0605506055, ZO0547505475\\",\\"0, 0\\",\\"20.984, 7.988\\",\\"20.984, 7.988\\",\\"0, 0\\",\\"ZO0605506055, ZO0547505475\\",\\"28.984\\",\\"28.984\\",2,2,order,phil +fwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Phil,Phil,\\"Phil Hernandez\\",\\"Phil Hernandez\\",MALE,50,Hernandez,Hernandez,\\"(empty)\\",Sunday,6,\\"phil@hernandez-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",Elitelligence,Elitelligence,\\"Jun 22, 2019 @ 00:00:00.000\\",564272,\\"sold_product_564272_24786, sold_product_564272_19965\\",\\"sold_product_564272_24786, sold_product_564272_19965\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"11.25, 14.211\\",\\"24.984, 28.984\\",\\"24,786, 19,965\\",\\"Slim fit jeans - black, Casual lace-ups - dark grey\\",\\"Slim fit jeans - black, Casual lace-ups - dark grey\\",\\"1, 1\\",\\"ZO0534405344, ZO0512105121\\",\\"0, 0\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"0, 0\\",\\"ZO0534405344, ZO0512105121\\",\\"53.969\\",\\"53.969\\",2,2,order,phil +0AMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Jacobs\\",\\"Mostafa Jacobs\\",MALE,9,Jacobs,Jacobs,\\"(empty)\\",Sunday,6,\\"mostafa@jacobs-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Elitelligence,Elitelligence,\\"Jun 22, 2019 @ 00:00:00.000\\",564844,\\"sold_product_564844_24343, sold_product_564844_13084\\",\\"sold_product_564844_24343, sold_product_564844_13084\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"5.391, 12.742\\",\\"10.992, 24.984\\",\\"24,343, 13,084\\",\\"Print T-shirt - white, Chinos - Forest Green\\",\\"Print T-shirt - white, Chinos - Forest Green\\",\\"1, 1\\",\\"ZO0553205532, ZO0526205262\\",\\"0, 0\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"0, 0\\",\\"ZO0553205532, ZO0526205262\\",\\"35.969\\",\\"35.969\\",2,2,order,mostafa +0QMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Hansen\\",\\"Sonya Hansen\\",FEMALE,28,Hansen,Hansen,\\"(empty)\\",Sunday,6,\\"sonya@hansen-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Spherecords Maternity, Gnomehouse\\",\\"Spherecords Maternity, Gnomehouse\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564883,\\"sold_product_564883_16522, sold_product_564883_25026\\",\\"sold_product_564883_16522, sold_product_564883_25026\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Maternity, Gnomehouse\\",\\"Spherecords Maternity, Gnomehouse\\",\\"7.988, 22.5\\",\\"16.984, 50\\",\\"16,522, 25,026\\",\\"Jersey dress - black/white , Summer dress - multicolour\\",\\"Jersey dress - black/white , Summer dress - multicolour\\",\\"1, 1\\",\\"ZO0705607056, ZO0334703347\\",\\"0, 0\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"0, 0\\",\\"ZO0705607056, ZO0334703347\\",67,67,2,2,order,sonya +7wMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Ryan\\",\\"Rabbia Al Ryan\\",FEMALE,5,Ryan,Ryan,\\"(empty)\\",Sunday,6,\\"rabbia al@ryan-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564307,\\"sold_product_564307_18709, sold_product_564307_19883\\",\\"sold_product_564307_18709, sold_product_564307_19883\\",\\"75, 11.992\\",\\"75, 11.992\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"39.75, 5.52\\",\\"75, 11.992\\",\\"18,709, 19,883\\",\\"Boots - nude, Scarf - bordeaux/blue/rose\\",\\"Boots - nude, Scarf - bordeaux/blue/rose\\",\\"1, 1\\",\\"ZO0246602466, ZO0195201952\\",\\"0, 0\\",\\"75, 11.992\\",\\"75, 11.992\\",\\"0, 0\\",\\"ZO0246602466, ZO0195201952\\",87,87,2,2,order,rabbia +8AMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Ball\\",\\"Rabbia Al Ball\\",FEMALE,5,Ball,Ball,\\"(empty)\\",Sunday,6,\\"rabbia al@ball-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564148,\\"sold_product_564148_24106, sold_product_564148_16891\\",\\"sold_product_564148_24106, sold_product_564148_16891\\",\\"20.984, 21.984\\",\\"20.984, 21.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"9.867, 11.867\\",\\"20.984, 21.984\\",\\"24,106, 16,891\\",\\"Basic T-shirt - scarab, Rucksack - black \\",\\"Basic T-shirt - scarab, Rucksack - black \\",\\"1, 1\\",\\"ZO0057900579, ZO0211602116\\",\\"0, 0\\",\\"20.984, 21.984\\",\\"20.984, 21.984\\",\\"0, 0\\",\\"ZO0057900579, ZO0211602116\\",\\"42.969\\",\\"42.969\\",2,2,order,rabbia +\\"_wMtOW0BH63Xcmy44mWR\\",ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Betty,Betty,\\"Betty Bryant\\",\\"Betty Bryant\\",FEMALE,44,Bryant,Bryant,\\"(empty)\\",Sunday,6,\\"betty@bryant-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564009,\\"sold_product_564009_13956, sold_product_564009_21367\\",\\"sold_product_564009_13956, sold_product_564009_21367\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"11.328, 14.781\\",\\"20.984, 28.984\\",\\"13,956, 21,367\\",\\"Tracksuit bottoms - black, Trainers - black/silver\\",\\"Tracksuit bottoms - black, Trainers - black/silver\\",\\"1, 1\\",\\"ZO0487904879, ZO0027100271\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0487904879, ZO0027100271\\",\\"49.969\\",\\"49.969\\",2,2,order,betty +AAMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Harvey\\",\\"Abd Harvey\\",MALE,52,Harvey,Harvey,\\"(empty)\\",Sunday,6,\\"abd@harvey-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564532,\\"sold_product_564532_21335, sold_product_564532_20709\\",\\"sold_product_564532_21335, sold_product_564532_20709\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"6.352, 12\\",\\"11.992, 24.984\\",\\"21,335, 20,709\\",\\"2 PACK - Basic T-shirt - red multicolor, Tracksuit bottoms - black\\",\\"2 PACK - Basic T-shirt - red multicolor, Tracksuit bottoms - black\\",\\"1, 1\\",\\"ZO0474704747, ZO0622006220\\",\\"0, 0\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"0, 0\\",\\"ZO0474704747, ZO0622006220\\",\\"36.969\\",\\"36.969\\",2,2,order,abd +cwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Cummings\\",\\"Abigail Cummings\\",FEMALE,46,Cummings,Cummings,\\"(empty)\\",Sunday,6,\\"abigail@cummings-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Pyramidustries,Pyramidustries,\\"Jun 22, 2019 @ 00:00:00.000\\",565308,\\"sold_product_565308_16405, sold_product_565308_8985\\",\\"sold_product_565308_16405, sold_product_565308_8985\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"11.5, 27.594\\",\\"24.984, 60\\",\\"16,405, 8,985\\",\\"Vest - black, Light jacket - cognac\\",\\"Vest - black, Light jacket - cognac\\",\\"1, 1\\",\\"ZO0172401724, ZO0184901849\\",\\"0, 0\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"0, 0\\",\\"ZO0172401724, ZO0184901849\\",85,85,2,2,order,abigail +lQMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Moss\\",\\"Elyssa Moss\\",FEMALE,27,Moss,Moss,\\"(empty)\\",Sunday,6,\\"elyssa@moss-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564339,\\"sold_product_564339_24835, sold_product_564339_7932\\",\\"sold_product_564339_24835, sold_product_564339_7932\\",\\"13.992, 37\\",\\"13.992, 37\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"7.129, 19.594\\",\\"13.992, 37\\",\\"24,835, 7,932\\",\\"Scarf - red, Shirt - navy blazer\\",\\"Scarf - red, Shirt - navy blazer\\",\\"1, 1\\",\\"ZO0082900829, ZO0347903479\\",\\"0, 0\\",\\"13.992, 37\\",\\"13.992, 37\\",\\"0, 0\\",\\"ZO0082900829, ZO0347903479\\",\\"50.969\\",\\"50.969\\",2,2,order,elyssa +lgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Muniz,Muniz,\\"Muniz Parker\\",\\"Muniz Parker\\",MALE,37,Parker,Parker,\\"(empty)\\",Sunday,6,\\"muniz@parker-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564361,\\"sold_product_564361_12864, sold_product_564361_14121\\",\\"sold_product_564361_12864, sold_product_564361_14121\\",\\"22.984, 17.984\\",\\"22.984, 17.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"11.719, 9.172\\",\\"22.984, 17.984\\",\\"12,864, 14,121\\",\\"SLIM FIT - Formal shirt - black, Watch - grey\\",\\"SLIM FIT - Formal shirt - black, Watch - grey\\",\\"1, 1\\",\\"ZO0422304223, ZO0600506005\\",\\"0, 0\\",\\"22.984, 17.984\\",\\"22.984, 17.984\\",\\"0, 0\\",\\"ZO0422304223, ZO0600506005\\",\\"40.969\\",\\"40.969\\",2,2,order,muniz +lwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Sonya,Sonya,\\"Sonya Boone\\",\\"Sonya Boone\\",FEMALE,28,Boone,Boone,\\"(empty)\\",Sunday,6,\\"sonya@boone-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564394,\\"sold_product_564394_18592, sold_product_564394_11914\\",\\"sold_product_564394_18592, sold_product_564394_11914\\",\\"25.984, 75\\",\\"25.984, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"14.031, 39\\",\\"25.984, 75\\",\\"18,592, 11,914\\",\\"Long sleeved top - grey, Wedge boots - white\\",\\"Long sleeved top - grey, Wedge boots - white\\",\\"1, 1\\",\\"ZO0269902699, ZO0667906679\\",\\"0, 0\\",\\"25.984, 75\\",\\"25.984, 75\\",\\"0, 0\\",\\"ZO0269902699, ZO0667906679\\",101,101,2,2,order,sonya +mAMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Hopkins\\",\\"rania Hopkins\\",FEMALE,24,Hopkins,Hopkins,\\"(empty)\\",Sunday,6,\\"rania@hopkins-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564030,\\"sold_product_564030_24668, sold_product_564030_20234\\",\\"sold_product_564030_24668, sold_product_564030_20234\\",\\"16.984, 6.988\\",\\"16.984, 6.988\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Spherecords\\",\\"Pyramidustries, Spherecords\\",\\"8.828, 3.221\\",\\"16.984, 6.988\\",\\"24,668, 20,234\\",\\"Sweatshirt - black, Vest - bordeaux\\",\\"Sweatshirt - black, Vest - bordeaux\\",\\"1, 1\\",\\"ZO0179901799, ZO0637606376\\",\\"0, 0\\",\\"16.984, 6.988\\",\\"16.984, 6.988\\",\\"0, 0\\",\\"ZO0179901799, ZO0637606376\\",\\"23.984\\",\\"23.984\\",2,2,order,rani +qwMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Salazar\\",\\"Mostafa Salazar\\",MALE,9,Salazar,Salazar,\\"(empty)\\",Sunday,6,\\"mostafa@salazar-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564661,\\"sold_product_564661_20323, sold_product_564661_20690\\",\\"sold_product_564661_20323, sold_product_564661_20690\\",\\"22.984, 33\\",\\"22.984, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"12.18, 18.141\\",\\"22.984, 33\\",\\"20,323, 20,690\\",\\"Formal shirt - light blue, Sweatshirt - black\\",\\"Formal shirt - light blue, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0415004150, ZO0125501255\\",\\"0, 0\\",\\"22.984, 33\\",\\"22.984, 33\\",\\"0, 0\\",\\"ZO0415004150, ZO0125501255\\",\\"55.969\\",\\"55.969\\",2,2,order,mostafa +rAMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Yasmine,Yasmine,\\"Yasmine Estrada\\",\\"Yasmine Estrada\\",FEMALE,43,Estrada,Estrada,\\"(empty)\\",Sunday,6,\\"yasmine@estrada-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Spherecords Curvy, Primemaster\\",\\"Spherecords Curvy, Primemaster\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564706,\\"sold_product_564706_13450, sold_product_564706_11576\\",\\"sold_product_564706_13450, sold_product_564706_11576\\",\\"11.992, 115\\",\\"11.992, 115\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Curvy, Primemaster\\",\\"Spherecords Curvy, Primemaster\\",\\"5.879, 60.938\\",\\"11.992, 115\\",\\"13,450, 11,576\\",\\"Pencil skirt - black, High heeled boots - Midnight Blue\\",\\"Pencil skirt - black, High heeled boots - Midnight Blue\\",\\"1, 1\\",\\"ZO0709007090, ZO0362103621\\",\\"0, 0\\",\\"11.992, 115\\",\\"11.992, 115\\",\\"0, 0\\",\\"ZO0709007090, ZO0362103621\\",127,127,2,2,order,yasmine +sgMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Tran\\",\\"rania Tran\\",FEMALE,24,Tran,Tran,\\"(empty)\\",Sunday,6,\\"rania@tran-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564460,\\"sold_product_564460_24985, sold_product_564460_16158\\",\\"sold_product_564460_24985, sold_product_564460_16158\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"12, 15.508\\",\\"24.984, 33\\",\\"24,985, 16,158\\",\\"Cardigan - peacoat, Blouse - Dark Turquoise\\",\\"Cardigan - peacoat, Blouse - Dark Turquoise\\",\\"1, 1\\",\\"ZO0655106551, ZO0349403494\\",\\"0, 0\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"0, 0\\",\\"ZO0655106551, ZO0349403494\\",\\"57.969\\",\\"57.969\\",2,2,order,rani +FwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Diane,Diane,\\"Diane Palmer\\",\\"Diane Palmer\\",FEMALE,22,Palmer,Palmer,\\"(empty)\\",Sunday,6,\\"diane@palmer-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564536,\\"sold_product_564536_17282, sold_product_564536_12577\\",\\"sold_product_564536_17282, sold_product_564536_12577\\",\\"13.992, 50\\",\\"13.992, 50\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"6.719, 24.5\\",\\"13.992, 50\\",\\"17,282, 12,577\\",\\"Scarf - black, Sandals - beige\\",\\"Scarf - black, Sandals - beige\\",\\"1, 1\\",\\"ZO0304603046, ZO0370603706\\",\\"0, 0\\",\\"13.992, 50\\",\\"13.992, 50\\",\\"0, 0\\",\\"ZO0304603046, ZO0370603706\\",\\"63.969\\",\\"63.969\\",2,2,order,diane +GAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Bowers\\",\\"Abigail Bowers\\",FEMALE,46,Bowers,Bowers,\\"(empty)\\",Sunday,6,\\"abigail@bowers-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564559,\\"sold_product_564559_4882, sold_product_564559_16317\\",\\"sold_product_564559_4882, sold_product_564559_16317\\",\\"50, 21.984\\",\\"50, 21.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"26.484, 12.094\\",\\"50, 21.984\\",\\"4,882, 16,317\\",\\"Boots - brown, Shirt - light blue\\",\\"Boots - brown, Shirt - light blue\\",\\"1, 1\\",\\"ZO0015500155, ZO0650806508\\",\\"0, 0\\",\\"50, 21.984\\",\\"50, 21.984\\",\\"0, 0\\",\\"ZO0015500155, ZO0650806508\\",72,72,2,2,order,abigail +GQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Wood\\",\\"Clarice Wood\\",FEMALE,18,Wood,Wood,\\"(empty)\\",Sunday,6,\\"clarice@wood-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Pyramidustries,Pyramidustries,\\"Jun 22, 2019 @ 00:00:00.000\\",564609,\\"sold_product_564609_23139, sold_product_564609_23243\\",\\"sold_product_564609_23139, sold_product_564609_23243\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"6.23, 12.492\\",\\"11.992, 24.984\\",\\"23,139, 23,243\\",\\"Print T-shirt - black/berry, Summer dress - dark purple\\",\\"Print T-shirt - black/berry, Summer dress - dark purple\\",\\"1, 1\\",\\"ZO0162401624, ZO0156001560\\",\\"0, 0\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"0, 0\\",\\"ZO0162401624, ZO0156001560\\",\\"36.969\\",\\"36.969\\",2,2,order,clarice +awMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Caldwell\\",\\"Tariq Caldwell\\",MALE,25,Caldwell,Caldwell,\\"(empty)\\",Sunday,6,\\"tariq@caldwell-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565138,\\"sold_product_565138_18229, sold_product_565138_19505\\",\\"sold_product_565138_18229, sold_product_565138_19505\\",\\"8.992, 16.984\\",\\"8.992, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"4.578, 8.656\\",\\"8.992, 16.984\\",\\"18,229, 19,505\\",\\"Sports shirt - black, Polo shirt - dark blue\\",\\"Sports shirt - black, Polo shirt - dark blue\\",\\"1, 1\\",\\"ZO0615506155, ZO0445304453\\",\\"0, 0\\",\\"8.992, 16.984\\",\\"8.992, 16.984\\",\\"0, 0\\",\\"ZO0615506155, ZO0445304453\\",\\"25.984\\",\\"25.984\\",2,2,order,tariq +bAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Taylor\\",\\"Marwan Taylor\\",MALE,51,Taylor,Taylor,\\"(empty)\\",Sunday,6,\\"marwan@taylor-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565025,\\"sold_product_565025_10984, sold_product_565025_12566\\",\\"sold_product_565025_10984, sold_product_565025_12566\\",\\"24.984, 7.988\\",\\"24.984, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"11.5, 3.92\\",\\"24.984, 7.988\\",\\"10,984, 12,566\\",\\"Shirt - navy, Vest - dark blue\\",\\"Shirt - navy, Vest - dark blue\\",\\"1, 1\\",\\"ZO0280802808, ZO0549005490\\",\\"0, 0\\",\\"24.984, 7.988\\",\\"24.984, 7.988\\",\\"0, 0\\",\\"ZO0280802808, ZO0549005490\\",\\"32.969\\",\\"32.969\\",2,2,order,marwan +hgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Bowers\\",\\"Elyssa Bowers\\",FEMALE,27,Bowers,Bowers,\\"(empty)\\",Sunday,6,\\"elyssa@bowers-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564000,\\"sold_product_564000_21941, sold_product_564000_12880\\",\\"sold_product_564000_21941, sold_product_564000_12880\\",\\"110, 24.984\\",\\"110, 24.984\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"55, 13.492\\",\\"110, 24.984\\",\\"21,941, 12,880\\",\\"Boots - grey/silver, Ankle boots - blue\\",\\"Boots - grey/silver, Ankle boots - blue\\",\\"1, 1\\",\\"ZO0364603646, ZO0018200182\\",\\"0, 0\\",\\"110, 24.984\\",\\"110, 24.984\\",\\"0, 0\\",\\"ZO0364603646, ZO0018200182\\",135,135,2,2,order,elyssa +hwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Samir,Samir,\\"Samir Meyer\\",\\"Samir Meyer\\",MALE,34,Meyer,Meyer,\\"(empty)\\",Sunday,6,\\"samir@meyer-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564557,\\"sold_product_564557_24657, sold_product_564557_24558\\",\\"sold_product_564557_24657, sold_product_564557_24558\\",\\"10.992, 10.992\\",\\"10.992, 10.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"5.93, 5.5\\",\\"10.992, 10.992\\",\\"24,657, 24,558\\",\\"7 PACK - Socks - black/grey/white/navy, Hat - dark grey multicolor\\",\\"7 PACK - Socks - black/grey/white/navy, Hat - dark grey multicolor\\",\\"1, 1\\",\\"ZO0664606646, ZO0460404604\\",\\"0, 0\\",\\"10.992, 10.992\\",\\"10.992, 10.992\\",\\"0, 0\\",\\"ZO0664606646, ZO0460404604\\",\\"21.984\\",\\"21.984\\",2,2,order,samir +iAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Cortez\\",\\"Elyssa Cortez\\",FEMALE,27,Cortez,Cortez,\\"(empty)\\",Sunday,6,\\"elyssa@cortez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Oceanavigations,Oceanavigations,\\"Jun 22, 2019 @ 00:00:00.000\\",564604,\\"sold_product_564604_20084, sold_product_564604_22900\\",\\"sold_product_564604_20084, sold_product_564604_22900\\",\\"60, 13.992\\",\\"60, 13.992\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"28.797, 6.578\\",\\"60, 13.992\\",\\"20,084, 22,900\\",\\"High heels - black, Scarf - black/taupe\\",\\"High heels - black, Scarf - black/taupe\\",\\"1, 1\\",\\"ZO0237702377, ZO0304303043\\",\\"0, 0\\",\\"60, 13.992\\",\\"60, 13.992\\",\\"0, 0\\",\\"ZO0237702377, ZO0304303043\\",74,74,2,2,order,elyssa +mAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yahya,Yahya,\\"Yahya Graham\\",\\"Yahya Graham\\",MALE,23,Graham,Graham,\\"(empty)\\",Sunday,6,\\"yahya@graham-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564777,\\"sold_product_564777_15017, sold_product_564777_22683\\",\\"sold_product_564777_15017, sold_product_564777_22683\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"13.633, 15.18\\",\\"28.984, 33\\",\\"15,017, 22,683\\",\\"Jumper - off-white, Jumper - black\\",\\"Jumper - off-white, Jumper - black\\",\\"1, 1\\",\\"ZO0452704527, ZO0122201222\\",\\"0, 0\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"0, 0\\",\\"ZO0452704527, ZO0122201222\\",\\"61.969\\",\\"61.969\\",2,2,order,yahya +mQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Gwen,Gwen,\\"Gwen Rodriguez\\",\\"Gwen Rodriguez\\",FEMALE,26,Rodriguez,Rodriguez,\\"(empty)\\",Sunday,6,\\"gwen@rodriguez-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564812,\\"sold_product_564812_24272, sold_product_564812_12257\\",\\"sold_product_564812_24272, sold_product_564812_12257\\",\\"37, 20.984\\",\\"37, 20.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"18.125, 10.703\\",\\"37, 20.984\\",\\"24,272, 12,257\\",\\"Shirt - white, T-bar sandals - black\\",\\"Shirt - white, T-bar sandals - black\\",\\"1, 1\\",\\"ZO0266002660, ZO0031900319\\",\\"0, 0\\",\\"37, 20.984\\",\\"37, 20.984\\",\\"0, 0\\",\\"ZO0266002660, ZO0031900319\\",\\"57.969\\",\\"57.969\\",2,2,order,gwen +owMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Mcdonald\\",\\"Jackson Mcdonald\\",MALE,13,Mcdonald,Mcdonald,\\"(empty)\\",Sunday,6,\\"jackson@mcdonald-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Microlutions, Low Tide Media, Spritechnologies, Oceanavigations\\",\\"Microlutions, Low Tide Media, Spritechnologies, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",715752,\\"sold_product_715752_18080, sold_product_715752_18512, sold_product_715752_3636, sold_product_715752_6169\\",\\"sold_product_715752_18080, sold_product_715752_18512, sold_product_715752_3636, sold_product_715752_6169\\",\\"6.988, 65, 14.992, 20.984\\",\\"6.988, 65, 14.992, 20.984\\",\\"Men's Clothing, Men's Shoes, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Shoes, Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Microlutions, Low Tide Media, Spritechnologies, Oceanavigations\\",\\"Microlutions, Low Tide Media, Spritechnologies, Oceanavigations\\",\\"3.699, 34.438, 7.941, 11.539\\",\\"6.988, 65, 14.992, 20.984\\",\\"18,080, 18,512, 3,636, 6,169\\",\\"3 PACK - Socks - khaki/black, Lace-up boots - black/grey, Undershirt - black, Jumper - grey\\",\\"3 PACK - Socks - khaki/black, Lace-up boots - black/grey, Undershirt - black, Jumper - grey\\",\\"1, 1, 1, 1\\",\\"ZO0130801308, ZO0402604026, ZO0630506305, ZO0297402974\\",\\"0, 0, 0, 0\\",\\"6.988, 65, 14.992, 20.984\\",\\"6.988, 65, 14.992, 20.984\\",\\"0, 0, 0, 0\\",\\"ZO0130801308, ZO0402604026, ZO0630506305, ZO0297402974\\",\\"107.938\\",\\"107.938\\",4,4,order,jackson +sQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Diane,Diane,\\"Diane Watkins\\",\\"Diane Watkins\\",FEMALE,22,Watkins,Watkins,\\"(empty)\\",Sunday,6,\\"diane@watkins-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563964,\\"sold_product_563964_12582, sold_product_563964_18661\\",\\"sold_product_563964_12582, sold_product_563964_18661\\",\\"14.992, 85\\",\\"14.992, 85\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"6.898, 38.25\\",\\"14.992, 85\\",\\"12,582, 18,661\\",\\"Ballet pumps - nude, Winter boots - black\\",\\"Ballet pumps - nude, Winter boots - black\\",\\"1, 1\\",\\"ZO0001200012, ZO0251902519\\",\\"0, 0\\",\\"14.992, 85\\",\\"14.992, 85\\",\\"0, 0\\",\\"ZO0001200012, ZO0251902519\\",100,100,2,2,order,diane +2wMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Maldonado\\",\\"Betty Maldonado\\",FEMALE,44,Maldonado,Maldonado,\\"(empty)\\",Sunday,6,\\"betty@maldonado-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Pyramidustries active, Oceanavigations\\",\\"Pyramidustries active, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564315,\\"sold_product_564315_14794, sold_product_564315_25010\\",\\"sold_product_564315_14794, sold_product_564315_25010\\",\\"11.992, 17.984\\",\\"11.992, 17.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Oceanavigations\\",\\"Pyramidustries active, Oceanavigations\\",\\"5.762, 9.891\\",\\"11.992, 17.984\\",\\"14,794, 25,010\\",\\"Vest - sheer pink, Print T-shirt - white\\",\\"Vest - sheer pink, Print T-shirt - white\\",\\"1, 1\\",\\"ZO0221002210, ZO0263702637\\",\\"0, 0\\",\\"11.992, 17.984\\",\\"11.992, 17.984\\",\\"0, 0\\",\\"ZO0221002210, ZO0263702637\\",\\"29.984\\",\\"29.984\\",2,2,order,betty +CwMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Barber\\",\\"Elyssa Barber\\",FEMALE,27,Barber,Barber,\\"(empty)\\",Sunday,6,\\"elyssa@barber-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565237,\\"sold_product_565237_15847, sold_product_565237_9482\\",\\"sold_product_565237_15847, sold_product_565237_9482\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"23.5, 12.992\\",\\"50, 24.984\\",\\"15,847, 9,482\\",\\"Lace-ups - platino, Blouse - off white\\",\\"Lace-ups - platino, Blouse - off white\\",\\"1, 1\\",\\"ZO0323303233, ZO0172101721\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0323303233, ZO0172101721\\",75,75,2,2,order,elyssa +DgMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Samir,Samir,\\"Samir Tyler\\",\\"Samir Tyler\\",MALE,34,Tyler,Tyler,\\"(empty)\\",Sunday,6,\\"samir@tyler-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565090,\\"sold_product_565090_21928, sold_product_565090_1424\\",\\"sold_product_565090_21928, sold_product_565090_1424\\",\\"85, 42\\",\\"85, 42\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"46.75, 20.156\\",\\"85, 42\\",\\"21,928, 1,424\\",\\"Lace-up boots - black, Lace-up boots - black\\",\\"Lace-up boots - black, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0690306903, ZO0521005210\\",\\"0, 0\\",\\"85, 42\\",\\"85, 42\\",\\"0, 0\\",\\"ZO0690306903, ZO0521005210\\",127,127,2,2,order,samir +JAMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Porter\\",\\"Yuri Porter\\",MALE,21,Porter,Porter,\\"(empty)\\",Sunday,6,\\"yuri@porter-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564649,\\"sold_product_564649_1961, sold_product_564649_6945\\",\\"sold_product_564649_1961, sold_product_564649_6945\\",\\"65, 22.984\\",\\"65, 22.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"30.547, 11.273\\",\\"65, 22.984\\",\\"1,961, 6,945\\",\\"Lace-up boots - dark blue, Shirt - navy\\",\\"Lace-up boots - dark blue, Shirt - navy\\",\\"1, 1\\",\\"ZO0405704057, ZO0411704117\\",\\"0, 0\\",\\"65, 22.984\\",\\"65, 22.984\\",\\"0, 0\\",\\"ZO0405704057, ZO0411704117\\",88,88,2,2,order,yuri +KAMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Cummings\\",\\"Gwen Cummings\\",FEMALE,26,Cummings,Cummings,\\"(empty)\\",Sunday,6,\\"gwen@cummings-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564510,\\"sold_product_564510_15201, sold_product_564510_10898\\",\\"sold_product_564510_15201, sold_product_564510_10898\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"11.75, 14.781\\",\\"24.984, 28.984\\",\\"15,201, 10,898\\",\\"Handbag - black, Jumpsuit - black\\",\\"Handbag - black, Jumpsuit - black\\",\\"1, 1\\",\\"ZO0093600936, ZO0145301453\\",\\"0, 0\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"0, 0\\",\\"ZO0093600936, ZO0145301453\\",\\"53.969\\",\\"53.969\\",2,2,order,gwen +YwMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Brigitte,Brigitte,\\"Brigitte Cortez\\",\\"Brigitte Cortez\\",FEMALE,12,Cortez,Cortez,\\"(empty)\\",Sunday,6,\\"brigitte@cortez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises Curvy, Oceanavigations\\",\\"Tigress Enterprises Curvy, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565222,\\"sold_product_565222_20561, sold_product_565222_22115\\",\\"sold_product_565222_20561, sold_product_565222_22115\\",\\"24.984, 75\\",\\"24.984, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises Curvy, Oceanavigations\\",\\"Tigress Enterprises Curvy, Oceanavigations\\",\\"12.992, 34.5\\",\\"24.984, 75\\",\\"20,561, 22,115\\",\\"Tracksuit bottoms - black, Winter boots - taupe\\",\\"Tracksuit bottoms - black, Winter boots - taupe\\",\\"1, 1\\",\\"ZO0102001020, ZO0252402524\\",\\"0, 0\\",\\"24.984, 75\\",\\"24.984, 75\\",\\"0, 0\\",\\"ZO0102001020, ZO0252402524\\",100,100,2,2,order,brigitte +kQMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robert,Robert,\\"Robert Lawrence\\",\\"Robert Lawrence\\",MALE,29,Lawrence,Lawrence,\\"(empty)\\",Sunday,6,\\"robert@lawrence-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565233,\\"sold_product_565233_24859, sold_product_565233_12805\\",\\"sold_product_565233_24859, sold_product_565233_12805\\",\\"11.992, 55\\",\\"11.992, 55\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Low Tide Media\\",\\"Spritechnologies, Low Tide Media\\",\\"5.879, 29.141\\",\\"11.992, 55\\",\\"24,859, 12,805\\",\\"Sports shirt - black, Down jacket - dark beige\\",\\"Sports shirt - black, Down jacket - dark beige\\",\\"1, 1\\",\\"ZO0614906149, ZO0430404304\\",\\"0, 0\\",\\"11.992, 55\\",\\"11.992, 55\\",\\"0, 0\\",\\"ZO0614906149, ZO0430404304\\",67,67,2,2,order,robert +mgMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Brock\\",\\"Youssef Brock\\",MALE,31,Brock,Brock,\\"(empty)\\",Sunday,6,\\"youssef@brock-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 22, 2019 @ 00:00:00.000\\",565084,\\"sold_product_565084_11612, sold_product_565084_6793\\",\\"sold_product_565084_11612, sold_product_565084_6793\\",\\"10.992, 16.984\\",\\"10.992, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"5.82, 7.82\\",\\"10.992, 16.984\\",\\"11,612, 6,793\\",\\"Print T-shirt - grey, Jumper - grey multicolor\\",\\"Print T-shirt - grey, Jumper - grey multicolor\\",\\"1, 1\\",\\"ZO0549805498, ZO0541205412\\",\\"0, 0\\",\\"10.992, 16.984\\",\\"10.992, 16.984\\",\\"0, 0\\",\\"ZO0549805498, ZO0541205412\\",\\"27.984\\",\\"27.984\\",2,2,order,youssef +sQMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Mckenzie\\",\\"Elyssa Mckenzie\\",FEMALE,27,Mckenzie,Mckenzie,\\"(empty)\\",Sunday,6,\\"elyssa@mckenzie-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564796,\\"sold_product_564796_13332, sold_product_564796_23987\\",\\"sold_product_564796_13332, sold_product_564796_23987\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"15.18, 13.492\\",\\"33, 24.984\\",\\"13,332, 23,987\\",\\"Cowboy/Biker boots - cognac, Shirt - red/black\\",\\"Cowboy/Biker boots - cognac, Shirt - red/black\\",\\"1, 1\\",\\"ZO0022100221, ZO0172301723\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0022100221, ZO0172301723\\",\\"57.969\\",\\"57.969\\",2,2,order,elyssa +sgMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Burton\\",\\"Gwen Burton\\",FEMALE,26,Burton,Burton,\\"(empty)\\",Sunday,6,\\"gwen@burton-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Pyramidustries, Champion Arts\\",\\"Pyramidustries, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564627,\\"sold_product_564627_16073, sold_product_564627_15494\\",\\"sold_product_564627_16073, sold_product_564627_15494\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Champion Arts\\",\\"Pyramidustries, Champion Arts\\",\\"11.75, 8.328\\",\\"24.984, 16.984\\",\\"16,073, 15,494\\",\\"Rucksack - black , Sweatshirt - black\\",\\"Rucksack - black , Sweatshirt - black\\",\\"1, 1\\",\\"ZO0211702117, ZO0499004990\\",\\"0, 0\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"0, 0\\",\\"ZO0211702117, ZO0499004990\\",\\"41.969\\",\\"41.969\\",2,2,order,gwen +twMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robert,Robert,\\"Robert James\\",\\"Robert James\\",MALE,29,James,James,\\"(empty)\\",Sunday,6,\\"robert@james-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",Elitelligence,Elitelligence,\\"Jun 22, 2019 @ 00:00:00.000\\",564257,\\"sold_product_564257_23012, sold_product_564257_14015\\",\\"sold_product_564257_23012, sold_product_564257_14015\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"17.813, 15.648\\",\\"33, 28.984\\",\\"23,012, 14,015\\",\\"Denim jacket - grey denim, Jumper - blue\\",\\"Denim jacket - grey denim, Jumper - blue\\",\\"1, 1\\",\\"ZO0539205392, ZO0577705777\\",\\"0, 0\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"0, 0\\",\\"ZO0539205392, ZO0577705777\\",\\"61.969\\",\\"61.969\\",2,2,order,robert +uwMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Boone\\",\\"Yuri Boone\\",MALE,21,Boone,Boone,\\"(empty)\\",Sunday,6,\\"yuri@boone-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564701,\\"sold_product_564701_18884, sold_product_564701_20066\\",\\"sold_product_564701_18884, sold_product_564701_20066\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"9.656, 13.242\\",\\"20.984, 24.984\\",\\"18,884, 20,066\\",\\"Sweatshirt - black /white, Shirt - oliv\\",\\"Sweatshirt - black /white, Shirt - oliv\\",\\"1, 1\\",\\"ZO0585205852, ZO0418104181\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0585205852, ZO0418104181\\",\\"45.969\\",\\"45.969\\",2,2,order,yuri +DwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Hicham,Hicham,\\"Hicham Bryant\\",\\"Hicham Bryant\\",MALE,8,Bryant,Bryant,\\"(empty)\\",Sunday,6,\\"hicham@bryant-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564915,\\"sold_product_564915_13194, sold_product_564915_13091\\",\\"sold_product_564915_13194, sold_product_564915_13091\\",\\"50, 29.984\\",\\"50, 29.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"24, 15.289\\",\\"50, 29.984\\",\\"13,194, 13,091\\",\\"Summer jacket - petrol, Trainers - navy\\",\\"Summer jacket - petrol, Trainers - navy\\",\\"1, 1\\",\\"ZO0286502865, ZO0394703947\\",\\"0, 0\\",\\"50, 29.984\\",\\"50, 29.984\\",\\"0, 0\\",\\"ZO0286502865, ZO0394703947\\",80,80,2,2,order,hicham +EAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Diane,Diane,\\"Diane Ball\\",\\"Diane Ball\\",FEMALE,22,Ball,Ball,\\"(empty)\\",Sunday,6,\\"diane@ball-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564954,\\"sold_product_564954_20928, sold_product_564954_13902\\",\\"sold_product_564954_20928, sold_product_564954_13902\\",\\"150, 42\\",\\"150, 42\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Primemaster, Tigress Enterprises\\",\\"Primemaster, Tigress Enterprises\\",\\"70.5, 22.672\\",\\"150, 42\\",\\"20,928, 13,902\\",\\"Over-the-knee boots - passion, Lohan - Summer dress - black/black\\",\\"Over-the-knee boots - passion, Lohan - Summer dress - black/black\\",\\"1, 1\\",\\"ZO0362903629, ZO0048100481\\",\\"0, 0\\",\\"150, 42\\",\\"150, 42\\",\\"0, 0\\",\\"ZO0362903629, ZO0048100481\\",192,192,2,2,order,diane +EQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Gregory\\",\\"Gwen Gregory\\",FEMALE,26,Gregory,Gregory,\\"(empty)\\",Sunday,6,\\"gwen@gregory-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Pyramidustries active, Pyramidustries\\",\\"Pyramidustries active, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565009,\\"sold_product_565009_17113, sold_product_565009_24241\\",\\"sold_product_565009_17113, sold_product_565009_24241\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Pyramidustries\\",\\"Pyramidustries active, Pyramidustries\\",\\"8.328, 11.25\\",\\"16.984, 24.984\\",\\"17,113, 24,241\\",\\"Tights - duffle bag, Jeans Skinny Fit - black denim\\",\\"Tights - duffle bag, Jeans Skinny Fit - black denim\\",\\"1, 1\\",\\"ZO0225302253, ZO0183101831\\",\\"0, 0\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"0, 0\\",\\"ZO0225302253, ZO0183101831\\",\\"41.969\\",\\"41.969\\",2,2,order,gwen +EgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Mary,Mary,\\"Mary Sherman\\",\\"Mary Sherman\\",FEMALE,20,Sherman,Sherman,\\"(empty)\\",Sunday,6,\\"mary@sherman-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords Curvy, Spherecords\\",\\"Spherecords Curvy, Spherecords\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564065,\\"sold_product_564065_16220, sold_product_564065_13835\\",\\"sold_product_564065_16220, sold_product_564065_13835\\",\\"14.992, 10.992\\",\\"14.992, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Curvy, Spherecords\\",\\"Spherecords Curvy, Spherecords\\",\\"7.789, 5.82\\",\\"14.992, 10.992\\",\\"16,220, 13,835\\",\\"Vest - white, Print T-shirt - light grey multicolor/white\\",\\"Vest - white, Print T-shirt - light grey multicolor/white\\",\\"1, 1\\",\\"ZO0711207112, ZO0646106461\\",\\"0, 0\\",\\"14.992, 10.992\\",\\"14.992, 10.992\\",\\"0, 0\\",\\"ZO0711207112, ZO0646106461\\",\\"25.984\\",\\"25.984\\",2,2,order,mary +EwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Abigail,Abigail,\\"Abigail Stewart\\",\\"Abigail Stewart\\",FEMALE,46,Stewart,Stewart,\\"(empty)\\",Sunday,6,\\"abigail@stewart-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Primemaster\\",\\"Tigress Enterprises, Primemaster\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563927,\\"sold_product_563927_11755, sold_product_563927_17765\\",\\"sold_product_563927_11755, sold_product_563927_17765\\",\\"24.984, 125\\",\\"24.984, 125\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Primemaster\\",\\"Tigress Enterprises, Primemaster\\",\\"12.25, 57.5\\",\\"24.984, 125\\",\\"11,755, 17,765\\",\\"Sandals - cognac, High heeled boots - Midnight Blue\\",\\"Sandals - cognac, High heeled boots - Midnight Blue\\",\\"1, 1\\",\\"ZO0009800098, ZO0362803628\\",\\"0, 0\\",\\"24.984, 125\\",\\"24.984, 125\\",\\"0, 0\\",\\"ZO0009800098, ZO0362803628\\",150,150,2,2,order,abigail +XQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Mckinney\\",\\"Marwan Mckinney\\",MALE,51,Mckinney,Mckinney,\\"(empty)\\",Sunday,6,\\"marwan@mckinney-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564937,\\"sold_product_564937_1994, sold_product_564937_6646\\",\\"sold_product_564937_1994, sold_product_564937_6646\\",\\"33, 75\\",\\"33, 75\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"17.484, 35.25\\",\\"33, 75\\",\\"1,994, 6,646\\",\\"Lace-up boots - dark grey, Winter jacket - dark camel\\",\\"Lace-up boots - dark grey, Winter jacket - dark camel\\",\\"1, 1\\",\\"ZO0520605206, ZO0432204322\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0520605206, ZO0432204322\\",108,108,2,2,order,marwan +XgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Henderson\\",\\"Yasmine Henderson\\",FEMALE,43,Henderson,Henderson,\\"(empty)\\",Sunday,6,\\"yasmine@henderson-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Pyramidustries, Spherecords Curvy\\",\\"Pyramidustries, Spherecords Curvy\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564994,\\"sold_product_564994_16814, sold_product_564994_17456\\",\\"sold_product_564994_16814, sold_product_564994_17456\\",\\"24.984, 11.992\\",\\"24.984, 11.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Spherecords Curvy\\",\\"Pyramidustries, Spherecords Curvy\\",\\"12.992, 6.109\\",\\"24.984, 11.992\\",\\"16,814, 17,456\\",\\"Sweatshirt - light grey multicolor, Long sleeved top - dark grey multicolor\\",\\"Sweatshirt - light grey multicolor, Long sleeved top - dark grey multicolor\\",\\"1, 1\\",\\"ZO0180601806, ZO0710007100\\",\\"0, 0\\",\\"24.984, 11.992\\",\\"24.984, 11.992\\",\\"0, 0\\",\\"ZO0180601806, ZO0710007100\\",\\"36.969\\",\\"36.969\\",2,2,order,yasmine +XwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,rania,rania,\\"rania Howell\\",\\"rania Howell\\",FEMALE,24,Howell,Howell,\\"(empty)\\",Sunday,6,\\"rania@howell-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Gnomehouse mom, Oceanavigations\\",\\"Gnomehouse mom, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564070,\\"sold_product_564070_23824, sold_product_564070_5275\\",\\"sold_product_564070_23824, sold_product_564070_5275\\",\\"55, 65\\",\\"55, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse mom, Oceanavigations\\",\\"Gnomehouse mom, Oceanavigations\\",\\"29.688, 35.094\\",\\"55, 65\\",\\"23,824, 5,275\\",\\"Summer dress - red ochre, Boots - dark brown\\",\\"Summer dress - red ochre, Boots - dark brown\\",\\"1, 1\\",\\"ZO0234202342, ZO0245102451\\",\\"0, 0\\",\\"55, 65\\",\\"55, 65\\",\\"0, 0\\",\\"ZO0234202342, ZO0245102451\\",120,120,2,2,order,rani +YAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Miller\\",\\"Jackson Miller\\",MALE,13,Miller,Miller,\\"(empty)\\",Sunday,6,\\"jackson@miller-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563928,\\"sold_product_563928_17644, sold_product_563928_11004\\",\\"sold_product_563928_17644, sold_product_563928_11004\\",\\"60, 50\\",\\"60, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"29.406, 26.484\\",\\"60, 50\\",\\"17,644, 11,004\\",\\"Suit jacket - dark blue, Casual lace-ups - Gold/cognac/lion\\",\\"Suit jacket - dark blue, Casual lace-ups - Gold/cognac/lion\\",\\"1, 1\\",\\"ZO0424104241, ZO0394103941\\",\\"0, 0\\",\\"60, 50\\",\\"60, 50\\",\\"0, 0\\",\\"ZO0424104241, ZO0394103941\\",110,110,2,2,order,jackson +xQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Morrison\\",\\"Rabbia Al Morrison\\",FEMALE,5,Morrison,Morrison,\\"(empty)\\",Sunday,6,\\"rabbia al@morrison-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Spherecords, Pyramidustries\\",\\"Tigress Enterprises, Spherecords, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",727071,\\"sold_product_727071_20781, sold_product_727071_23338, sold_product_727071_15267, sold_product_727071_12138\\",\\"sold_product_727071_20781, sold_product_727071_23338, sold_product_727071_15267, sold_product_727071_12138\\",\\"17.984, 16.984, 16.984, 32\\",\\"17.984, 16.984, 16.984, 32\\",\\"Women's Accessories, Women's Clothing, Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Clothing, Women's Accessories, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Spherecords, Pyramidustries, Tigress Enterprises\\",\\"Tigress Enterprises, Spherecords, Pyramidustries, Tigress Enterprises\\",\\"8.102, 9.172, 7.988, 16.953\\",\\"17.984, 16.984, 16.984, 32\\",\\"20,781, 23,338, 15,267, 12,138\\",\\"Across body bag - old rose , Pyjama set - grey/pink, Handbag - grey, Handbag - black\\",\\"Across body bag - old rose , Pyjama set - grey/pink, Handbag - grey, Handbag - black\\",\\"1, 1, 1, 1\\",\\"ZO0091900919, ZO0660006600, ZO0197001970, ZO0074600746\\",\\"0, 0, 0, 0\\",\\"17.984, 16.984, 16.984, 32\\",\\"17.984, 16.984, 16.984, 32\\",\\"0, 0, 0, 0\\",\\"ZO0091900919, ZO0660006600, ZO0197001970, ZO0074600746\\",84,84,4,4,order,rabbia +zAMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Phil,Phil,\\"Phil Benson\\",\\"Phil Benson\\",MALE,50,Benson,Benson,\\"(empty)\\",Sunday,6,\\"phil@benson-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565284,\\"sold_product_565284_587, sold_product_565284_12864\\",\\"sold_product_565284_587, sold_product_565284_12864\\",\\"60, 22.984\\",\\"60, 22.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"27.594, 11.719\\",\\"60, 22.984\\",\\"587, 12,864\\",\\"Boots - cognac, SLIM FIT - Formal shirt - black\\",\\"Boots - cognac, SLIM FIT - Formal shirt - black\\",\\"1, 1\\",\\"ZO0687206872, ZO0422304223\\",\\"0, 0\\",\\"60, 22.984\\",\\"60, 22.984\\",\\"0, 0\\",\\"ZO0687206872, ZO0422304223\\",83,83,2,2,order,phil +0AMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Cook\\",\\"Stephanie Cook\\",FEMALE,6,Cook,Cook,\\"(empty)\\",Sunday,6,\\"stephanie@cook-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564380,\\"sold_product_564380_13907, sold_product_564380_23338\\",\\"sold_product_564380_13907, sold_product_564380_23338\\",\\"37, 16.984\\",\\"37, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"16.656, 9.172\\",\\"37, 16.984\\",\\"13,907, 23,338\\",\\"Summer dress - black/Blue Violety, Pyjama set - grey/pink\\",\\"Summer dress - black/Blue Violety, Pyjama set - grey/pink\\",\\"1, 1\\",\\"ZO0050400504, ZO0660006600\\",\\"0, 0\\",\\"37, 16.984\\",\\"37, 16.984\\",\\"0, 0\\",\\"ZO0050400504, ZO0660006600\\",\\"53.969\\",\\"53.969\\",2,2,order,stephanie +JQMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Clarice,Clarice,\\"Clarice Howell\\",\\"Clarice Howell\\",FEMALE,18,Howell,Howell,\\"(empty)\\",Sunday,6,\\"clarice@howell-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Pyramidustries, Angeldale\\",\\"Pyramidustries, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565276,\\"sold_product_565276_19432, sold_product_565276_23037\\",\\"sold_product_565276_19432, sold_product_565276_23037\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Angeldale\\",\\"Pyramidustries, Angeldale\\",\\"10.906, 34.5\\",\\"20.984, 75\\",\\"19,432, 23,037\\",\\"Slip-ons - black, Lace-ups - black\\",\\"Slip-ons - black, Lace-ups - black\\",\\"1, 1\\",\\"ZO0131501315, ZO0668806688\\",\\"0, 0\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"0, 0\\",\\"ZO0131501315, ZO0668806688\\",96,96,2,2,order,clarice +JgMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Stephanie,Stephanie,\\"Stephanie Marshall\\",\\"Stephanie Marshall\\",FEMALE,6,Marshall,Marshall,\\"(empty)\\",Sunday,6,\\"stephanie@marshall-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564819,\\"sold_product_564819_22794, sold_product_564819_20865\\",\\"sold_product_564819_22794, sold_product_564819_20865\\",\\"100, 65\\",\\"100, 65\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"46, 34.438\\",\\"100, 65\\",\\"22,794, 20,865\\",\\"Boots - Midnight Blue, Handbag - black\\",\\"Boots - Midnight Blue, Handbag - black\\",\\"1, 1\\",\\"ZO0374603746, ZO0697106971\\",\\"0, 0\\",\\"100, 65\\",\\"100, 65\\",\\"0, 0\\",\\"ZO0374603746, ZO0697106971\\",165,165,2,2,order,stephanie +yQMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Foster\\",\\"Eddie Foster\\",MALE,38,Foster,Foster,\\"(empty)\\",Sunday,6,\\"eddie@foster-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Microlutions, Elitelligence\\",\\"Low Tide Media, Microlutions, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",717243,\\"sold_product_717243_19724, sold_product_717243_20018, sold_product_717243_21122, sold_product_717243_13406\\",\\"sold_product_717243_19724, sold_product_717243_20018, sold_product_717243_21122, sold_product_717243_13406\\",\\"18.984, 33, 20.984, 11.992\\",\\"18.984, 33, 20.984, 11.992\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Microlutions, Low Tide Media, Elitelligence\\",\\"Low Tide Media, Microlutions, Low Tide Media, Elitelligence\\",\\"9.117, 16.172, 10.289, 6.59\\",\\"18.984, 33, 20.984, 11.992\\",\\"19,724, 20,018, 21,122, 13,406\\",\\"Swimming shorts - dark blue, Sweatshirt - Medium Spring Green, Sweatshirt - green , Basic T-shirt - blue\\",\\"Swimming shorts - dark blue, Sweatshirt - Medium Spring Green, Sweatshirt - green , Basic T-shirt - blue\\",\\"1, 1, 1, 1\\",\\"ZO0479104791, ZO0125301253, ZO0459004590, ZO0549905499\\",\\"0, 0, 0, 0\\",\\"18.984, 33, 20.984, 11.992\\",\\"18.984, 33, 20.984, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0479104791, ZO0125301253, ZO0459004590, ZO0549905499\\",\\"84.938\\",\\"84.938\\",4,4,order,eddie +6QMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Phelps\\",\\"Pia Phelps\\",FEMALE,45,Phelps,Phelps,\\"(empty)\\",Sunday,6,\\"pia@phelps-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries active, Oceanavigations\\",\\"Pyramidustries active, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564140,\\"sold_product_564140_14794, sold_product_564140_18586\\",\\"sold_product_564140_14794, sold_product_564140_18586\\",\\"11.992, 42\\",\\"11.992, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Oceanavigations\\",\\"Pyramidustries active, Oceanavigations\\",\\"5.762, 21.828\\",\\"11.992, 42\\",\\"14,794, 18,586\\",\\"Vest - sheer pink, Cardigan - dark green\\",\\"Vest - sheer pink, Cardigan - dark green\\",\\"1, 1\\",\\"ZO0221002210, ZO0268502685\\",\\"0, 0\\",\\"11.992, 42\\",\\"11.992, 42\\",\\"0, 0\\",\\"ZO0221002210, ZO0268502685\\",\\"53.969\\",\\"53.969\\",2,2,order,pia +6gMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Jenkins\\",\\"Rabbia Al Jenkins\\",FEMALE,5,Jenkins,Jenkins,\\"(empty)\\",Sunday,6,\\"rabbia al@jenkins-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564164,\\"sold_product_564164_17391, sold_product_564164_11357\\",\\"sold_product_564164_17391, sold_product_564164_11357\\",\\"85, 11.992\\",\\"85, 11.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Pyramidustries\\",\\"Angeldale, Pyramidustries\\",\\"46.75, 6.469\\",\\"85, 11.992\\",\\"17,391, 11,357\\",\\"Ankle boots - black, Pyjama bottoms - grey\\",\\"Ankle boots - black, Pyjama bottoms - grey\\",\\"1, 1\\",\\"ZO0673506735, ZO0213002130\\",\\"0, 0\\",\\"85, 11.992\\",\\"85, 11.992\\",\\"0, 0\\",\\"ZO0673506735, ZO0213002130\\",97,97,2,2,order,rabbia +6wMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Ruiz\\",\\"Betty Ruiz\\",FEMALE,44,Ruiz,Ruiz,\\"(empty)\\",Sunday,6,\\"betty@ruiz-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564207,\\"sold_product_564207_11825, sold_product_564207_17988\\",\\"sold_product_564207_11825, sold_product_564207_17988\\",\\"24.984, 37\\",\\"24.984, 37\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"11.5, 18.125\\",\\"24.984, 37\\",\\"11,825, 17,988\\",\\"Cardigan - black, Cardigan - sand mel/black\\",\\"Cardigan - black, Cardigan - sand mel/black\\",\\"1, 1\\",\\"ZO0711807118, ZO0073100731\\",\\"0, 0\\",\\"24.984, 37\\",\\"24.984, 37\\",\\"0, 0\\",\\"ZO0711807118, ZO0073100731\\",\\"61.969\\",\\"61.969\\",2,2,order,betty +7QMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Thad,Thad,\\"Thad Kim\\",\\"Thad Kim\\",MALE,30,Kim,Kim,\\"(empty)\\",Sunday,6,\\"thad@kim-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564735,\\"sold_product_564735_13418, sold_product_564735_14150\\",\\"sold_product_564735_13418, sold_product_564735_14150\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"9, 8.492\\",\\"16.984, 16.984\\",\\"13,418, 14,150\\",\\"High-top trainers - navy, Print T-shirt - black\\",\\"High-top trainers - navy, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0509705097, ZO0120501205\\",\\"0, 0\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"0, 0\\",\\"ZO0509705097, ZO0120501205\\",\\"33.969\\",\\"33.969\\",2,2,order,thad +8gMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Hudson\\",\\"Sultan Al Hudson\\",MALE,19,Hudson,Hudson,\\"(empty)\\",Sunday,6,\\"sultan al@hudson-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Microlutions,Microlutions,\\"Jun 22, 2019 @ 00:00:00.000\\",565077,\\"sold_product_565077_21138, sold_product_565077_20998\\",\\"sold_product_565077_21138, sold_product_565077_20998\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Microlutions\\",\\"Microlutions, Microlutions\\",\\"9.172, 14.781\\",\\"16.984, 28.984\\",\\"21,138, 20,998\\",\\"Basic T-shirt - black, Sweatshirt - black\\",\\"Basic T-shirt - black, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0118701187, ZO0123901239\\",\\"0, 0\\",\\"16.984, 28.984\\",\\"16.984, 28.984\\",\\"0, 0\\",\\"ZO0118701187, ZO0123901239\\",\\"45.969\\",\\"45.969\\",2,2,order,sultan +AAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Wood\\",\\"Jackson Wood\\",MALE,13,Wood,Wood,\\"(empty)\\",Sunday,6,\\"jackson@wood-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564274,\\"sold_product_564274_23599, sold_product_564274_23910\\",\\"sold_product_564274_23599, sold_product_564274_23910\\",\\"75, 26.984\\",\\"75, 26.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"34.5, 13.758\\",\\"75, 26.984\\",\\"23,599, 23,910\\",\\"Winter jacket - oliv, Shorts - dark blue\\",\\"Winter jacket - oliv, Shorts - dark blue\\",\\"1, 1\\",\\"ZO0542905429, ZO0423604236\\",\\"0, 0\\",\\"75, 26.984\\",\\"75, 26.984\\",\\"0, 0\\",\\"ZO0542905429, ZO0423604236\\",102,102,2,2,order,jackson +HgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Walters\\",\\"Thad Walters\\",MALE,30,Walters,Walters,\\"(empty)\\",Sunday,6,\\"thad@walters-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565161,\\"sold_product_565161_23831, sold_product_565161_13178\\",\\"sold_product_565161_23831, sold_product_565161_13178\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"5.5, 32.375\\",\\"10.992, 60\\",\\"23,831, 13,178\\",\\"Basic T-shirt - oliv , Light jacket - navy\\",\\"Basic T-shirt - oliv , Light jacket - navy\\",\\"1, 1\\",\\"ZO0441404414, ZO0430504305\\",\\"0, 0\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"0, 0\\",\\"ZO0441404414, ZO0430504305\\",71,71,2,2,order,thad +HwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Selena,Selena,\\"Selena Taylor\\",\\"Selena Taylor\\",FEMALE,42,Taylor,Taylor,\\"(empty)\\",Sunday,6,\\"selena@taylor-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Champion Arts, Angeldale\\",\\"Champion Arts, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565039,\\"sold_product_565039_17587, sold_product_565039_19471\\",\\"sold_product_565039_17587, sold_product_565039_19471\\",\\"16.984, 13.992\\",\\"16.984, 13.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Angeldale\\",\\"Champion Arts, Angeldale\\",\\"8.328, 6.859\\",\\"16.984, 13.992\\",\\"17,587, 19,471\\",\\"Jersey dress - khaki, Belt - dark brown\\",\\"Jersey dress - khaki, Belt - dark brown\\",\\"1, 1\\",\\"ZO0489804898, ZO0695006950\\",\\"0, 0\\",\\"16.984, 13.992\\",\\"16.984, 13.992\\",\\"0, 0\\",\\"ZO0489804898, ZO0695006950\\",\\"30.984\\",\\"30.984\\",2,2,order,selena +PwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Stokes\\",\\"Elyssa Stokes\\",FEMALE,27,Stokes,Stokes,\\"(empty)\\",Sunday,6,\\"elyssa@stokes-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Champion Arts, Pyramidustries\\",\\"Spherecords, Champion Arts, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",723683,\\"sold_product_723683_19440, sold_product_723683_17349, sold_product_723683_14873, sold_product_723683_24863\\",\\"sold_product_723683_19440, sold_product_723683_17349, sold_product_723683_14873, sold_product_723683_24863\\",\\"10.992, 33, 42, 11.992\\",\\"10.992, 33, 42, 11.992\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spherecords, Champion Arts, Pyramidustries, Champion Arts\\",\\"Spherecords, Champion Arts, Pyramidustries, Champion Arts\\",\\"5.93, 18.141, 21, 5.879\\",\\"10.992, 33, 42, 11.992\\",\\"19,440, 17,349, 14,873, 24,863\\",\\"Long sleeved top - dark green, Bomber Jacket - khaki/black, Platform boots - grey, Vest - black/white\\",\\"Long sleeved top - dark green, Bomber Jacket - khaki/black, Platform boots - grey, Vest - black/white\\",\\"1, 1, 1, 1\\",\\"ZO0648206482, ZO0496104961, ZO0142601426, ZO0491504915\\",\\"0, 0, 0, 0\\",\\"10.992, 33, 42, 11.992\\",\\"10.992, 33, 42, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0648206482, ZO0496104961, ZO0142601426, ZO0491504915\\",\\"97.938\\",\\"97.938\\",4,4,order,elyssa +CAMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Lloyd\\",\\"Stephanie Lloyd\\",FEMALE,6,Lloyd,Lloyd,\\"(empty)\\",Sunday,6,\\"stephanie@lloyd-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Champion Arts, Spherecords\\",\\"Champion Arts, Spherecords\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563967,\\"sold_product_563967_21565, sold_product_563967_8534\\",\\"sold_product_563967_21565, sold_product_563967_8534\\",\\"10.992, 10.992\\",\\"10.992, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Spherecords\\",\\"Champion Arts, Spherecords\\",\\"5.281, 5.82\\",\\"10.992, 10.992\\",\\"21,565, 8,534\\",\\"Print T-shirt - dark grey multicolor, Long sleeved top - black\\",\\"Print T-shirt - dark grey multicolor, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0493404934, ZO0640806408\\",\\"0, 0\\",\\"10.992, 10.992\\",\\"10.992, 10.992\\",\\"0, 0\\",\\"ZO0493404934, ZO0640806408\\",\\"21.984\\",\\"21.984\\",2,2,order,stephanie +LwMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Rodriguez\\",\\"Abigail Rodriguez\\",FEMALE,46,Rodriguez,Rodriguez,\\"(empty)\\",Sunday,6,\\"abigail@rodriguez-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564533,\\"sold_product_564533_15845, sold_product_564533_17192\\",\\"sold_product_564533_15845, sold_product_564533_17192\\",\\"42, 33\\",\\"42, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Tigress Enterprises\\",\\"Champion Arts, Tigress Enterprises\\",\\"23.094, 16.5\\",\\"42, 33\\",\\"15,845, 17,192\\",\\"Summer jacket - black, Jersey dress - black\\",\\"Summer jacket - black, Jersey dress - black\\",\\"1, 1\\",\\"ZO0496704967, ZO0049700497\\",\\"0, 0\\",\\"42, 33\\",\\"42, 33\\",\\"0, 0\\",\\"ZO0496704967, ZO0049700497\\",75,75,2,2,order,abigail +NwMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Frances,Frances,\\"Frances Dennis\\",\\"Frances Dennis\\",FEMALE,49,Dennis,Dennis,\\"(empty)\\",Sunday,6,\\"frances@dennis-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565266,\\"sold_product_565266_18617, sold_product_565266_17793\\",\\"sold_product_565266_18617, sold_product_565266_17793\\",\\"60, 35\\",\\"60, 35\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"31.797, 16.453\\",\\"60, 35\\",\\"18,617, 17,793\\",\\"Slip-ons - black, Briefcase - black\\",\\"Slip-ons - black, Briefcase - black\\",\\"1, 1\\",\\"ZO0255602556, ZO0468304683\\",\\"0, 0\\",\\"60, 35\\",\\"60, 35\\",\\"0, 0\\",\\"ZO0255602556, ZO0468304683\\",95,95,2,2,order,frances +OAMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al James\\",\\"Ahmed Al James\\",MALE,4,James,James,\\"(empty)\\",Sunday,6,\\"ahmed al@james-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564818,\\"sold_product_564818_12813, sold_product_564818_24108\\",\\"sold_product_564818_12813, sold_product_564818_24108\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"5.52, 11.25\\",\\"11.992, 24.984\\",\\"12,813, 24,108\\",\\"2 PACK - Basic T-shirt - black, SLIM FIT - Formal shirt - light blue\\",\\"2 PACK - Basic T-shirt - black, SLIM FIT - Formal shirt - light blue\\",\\"1, 1\\",\\"ZO0475004750, ZO0412304123\\",\\"0, 0\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"0, 0\\",\\"ZO0475004750, ZO0412304123\\",\\"36.969\\",\\"36.969\\",2,2,order,ahmed +XQMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Yahya,Yahya,\\"Yahya Turner\\",\\"Yahya Turner\\",MALE,23,Turner,Turner,\\"(empty)\\",Sunday,6,\\"yahya@turner-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Elitelligence,Elitelligence,\\"Jun 22, 2019 @ 00:00:00.000\\",564932,\\"sold_product_564932_23918, sold_product_564932_23529\\",\\"sold_product_564932_23918, sold_product_564932_23529\\",\\"7.988, 20.984\\",\\"7.988, 20.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"4.148, 10.906\\",\\"7.988, 20.984\\",\\"23,918, 23,529\\",\\"Print T-shirt - red, Across body bag - blue/cognac\\",\\"Print T-shirt - red, Across body bag - blue/cognac\\",\\"1, 1\\",\\"ZO0557305573, ZO0607806078\\",\\"0, 0\\",\\"7.988, 20.984\\",\\"7.988, 20.984\\",\\"0, 0\\",\\"ZO0557305573, ZO0607806078\\",\\"28.984\\",\\"28.984\\",2,2,order,yahya +XgMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Banks\\",\\"Clarice Banks\\",FEMALE,18,Banks,Banks,\\"(empty)\\",Sunday,6,\\"clarice@banks-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564968,\\"sold_product_564968_14312, sold_product_564968_22436\\",\\"sold_product_564968_14312, sold_product_564968_22436\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"15.844, 9.492\\",\\"33, 18.984\\",\\"14,312, 22,436\\",\\"High heels - yellow, Vest - gold metallic\\",\\"High heels - yellow, Vest - gold metallic\\",\\"1, 1\\",\\"ZO0134101341, ZO0062400624\\",\\"0, 0\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"0, 0\\",\\"ZO0134101341, ZO0062400624\\",\\"51.969\\",\\"51.969\\",2,2,order,clarice +XwMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Morrison\\",\\"Betty Morrison\\",FEMALE,44,Morrison,Morrison,\\"(empty)\\",Sunday,6,\\"betty@morrison-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Gnomehouse,Gnomehouse,\\"Jun 22, 2019 @ 00:00:00.000\\",565002,\\"sold_product_565002_22932, sold_product_565002_21168\\",\\"sold_product_565002_22932, sold_product_565002_21168\\",\\"100, 75\\",\\"100, 75\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Gnomehouse\\",\\"Gnomehouse, Gnomehouse\\",\\"54, 33.75\\",\\"100, 75\\",\\"22,932, 21,168\\",\\"Classic coat - grey, Cocktail dress / Party dress - eclipse\\",\\"Classic coat - grey, Cocktail dress / Party dress - eclipse\\",\\"1, 1\\",\\"ZO0354203542, ZO0338503385\\",\\"0, 0\\",\\"100, 75\\",\\"100, 75\\",\\"0, 0\\",\\"ZO0354203542, ZO0338503385\\",175,175,2,2,order,betty +YQMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Robbie,Robbie,\\"Robbie Conner\\",\\"Robbie Conner\\",MALE,48,Conner,Conner,\\"(empty)\\",Sunday,6,\\"robbie@conner-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564095,\\"sold_product_564095_23104, sold_product_564095_24934\\",\\"sold_product_564095_23104, sold_product_564095_24934\\",\\"10.992, 50\\",\\"10.992, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.281, 22.5\\",\\"10.992, 50\\",\\"23,104, 24,934\\",\\"5 PACK - Socks - multicoloured, Lace-up boots - resin coffee\\",\\"5 PACK - Socks - multicoloured, Lace-up boots - resin coffee\\",\\"1, 1\\",\\"ZO0613806138, ZO0403504035\\",\\"0, 0\\",\\"10.992, 50\\",\\"10.992, 50\\",\\"0, 0\\",\\"ZO0613806138, ZO0403504035\\",\\"60.969\\",\\"60.969\\",2,2,order,robbie +YgMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Clayton\\",\\"Yuri Clayton\\",MALE,21,Clayton,Clayton,\\"(empty)\\",Sunday,6,\\"yuri@clayton-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",Elitelligence,Elitelligence,\\"Jun 22, 2019 @ 00:00:00.000\\",563924,\\"sold_product_563924_14271, sold_product_563924_15400\\",\\"sold_product_563924_14271, sold_product_563924_15400\\",\\"50, 14.992\\",\\"50, 14.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"23, 7.051\\",\\"50, 14.992\\",\\"14,271, 15,400\\",\\"Bomber Jacket - blue mix, Long sleeved top - khaki\\",\\"Bomber Jacket - blue mix, Long sleeved top - khaki\\",\\"1, 1\\",\\"ZO0539805398, ZO0554205542\\",\\"0, 0\\",\\"50, 14.992\\",\\"50, 14.992\\",\\"0, 0\\",\\"ZO0539805398, ZO0554205542\\",65,65,2,2,order,yuri +7AMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Mccarthy\\",\\"Elyssa Mccarthy\\",FEMALE,27,Mccarthy,Mccarthy,\\"(empty)\\",Sunday,6,\\"elyssa@mccarthy-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564770,\\"sold_product_564770_15776, sold_product_564770_17904\\",\\"sold_product_564770_15776, sold_product_564770_17904\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"Spherecords Maternity, Tigress Enterprises\\",\\"10.078, 17.156\\",\\"20.984, 33\\",\\"15,776, 17,904\\",\\"2 PACK - Leggings - black, Ankle boots - black\\",\\"2 PACK - Leggings - black, Ankle boots - black\\",\\"1, 1\\",\\"ZO0704907049, ZO0024700247\\",\\"0, 0\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"0, 0\\",\\"ZO0704907049, ZO0024700247\\",\\"53.969\\",\\"53.969\\",2,2,order,elyssa +SQMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Adams\\",\\"Elyssa Adams\\",FEMALE,27,Adams,Adams,\\"(empty)\\",Sunday,6,\\"elyssa@adams-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563965,\\"sold_product_563965_18560, sold_product_563965_14856\\",\\"sold_product_563965_18560, sold_product_563965_14856\\",\\"34, 18.984\\",\\"34, 18.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"18.016, 9.313\\",\\"34, 18.984\\",\\"18,560, 14,856\\",\\"Summer dress - peacoat/pomegranade, Sweatshirt - grey\\",\\"Summer dress - peacoat/pomegranade, Sweatshirt - grey\\",\\"1, 1\\",\\"ZO0045800458, ZO0503405034\\",\\"0, 0\\",\\"34, 18.984\\",\\"34, 18.984\\",\\"0, 0\\",\\"ZO0045800458, ZO0503405034\\",\\"52.969\\",\\"52.969\\",2,2,order,elyssa +ZAMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Powell\\",\\"rania Powell\\",FEMALE,24,Powell,Powell,\\"(empty)\\",Sunday,6,\\"rania@powell-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Pyramidustries,Pyramidustries,\\"Jun 22, 2019 @ 00:00:00.000\\",564957,\\"sold_product_564957_22053, sold_product_564957_17382\\",\\"sold_product_564957_22053, sold_product_564957_17382\\",\\"28.984, 6.988\\",\\"28.984, 6.988\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"15.648, 3.359\\",\\"28.984, 6.988\\",\\"22,053, 17,382\\",\\"Shirt - light blue, Tights - black\\",\\"Shirt - light blue, Tights - black\\",\\"1, 1\\",\\"ZO0171601716, ZO0214602146\\",\\"0, 0\\",\\"28.984, 6.988\\",\\"28.984, 6.988\\",\\"0, 0\\",\\"ZO0171601716, ZO0214602146\\",\\"35.969\\",\\"35.969\\",2,2,order,rani +ZQMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jim,Jim,\\"Jim Brewer\\",\\"Jim Brewer\\",MALE,41,Brewer,Brewer,\\"(empty)\\",Sunday,6,\\"jim@brewer-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564032,\\"sold_product_564032_20226, sold_product_564032_16558\\",\\"sold_product_564032_20226, sold_product_564032_16558\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"15.648, 15.508\\",\\"28.984, 33\\",\\"20,226, 16,558\\",\\"Pyjamas - grey/blue, Boots - dark brown\\",\\"Pyjamas - grey/blue, Boots - dark brown\\",\\"1, 1\\",\\"ZO0478404784, ZO0521905219\\",\\"0, 0\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"0, 0\\",\\"ZO0478404784, ZO0521905219\\",\\"61.969\\",\\"61.969\\",2,2,order,jim +ZgMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Estrada\\",\\"Muniz Estrada\\",MALE,37,Estrada,Estrada,\\"(empty)\\",Sunday,6,\\"muniz@estrada-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564075,\\"sold_product_564075_21248, sold_product_564075_12047\\",\\"sold_product_564075_21248, sold_product_564075_12047\\",\\"27.984, 20.984\\",\\"27.984, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"13.992, 10.289\\",\\"27.984, 20.984\\",\\"21,248, 12,047\\",\\"Windbreaker - navy blazer, Tracksuit bottoms - dark red\\",\\"Windbreaker - navy blazer, Tracksuit bottoms - dark red\\",\\"1, 1\\",\\"ZO0622706227, ZO0525405254\\",\\"0, 0\\",\\"27.984, 20.984\\",\\"27.984, 20.984\\",\\"0, 0\\",\\"ZO0622706227, ZO0525405254\\",\\"48.969\\",\\"48.969\\",2,2,order,muniz +ZwMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Samir,Samir,\\"Samir Mckinney\\",\\"Samir Mckinney\\",MALE,34,Mckinney,Mckinney,\\"(empty)\\",Sunday,6,\\"samir@mckinney-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563931,\\"sold_product_563931_3103, sold_product_563931_11153\\",\\"sold_product_563931_3103, sold_product_563931_11153\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"10.703, 5.172\\",\\"20.984, 10.992\\",\\"3,103, 11,153\\",\\"Polo shirt - light grey multicolor, Cap - black/black\\",\\"Polo shirt - light grey multicolor, Cap - black/black\\",\\"1, 1\\",\\"ZO0444304443, ZO0596505965\\",\\"0, 0\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"0, 0\\",\\"ZO0444304443, ZO0596505965\\",\\"31.984\\",\\"31.984\\",2,2,order,samir +lgMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Clarice,Clarice,\\"Clarice Palmer\\",\\"Clarice Palmer\\",FEMALE,18,Palmer,Palmer,\\"(empty)\\",Sunday,6,\\"clarice@palmer-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564940,\\"sold_product_564940_13407, sold_product_564940_15116\\",\\"sold_product_564940_13407, sold_product_564940_15116\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"13.922, 11.328\\",\\"28.984, 20.984\\",\\"13,407, 15,116\\",\\"Trainers - offwhite, Wedges - Blue Violety\\",\\"Trainers - offwhite, Wedges - Blue Violety\\",\\"1, 1\\",\\"ZO0026800268, ZO0003600036\\",\\"0, 0\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"0, 0\\",\\"ZO0026800268, ZO0003600036\\",\\"49.969\\",\\"49.969\\",2,2,order,clarice +lwMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jason,Jason,\\"Jason Hampton\\",\\"Jason Hampton\\",MALE,16,Hampton,Hampton,\\"(empty)\\",Sunday,6,\\"jason@hampton-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564987,\\"sold_product_564987_24440, sold_product_564987_12655\\",\\"sold_product_564987_24440, sold_product_564987_12655\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"10.703, 13.242\\",\\"20.984, 24.984\\",\\"24,440, 12,655\\",\\"Chinos - dark blue, SET - Pyjamas - grey/blue\\",\\"Chinos - dark blue, SET - Pyjamas - grey/blue\\",\\"1, 1\\",\\"ZO0526805268, ZO0478104781\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0526805268, ZO0478104781\\",\\"45.969\\",\\"45.969\\",2,2,order,jason +mQMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Tariq,Tariq,\\"Tariq Lewis\\",\\"Tariq Lewis\\",MALE,25,Lewis,Lewis,\\"(empty)\\",Sunday,6,\\"tariq@lewis-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564080,\\"sold_product_564080_13013, sold_product_564080_16957\\",\\"sold_product_564080_13013, sold_product_564080_16957\\",\\"28.984, 10.992\\",\\"28.984, 10.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"14.211, 5.711\\",\\"28.984, 10.992\\",\\"13,013, 16,957\\",\\"Shirt - light blue, Cap - navy\\",\\"Shirt - light blue, Cap - navy\\",\\"1, 1\\",\\"ZO0415804158, ZO0460804608\\",\\"0, 0\\",\\"28.984, 10.992\\",\\"28.984, 10.992\\",\\"0, 0\\",\\"ZO0415804158, ZO0460804608\\",\\"39.969\\",\\"39.969\\",2,2,order,tariq +mgMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Hicham,Hicham,\\"Hicham Love\\",\\"Hicham Love\\",MALE,8,Love,Love,\\"(empty)\\",Sunday,6,\\"hicham@love-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Oceanavigations,Oceanavigations,\\"Jun 22, 2019 @ 00:00:00.000\\",564106,\\"sold_product_564106_14672, sold_product_564106_15019\\",\\"sold_product_564106_14672, sold_product_564106_15019\\",\\"28.984, 18.984\\",\\"28.984, 18.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"13.922, 8.547\\",\\"28.984, 18.984\\",\\"14,672, 15,019\\",\\"Jumper - dark blue, Wallet - black\\",\\"Jumper - dark blue, Wallet - black\\",\\"1, 1\\",\\"ZO0298002980, ZO0313103131\\",\\"0, 0\\",\\"28.984, 18.984\\",\\"28.984, 18.984\\",\\"0, 0\\",\\"ZO0298002980, ZO0313103131\\",\\"47.969\\",\\"47.969\\",2,2,order,hicham +mwMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Foster\\",\\"Gwen Foster\\",FEMALE,26,Foster,Foster,\\"(empty)\\",Sunday,6,\\"gwen@foster-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563947,\\"sold_product_563947_8960, sold_product_563947_19261\\",\\"sold_product_563947_8960, sold_product_563947_19261\\",\\"37, 13.992\\",\\"37, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"18.5, 7\\",\\"37, 13.992\\",\\"8,960, 19,261\\",\\"Shirt - soft pink nude, Vest - black\\",\\"Shirt - soft pink nude, Vest - black\\",\\"1, 1\\",\\"ZO0348103481, ZO0164501645\\",\\"0, 0\\",\\"37, 13.992\\",\\"37, 13.992\\",\\"0, 0\\",\\"ZO0348103481, ZO0164501645\\",\\"50.969\\",\\"50.969\\",2,2,order,gwen +FAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Lewis\\",\\"Elyssa Lewis\\",FEMALE,27,Lewis,Lewis,\\"(empty)\\",Sunday,6,\\"elyssa@lewis-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries active, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"Pyramidustries active, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"Jun 22, 2019 @ 00:00:00.000\\",725995,\\"sold_product_725995_10498, sold_product_725995_15404, sold_product_725995_16378, sold_product_725995_12398\\",\\"sold_product_725995_10498, sold_product_725995_15404, sold_product_725995_16378, sold_product_725995_12398\\",\\"20.984, 42, 34, 18.984\\",\\"20.984, 42, 34, 18.984\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries active, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"Pyramidustries active, Gnomehouse, Pyramidustries, Tigress Enterprises MAMA\\",\\"11.328, 21.406, 15.641, 9.68\\",\\"20.984, 42, 34, 18.984\\",\\"10,498, 15,404, 16,378, 12,398\\",\\"Tracksuit bottoms - grey multicolor, Shift dress - Lemon Chiffon, Blazer - black/grey, Vest - navy\\",\\"Tracksuit bottoms - grey multicolor, Shift dress - Lemon Chiffon, Blazer - black/grey, Vest - navy\\",\\"1, 1, 1, 1\\",\\"ZO0222102221, ZO0332103321, ZO0182701827, ZO0230502305\\",\\"0, 0, 0, 0\\",\\"20.984, 42, 34, 18.984\\",\\"20.984, 42, 34, 18.984\\",\\"0, 0, 0, 0\\",\\"ZO0222102221, ZO0332103321, ZO0182701827, ZO0230502305\\",\\"115.938\\",\\"115.938\\",4,4,order,elyssa +JwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,George,George,\\"George Butler\\",\\"George Butler\\",MALE,32,Butler,Butler,\\"(empty)\\",Sunday,6,\\"george@butler-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564756,\\"sold_product_564756_16646, sold_product_564756_21840\\",\\"sold_product_564756_16646, sold_product_564756_21840\\",\\"9.992, 155\\",\\"9.992, 155\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, (empty)\\",\\"Elitelligence, (empty)\\",\\"5.191, 83.688\\",\\"9.992, 155\\",\\"16,646, 21,840\\",\\"Long sleeved top - Medium Slate Blue, Lace-ups - brown\\",\\"Long sleeved top - Medium Slate Blue, Lace-ups - brown\\",\\"1, 1\\",\\"ZO0556805568, ZO0481504815\\",\\"0, 0\\",\\"9.992, 155\\",\\"9.992, 155\\",\\"0, 0\\",\\"ZO0556805568, ZO0481504815\\",165,165,2,2,order,george +ZwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Austin\\",\\"Yuri Austin\\",MALE,21,Austin,Austin,\\"(empty)\\",Sunday,6,\\"yuri@austin-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565137,\\"sold_product_565137_18257, sold_product_565137_24282\\",\\"sold_product_565137_18257, sold_product_565137_24282\\",\\"14.992, 7.988\\",\\"14.992, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"7.051, 4.148\\",\\"14.992, 7.988\\",\\"18,257, 24,282\\",\\"Print T-shirt - black, Print T-shirt - bordeaux\\",\\"Print T-shirt - black, Print T-shirt - bordeaux\\",\\"1, 1\\",\\"ZO0118501185, ZO0561905619\\",\\"0, 0\\",\\"14.992, 7.988\\",\\"14.992, 7.988\\",\\"0, 0\\",\\"ZO0118501185, ZO0561905619\\",\\"22.984\\",\\"22.984\\",2,2,order,yuri +aAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Evans\\",\\"Elyssa Evans\\",FEMALE,27,Evans,Evans,\\"(empty)\\",Sunday,6,\\"elyssa@evans-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565173,\\"sold_product_565173_20610, sold_product_565173_23026\\",\\"sold_product_565173_20610, sold_product_565173_23026\\",\\"12.992, 42\\",\\"12.992, 42\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"6.879, 20.156\\",\\"12.992, 42\\",\\"20,610, 23,026\\",\\"Clutch - rose, Platform boots - cognac\\",\\"Clutch - rose, Platform boots - cognac\\",\\"1, 1\\",\\"ZO0203802038, ZO0014900149\\",\\"0, 0\\",\\"12.992, 42\\",\\"12.992, 42\\",\\"0, 0\\",\\"ZO0203802038, ZO0014900149\\",\\"54.969\\",\\"54.969\\",2,2,order,elyssa +aQMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Valdez\\",\\"Abdulraheem Al Valdez\\",MALE,33,Valdez,Valdez,\\"(empty)\\",Sunday,6,\\"abdulraheem al@valdez-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565214,\\"sold_product_565214_24934, sold_product_565214_11845\\",\\"sold_product_565214_24934, sold_product_565214_11845\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"22.5, 9.492\\",\\"50, 18.984\\",\\"24,934, 11,845\\",\\"Lace-up boots - resin coffee, Hoodie - light red\\",\\"Lace-up boots - resin coffee, Hoodie - light red\\",\\"1, 1\\",\\"ZO0403504035, ZO0588705887\\",\\"0, 0\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"0, 0\\",\\"ZO0403504035, ZO0588705887\\",69,69,2,2,order,abdulraheem +mQMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Mary,Mary,\\"Mary Frank\\",\\"Mary Frank\\",FEMALE,20,Frank,Frank,\\"(empty)\\",Sunday,6,\\"mary@frank-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564804,\\"sold_product_564804_16840, sold_product_564804_21361\\",\\"sold_product_564804_16840, sold_product_564804_21361\\",\\"37, 10.992\\",\\"37, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"17.766, 5.172\\",\\"37, 10.992\\",\\"16,840, 21,361\\",\\"Pencil skirt - black, Long sleeved top - dark brown\\",\\"Pencil skirt - black, Long sleeved top - dark brown\\",\\"1, 1\\",\\"ZO0259702597, ZO0640606406\\",\\"0, 0\\",\\"37, 10.992\\",\\"37, 10.992\\",\\"0, 0\\",\\"ZO0259702597, ZO0640606406\\",\\"47.969\\",\\"47.969\\",2,2,order,mary +pAMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Hubbard\\",\\"Yasmine Hubbard\\",FEMALE,43,Hubbard,Hubbard,\\"(empty)\\",Sunday,6,\\"yasmine@hubbard-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Angeldale, Spherecords Curvy\\",\\"Angeldale, Spherecords Curvy\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565052,\\"sold_product_565052_20949, sold_product_565052_16543\\",\\"sold_product_565052_20949, sold_product_565052_16543\\",\\"60, 20.984\\",\\"60, 20.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Spherecords Curvy\\",\\"Angeldale, Spherecords Curvy\\",\\"30.594, 9.453\\",\\"60, 20.984\\",\\"20,949, 16,543\\",\\"Tote bag - cognac, Blouse - black\\",\\"Tote bag - cognac, Blouse - black\\",\\"1, 1\\",\\"ZO0697006970, ZO0711407114\\",\\"0, 0\\",\\"60, 20.984\\",\\"60, 20.984\\",\\"0, 0\\",\\"ZO0697006970, ZO0711407114\\",81,81,2,2,order,yasmine +pQMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Pia,Pia,\\"Pia Reyes\\",\\"Pia Reyes\\",FEMALE,45,Reyes,Reyes,\\"(empty)\\",Sunday,6,\\"pia@reyes-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565091,\\"sold_product_565091_5862, sold_product_565091_12548\\",\\"sold_product_565091_5862, sold_product_565091_12548\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"31.203, 11.5\\",\\"65, 24.984\\",\\"5,862, 12,548\\",\\"Boots - taupe, Handbag - creme/grey\\",\\"Boots - taupe, Handbag - creme/grey\\",\\"1, 1\\",\\"ZO0324703247, ZO0088600886\\",\\"0, 0\\",\\"65, 24.984\\",\\"65, 24.984\\",\\"0, 0\\",\\"ZO0324703247, ZO0088600886\\",90,90,2,2,order,pia +rgMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Stokes\\",\\"Wilhemina St. Stokes\\",FEMALE,17,Stokes,Stokes,\\"(empty)\\",Sunday,6,\\"wilhemina st.@stokes-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Gnomehouse mom, Pyramidustries\\",\\"Gnomehouse mom, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565231,\\"sold_product_565231_17601, sold_product_565231_11904\\",\\"sold_product_565231_17601, sold_product_565231_11904\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse mom, Pyramidustries\\",\\"Gnomehouse mom, Pyramidustries\\",\\"20.156, 15.07\\",\\"42, 28.984\\",\\"17,601, 11,904\\",\\"Cape - Pale Violet Red, Trainers - rose\\",\\"Cape - Pale Violet Red, Trainers - rose\\",\\"1, 1\\",\\"ZO0235202352, ZO0135001350\\",\\"0, 0\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"0, 0\\",\\"ZO0235202352, ZO0135001350\\",71,71,2,2,order,wilhemina +9wMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Stephanie,Stephanie,\\"Stephanie Hodges\\",\\"Stephanie Hodges\\",FEMALE,6,Hodges,Hodges,\\"(empty)\\",Sunday,6,\\"stephanie@hodges-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564190,\\"sold_product_564190_5329, sold_product_564190_16930\\",\\"sold_product_564190_5329, sold_product_564190_16930\\",\\"115, 24.984\\",\\"115, 24.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"62.094, 13.242\\",\\"115, 24.984\\",\\"5,329, 16,930\\",\\"Over-the-knee boots - Midnight Blue, Across body bag - Blue Violety \\",\\"Over-the-knee boots - Midnight Blue, Across body bag - Blue Violety \\",\\"1, 1\\",\\"ZO0243902439, ZO0208702087\\",\\"0, 0\\",\\"115, 24.984\\",\\"115, 24.984\\",\\"0, 0\\",\\"ZO0243902439, ZO0208702087\\",140,140,2,2,order,stephanie +EgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Kim\\",\\"Selena Kim\\",FEMALE,42,Kim,Kim,\\"(empty)\\",Sunday,6,\\"selena@kim-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Pyramidustries,Pyramidustries,\\"Jun 22, 2019 @ 00:00:00.000\\",564876,\\"sold_product_564876_12273, sold_product_564876_21758\\",\\"sold_product_564876_12273, sold_product_564876_21758\\",\\"12.992, 11.992\\",\\"12.992, 11.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"6.371, 6.23\\",\\"12.992, 11.992\\",\\"12,273, 21,758\\",\\"2 PACK - Over-the-knee socks - black, Print T-shirt - black\\",\\"2 PACK - Over-the-knee socks - black, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0215502155, ZO0168101681\\",\\"0, 0\\",\\"12.992, 11.992\\",\\"12.992, 11.992\\",\\"0, 0\\",\\"ZO0215502155, ZO0168101681\\",\\"24.984\\",\\"24.984\\",2,2,order,selena +EwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Garza\\",\\"Elyssa Garza\\",FEMALE,27,Garza,Garza,\\"(empty)\\",Sunday,6,\\"elyssa@garza-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Angeldale, Karmanite\\",\\"Angeldale, Karmanite\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564902,\\"sold_product_564902_13639, sold_product_564902_22060\\",\\"sold_product_564902_13639, sold_product_564902_22060\\",\\"60, 100\\",\\"60, 100\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Karmanite\\",\\"Angeldale, Karmanite\\",\\"28.203, 51\\",\\"60, 100\\",\\"13,639, 22,060\\",\\"Handbag - taupe, Boots - grey\\",\\"Handbag - taupe, Boots - grey\\",\\"1, 1\\",\\"ZO0698406984, ZO0704207042\\",\\"0, 0\\",\\"60, 100\\",\\"60, 100\\",\\"0, 0\\",\\"ZO0698406984, ZO0704207042\\",160,160,2,2,order,elyssa +JwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Garza\\",\\"Elyssa Garza\\",FEMALE,27,Garza,Garza,\\"(empty)\\",Sunday,6,\\"elyssa@garza-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Angeldale, Spherecords Curvy\\",\\"Angeldale, Spherecords Curvy\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564761,\\"sold_product_564761_12146, sold_product_564761_24585\\",\\"sold_product_564761_12146, sold_product_564761_24585\\",\\"65, 16.984\\",\\"65, 16.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Spherecords Curvy\\",\\"Angeldale, Spherecords Curvy\\",\\"29.25, 9\\",\\"65, 16.984\\",\\"12,146, 24,585\\",\\"Slip-ons - red, Jersey dress - black\\",\\"Slip-ons - red, Jersey dress - black\\",\\"1, 1\\",\\"ZO0665006650, ZO0709407094\\",\\"0, 0\\",\\"65, 16.984\\",\\"65, 16.984\\",\\"0, 0\\",\\"ZO0665006650, ZO0709407094\\",82,82,2,2,order,elyssa +MQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Underwood\\",\\"Elyssa Underwood\\",FEMALE,27,Underwood,Underwood,\\"(empty)\\",Sunday,6,\\"elyssa@underwood-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Champion Arts, Pyramidustries, Angeldale, Gnomehouse\\",\\"Champion Arts, Pyramidustries, Angeldale, Gnomehouse\\",\\"Jun 22, 2019 @ 00:00:00.000\\",731788,\\"sold_product_731788_22537, sold_product_731788_11189, sold_product_731788_14323, sold_product_731788_15479\\",\\"sold_product_731788_22537, sold_product_731788_11189, sold_product_731788_14323, sold_product_731788_15479\\",\\"20.984, 16.984, 85, 50\\",\\"20.984, 16.984, 85, 50\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Champion Arts, Pyramidustries, Angeldale, Gnomehouse\\",\\"Champion Arts, Pyramidustries, Angeldale, Gnomehouse\\",\\"10.289, 8.656, 39.938, 22.5\\",\\"20.984, 16.984, 85, 50\\",\\"22,537, 11,189, 14,323, 15,479\\",\\"Tracksuit bottoms - dark grey multicolor, Cardigan - black, Ankle boots - black, Summer dress - dusty rose\\",\\"Tracksuit bottoms - dark grey multicolor, Cardigan - black, Ankle boots - black, Summer dress - dusty rose\\",\\"1, 1, 1, 1\\",\\"ZO0486004860, ZO0177901779, ZO0680506805, ZO0340503405\\",\\"0, 0, 0, 0\\",\\"20.984, 16.984, 85, 50\\",\\"20.984, 16.984, 85, 50\\",\\"0, 0, 0, 0\\",\\"ZO0486004860, ZO0177901779, ZO0680506805, ZO0340503405\\",173,173,4,4,order,elyssa +TQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Recip,Recip,\\"Recip Morrison\\",\\"Recip Morrison\\",MALE,10,Morrison,Morrison,\\"(empty)\\",Sunday,6,\\"recip@morrison-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564340,\\"sold_product_564340_12840, sold_product_564340_24691\\",\\"sold_product_564340_12840, sold_product_564340_24691\\",\\"65, 16.984\\",\\"65, 16.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"30.547, 8.156\\",\\"65, 16.984\\",\\"12,840, 24,691\\",\\"Lace-up boots - black, Long sleeved top - olive\\",\\"Lace-up boots - black, Long sleeved top - olive\\",\\"1, 1\\",\\"ZO0399703997, ZO0565805658\\",\\"0, 0\\",\\"65, 16.984\\",\\"65, 16.984\\",\\"0, 0\\",\\"ZO0399703997, ZO0565805658\\",82,82,2,2,order,recip +TgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,rania,rania,\\"rania Wise\\",\\"rania Wise\\",FEMALE,24,Wise,Wise,\\"(empty)\\",Sunday,6,\\"rania@wise-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564395,\\"sold_product_564395_16857, sold_product_564395_21378\\",\\"sold_product_564395_16857, sold_product_564395_21378\\",\\"50, 11.992\\",\\"50, 11.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"24, 6.109\\",\\"50, 11.992\\",\\"16,857, 21,378\\",\\"Ballet pumps - night, Pyjama bottoms - pink\\",\\"Ballet pumps - night, Pyjama bottoms - pink\\",\\"1, 1\\",\\"ZO0236702367, ZO0660706607\\",\\"0, 0\\",\\"50, 11.992\\",\\"50, 11.992\\",\\"0, 0\\",\\"ZO0236702367, ZO0660706607\\",\\"61.969\\",\\"61.969\\",2,2,order,rani +awMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Pia,Pia,\\"Pia Chapman\\",\\"Pia Chapman\\",FEMALE,45,Chapman,Chapman,\\"(empty)\\",Sunday,6,\\"pia@chapman-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564686,\\"sold_product_564686_4640, sold_product_564686_12658\\",\\"sold_product_564686_4640, sold_product_564686_12658\\",\\"75, 16.984\\",\\"75, 16.984\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"36, 8.492\\",\\"75, 16.984\\",\\"4,640, 12,658\\",\\"Winter boots - black, Ballet pumps - nude\\",\\"Winter boots - black, Ballet pumps - nude\\",\\"1, 1\\",\\"ZO0373303733, ZO0131201312\\",\\"0, 0\\",\\"75, 16.984\\",\\"75, 16.984\\",\\"0, 0\\",\\"ZO0373303733, ZO0131201312\\",92,92,2,2,order,pia +dAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Betty,Betty,\\"Betty Cross\\",\\"Betty Cross\\",FEMALE,44,Cross,Cross,\\"(empty)\\",Sunday,6,\\"betty@cross-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564446,\\"sold_product_564446_12508, sold_product_564446_25164\\",\\"sold_product_564446_12508, sold_product_564446_25164\\",\\"28.984, 65\\",\\"28.984, 65\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Angeldale\\",\\"Tigress Enterprises, Angeldale\\",\\"14.492, 30.547\\",\\"28.984, 65\\",\\"12,508, 25,164\\",\\"Tote bag - black, Trainers - grey\\",\\"Tote bag - black, Trainers - grey\\",\\"1, 1\\",\\"ZO0093400934, ZO0679406794\\",\\"0, 0\\",\\"28.984, 65\\",\\"28.984, 65\\",\\"0, 0\\",\\"ZO0093400934, ZO0679406794\\",94,94,2,2,order,betty +dQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Yasmine,Yasmine,\\"Yasmine Mcdonald\\",\\"Yasmine Mcdonald\\",FEMALE,43,Mcdonald,Mcdonald,\\"(empty)\\",Sunday,6,\\"yasmine@mcdonald-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564481,\\"sold_product_564481_17689, sold_product_564481_11690\\",\\"sold_product_564481_17689, sold_product_564481_11690\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"25.984, 5.5\\",\\"50, 10.992\\",\\"17,689, 11,690\\",\\"Classic heels - navy/white, Necklace - imitation rhodium\\",\\"Classic heels - navy/white, Necklace - imitation rhodium\\",\\"1, 1\\",\\"ZO0321603216, ZO0078000780\\",\\"0, 0\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"0, 0\\",\\"ZO0321603216, ZO0078000780\\",\\"60.969\\",\\"60.969\\",2,2,order,yasmine +fAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Mary,Mary,\\"Mary Griffin\\",\\"Mary Griffin\\",FEMALE,20,Griffin,Griffin,\\"(empty)\\",Sunday,6,\\"mary@griffin-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563953,\\"sold_product_563953_22678, sold_product_563953_17921\\",\\"sold_product_563953_22678, sold_product_563953_17921\\",\\"60, 20.984\\",\\"60, 20.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"31.188, 9.867\\",\\"60, 20.984\\",\\"22,678, 17,921\\",\\"Ankle boots - Midnight Blue, Amber - Wallet - black\\",\\"Ankle boots - Midnight Blue, Amber - Wallet - black\\",\\"1, 1\\",\\"ZO0376203762, ZO0303603036\\",\\"0, 0\\",\\"60, 20.984\\",\\"60, 20.984\\",\\"0, 0\\",\\"ZO0376203762, ZO0303603036\\",81,81,2,2,order,mary +9gMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Frances,Frances,\\"Frances Gibbs\\",\\"Frances Gibbs\\",FEMALE,49,Gibbs,Gibbs,\\"(empty)\\",Sunday,6,\\"frances@gibbs-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565061,\\"sold_product_565061_1774, sold_product_565061_20952\\",\\"sold_product_565061_1774, sold_product_565061_20952\\",\\"60, 33\\",\\"60, 33\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"27.594, 16.172\\",\\"60, 33\\",\\"1,774, 20,952\\",\\"Lace-ups - cognac, Light jacket - navy\\",\\"Lace-ups - cognac, Light jacket - navy\\",\\"1, 1\\",\\"ZO0681106811, ZO0286402864\\",\\"0, 0\\",\\"60, 33\\",\\"60, 33\\",\\"0, 0\\",\\"ZO0681106811, ZO0286402864\\",93,93,2,2,order,frances +9wMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Jenkins\\",\\"Elyssa Jenkins\\",FEMALE,27,Jenkins,Jenkins,\\"(empty)\\",Sunday,6,\\"elyssa@jenkins-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565100,\\"sold_product_565100_13722, sold_product_565100_21376\\",\\"sold_product_565100_13722, sold_product_565100_21376\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"15.844, 8.828\\",\\"33, 16.984\\",\\"13,722, 21,376\\",\\"Cardigan - grey multicolor, Jersey dress - mid grey multicolor\\",\\"Cardigan - grey multicolor, Jersey dress - mid grey multicolor\\",\\"1, 1\\",\\"ZO0069000690, ZO0490004900\\",\\"0, 0\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"0, 0\\",\\"ZO0069000690, ZO0490004900\\",\\"49.969\\",\\"49.969\\",2,2,order,elyssa +3AMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Oliver,Oliver,\\"Oliver Sharp\\",\\"Oliver Sharp\\",MALE,7,Sharp,Sharp,\\"(empty)\\",Sunday,6,\\"oliver@sharp-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565263,\\"sold_product_565263_15239, sold_product_565263_14475\\",\\"sold_product_565263_15239, sold_product_565263_14475\\",\\"22.984, 25.984\\",\\"22.984, 25.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"11.039, 12.219\\",\\"22.984, 25.984\\",\\"15,239, 14,475\\",\\"Hoodie - light grey/navy, Tracksuit bottoms - black\\",\\"Hoodie - light grey/navy, Tracksuit bottoms - black\\",\\"1, 1\\",\\"ZO0582705827, ZO0111801118\\",\\"0, 0\\",\\"22.984, 25.984\\",\\"22.984, 25.984\\",\\"0, 0\\",\\"ZO0582705827, ZO0111801118\\",\\"48.969\\",\\"48.969\\",2,2,order,oliver +dgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Garner\\",\\"Abdulraheem Al Garner\\",MALE,33,Garner,Garner,\\"(empty)\\",Sunday,6,\\"abdulraheem al@garner-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",563984,\\"sold_product_563984_22409, sold_product_563984_20424\\",\\"sold_product_563984_22409, sold_product_563984_20424\\",\\"11.992, 13.992\\",\\"11.992, 13.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"5.762, 7.129\\",\\"11.992, 13.992\\",\\"22,409, 20,424\\",\\"Basic T-shirt - Dark Salmon, Basic T-shirt - navy\\",\\"Basic T-shirt - Dark Salmon, Basic T-shirt - navy\\",\\"1, 1\\",\\"ZO0121301213, ZO0294102941\\",\\"0, 0\\",\\"11.992, 13.992\\",\\"11.992, 13.992\\",\\"0, 0\\",\\"ZO0121301213, ZO0294102941\\",\\"25.984\\",\\"25.984\\",2,2,order,abdulraheem +rgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Brigitte,Brigitte,\\"Brigitte Ramsey\\",\\"Brigitte Ramsey\\",FEMALE,12,Ramsey,Ramsey,\\"(empty)\\",Sunday,6,\\"brigitte@ramsey-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565262,\\"sold_product_565262_18767, sold_product_565262_11190\\",\\"sold_product_565262_18767, sold_product_565262_11190\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"10.906, 11.5\\",\\"20.984, 24.984\\",\\"18,767, 11,190\\",\\"Amber - Wallet - cognac, Rucksack - black\\",\\"Amber - Wallet - cognac, Rucksack - black\\",\\"1, 1\\",\\"ZO0303503035, ZO0197601976\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0303503035, ZO0197601976\\",\\"45.969\\",\\"45.969\\",2,2,order,brigitte +rwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Smith\\",\\"Sonya Smith\\",FEMALE,28,Smith,Smith,\\"(empty)\\",Sunday,6,\\"sonya@smith-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565304,\\"sold_product_565304_22359, sold_product_565304_19969\\",\\"sold_product_565304_22359, sold_product_565304_19969\\",\\"24.984, 37\\",\\"24.984, 37\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"12.492, 17.391\\",\\"24.984, 37\\",\\"22,359, 19,969\\",\\"Boots - dark grey, Maxi dress - black/rose gold\\",\\"Boots - dark grey, Maxi dress - black/rose gold\\",\\"1, 1\\",\\"ZO0017800178, ZO0229602296\\",\\"0, 0\\",\\"24.984, 37\\",\\"24.984, 37\\",\\"0, 0\\",\\"ZO0017800178, ZO0229602296\\",\\"61.969\\",\\"61.969\\",2,2,order,sonya +vgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Recip,Recip,\\"Recip Ryan\\",\\"Recip Ryan\\",MALE,10,Ryan,Ryan,\\"(empty)\\",Sunday,6,\\"recip@ryan-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565123,\\"sold_product_565123_14743, sold_product_565123_22906\\",\\"sold_product_565123_14743, sold_product_565123_22906\\",\\"33, 75\\",\\"33, 75\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"17.156, 35.25\\",\\"33, 75\\",\\"14,743, 22,906\\",\\"Laptop bag - black, Lace-up boots - black\\",\\"Laptop bag - black, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0316903169, ZO0400504005\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0316903169, ZO0400504005\\",108,108,2,2,order,recip +vwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Robbie,Robbie,\\"Robbie Hansen\\",\\"Robbie Hansen\\",MALE,48,Hansen,Hansen,\\"(empty)\\",Sunday,6,\\"robbie@hansen-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565160,\\"sold_product_565160_19961, sold_product_565160_19172\\",\\"sold_product_565160_19961, sold_product_565160_19172\\",\\"75, 20.984\\",\\"75, 20.984\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"36, 10.078\\",\\"75, 20.984\\",\\"19,961, 19,172\\",\\"Lace-up boots - Burly Wood , Trainers - black/white\\",\\"Lace-up boots - Burly Wood , Trainers - black/white\\",\\"1, 1\\",\\"ZO0693306933, ZO0514605146\\",\\"0, 0\\",\\"75, 20.984\\",\\"75, 20.984\\",\\"0, 0\\",\\"ZO0693306933, ZO0514605146\\",96,96,2,2,order,robbie +wgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Irwin,Irwin,\\"Irwin Bryant\\",\\"Irwin Bryant\\",MALE,14,Bryant,Bryant,\\"(empty)\\",Sunday,6,\\"irwin@bryant-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",565224,\\"sold_product_565224_2269, sold_product_565224_23958\\",\\"sold_product_565224_2269, sold_product_565224_23958\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"23, 13.242\\",\\"50, 24.984\\",\\"2,269, 23,958\\",\\"Boots - Slate Gray, Jumper - black\\",\\"Boots - Slate Gray, Jumper - black\\",\\"1, 1\\",\\"ZO0406604066, ZO0576805768\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0406604066, ZO0576805768\\",75,75,2,2,order,irwin +2wMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Rivera\\",\\"Mostafa Rivera\\",MALE,9,Rivera,Rivera,\\"(empty)\\",Sunday,6,\\"mostafa@rivera-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Spritechnologies\\",\\"Oceanavigations, Spritechnologies\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564121,\\"sold_product_564121_24202, sold_product_564121_21006\\",\\"sold_product_564121_24202, sold_product_564121_21006\\",\\"7.988, 10.992\\",\\"7.988, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spritechnologies\\",\\"Oceanavigations, Spritechnologies\\",\\"3.92, 5.5\\",\\"7.988, 10.992\\",\\"24,202, 21,006\\",\\"Basic T-shirt - white, Sports shirt - bright white\\",\\"Basic T-shirt - white, Sports shirt - bright white\\",\\"1, 1\\",\\"ZO0291902919, ZO0617206172\\",\\"0, 0\\",\\"7.988, 10.992\\",\\"7.988, 10.992\\",\\"0, 0\\",\\"ZO0291902919, ZO0617206172\\",\\"18.984\\",\\"18.984\\",2,2,order,mostafa +3AMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Accessories\\",\\"Men's Accessories\\",EUR,Yahya,Yahya,\\"Yahya Tyler\\",\\"Yahya Tyler\\",MALE,23,Tyler,Tyler,\\"(empty)\\",Sunday,6,\\"yahya@tyler-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564166,\\"sold_product_564166_14500, sold_product_564166_17015\\",\\"sold_product_564166_14500, sold_product_564166_17015\\",\\"28.984, 85\\",\\"28.984, 85\\",\\"Men's Accessories, Men's Accessories\\",\\"Men's Accessories, Men's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"15.07, 41.656\\",\\"28.984, 85\\",\\"14,500, 17,015\\",\\"Laptop bag - black, Briefcase - brown\\",\\"Laptop bag - black, Briefcase - brown\\",\\"1, 1\\",\\"ZO0607106071, ZO0470704707\\",\\"0, 0\\",\\"28.984, 85\\",\\"28.984, 85\\",\\"0, 0\\",\\"ZO0607106071, ZO0470704707\\",114,114,2,2,order,yahya +3wMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Rivera\\",\\"Wilhemina St. Rivera\\",FEMALE,17,Rivera,Rivera,\\"(empty)\\",Sunday,6,\\"wilhemina st.@rivera-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Gnomehouse, Oceanavigations\\",\\"Gnomehouse, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564739,\\"sold_product_564739_21607, sold_product_564739_14854\\",\\"sold_product_564739_21607, sold_product_564739_14854\\",\\"55, 50\\",\\"55, 50\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Oceanavigations\\",\\"Gnomehouse, Oceanavigations\\",\\"25.844, 23.5\\",\\"55, 50\\",\\"21,607, 14,854\\",\\"Jersey dress - inca gold, Ballet pumps - argento\\",\\"Jersey dress - inca gold, Ballet pumps - argento\\",\\"1, 1\\",\\"ZO0335603356, ZO0236502365\\",\\"0, 0\\",\\"55, 50\\",\\"55, 50\\",\\"0, 0\\",\\"ZO0335603356, ZO0236502365\\",105,105,2,2,order,wilhemina +OQMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jason,Jason,\\"Jason Wood\\",\\"Jason Wood\\",MALE,16,Wood,Wood,\\"(empty)\\",Sunday,6,\\"jason@wood-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564016,\\"sold_product_564016_21164, sold_product_564016_3074\\",\\"sold_product_564016_21164, sold_product_564016_3074\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"5.93, 27.594\\",\\"10.992, 60\\",\\"21,164, 3,074\\",\\"Long sleeved top - dark blue, Trenchcoat - navy\\",\\"Long sleeved top - dark blue, Trenchcoat - navy\\",\\"1, 1\\",\\"ZO0436904369, ZO0290402904\\",\\"0, 0\\",\\"10.992, 60\\",\\"10.992, 60\\",\\"0, 0\\",\\"ZO0436904369, ZO0290402904\\",71,71,2,2,order,jason +OgMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jim,Jim,\\"Jim Duncan\\",\\"Jim Duncan\\",MALE,41,Duncan,Duncan,\\"(empty)\\",Sunday,6,\\"jim@duncan-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564576,\\"sold_product_564576_1384, sold_product_564576_12074\\",\\"sold_product_564576_1384, sold_product_564576_12074\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"31.188, 5.641\\",\\"60, 11.992\\",\\"1,384, 12,074\\",\\"Lace-ups - black , Polo shirt - blue\\",\\"Lace-ups - black , Polo shirt - blue\\",\\"1, 1\\",\\"ZO0681206812, ZO0441904419\\",\\"0, 0\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"0, 0\\",\\"ZO0681206812, ZO0441904419\\",72,72,2,2,order,jim +OwMtOW0BH63Xcmy453L9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Yasmine,Yasmine,\\"Yasmine Fletcher\\",\\"Yasmine Fletcher\\",FEMALE,43,Fletcher,Fletcher,\\"(empty)\\",Sunday,6,\\"yasmine@fletcher-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Gnomehouse, Angeldale\\",\\"Gnomehouse, Angeldale\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564605,\\"sold_product_564605_17630, sold_product_564605_14381\\",\\"sold_product_564605_17630, sold_product_564605_14381\\",\\"60, 75\\",\\"60, 75\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Angeldale\\",\\"Gnomehouse, Angeldale\\",\\"31.188, 34.5\\",\\"60, 75\\",\\"17,630, 14,381\\",\\"Summer dress - navy blazer, Tote bag - cognac\\",\\"Summer dress - navy blazer, Tote bag - cognac\\",\\"1, 1\\",\\"ZO0333103331, ZO0694806948\\",\\"0, 0\\",\\"60, 75\\",\\"60, 75\\",\\"0, 0\\",\\"ZO0333103331, ZO0694806948\\",135,135,2,2,order,yasmine +5QMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Mullins\\",\\"Wilhemina St. Mullins\\",FEMALE,17,Mullins,Mullins,\\"(empty)\\",Sunday,6,\\"wilhemina st.@mullins-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Angeldale, Low Tide Media, Tigress Enterprises\\",\\"Angeldale, Low Tide Media, Tigress Enterprises\\",\\"Jun 22, 2019 @ 00:00:00.000\\",730663,\\"sold_product_730663_12404, sold_product_730663_15087, sold_product_730663_13055, sold_product_730663_5529\\",\\"sold_product_730663_12404, sold_product_730663_15087, sold_product_730663_13055, sold_product_730663_5529\\",\\"33, 42, 60, 33\\",\\"33, 42, 60, 33\\",\\"Women's Accessories, Women's Shoes, Women's Shoes, Women's Shoes\\",\\"Women's Accessories, Women's Shoes, Women's Shoes, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Low Tide Media, Low Tide Media, Tigress Enterprises\\",\\"Angeldale, Low Tide Media, Low Tide Media, Tigress Enterprises\\",\\"17.156, 21.406, 27.594, 17.813\\",\\"33, 42, 60, 33\\",\\"12,404, 15,087, 13,055, 5,529\\",\\"Clutch - black, Sandals - cognac, Lace-ups - perla, Lace-up boots - cognac\\",\\"Clutch - black, Sandals - cognac, Lace-ups - perla, Lace-up boots - cognac\\",\\"1, 1, 1, 1\\",\\"ZO0697406974, ZO0370303703, ZO0368103681, ZO0013800138\\",\\"0, 0, 0, 0\\",\\"33, 42, 60, 33\\",\\"33, 42, 60, 33\\",\\"0, 0, 0, 0\\",\\"ZO0697406974, ZO0370303703, ZO0368103681, ZO0013800138\\",168,168,4,4,order,wilhemina +BAMtOW0BH63Xcmy46HPV,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Samir,Samir,\\"Samir Chapman\\",\\"Samir Chapman\\",MALE,34,Chapman,Chapman,\\"(empty)\\",Sunday,6,\\"samir@chapman-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564366,\\"sold_product_564366_810, sold_product_564366_11140\\",\\"sold_product_564366_810, sold_product_564366_11140\\",\\"80, 10.992\\",\\"80, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"38.406, 5.5\\",\\"80, 10.992\\",\\"810, 11,140\\",\\"Smart lace-ups - dark brown, Print T-shirt - dark blue\\",\\"Smart lace-ups - dark brown, Print T-shirt - dark blue\\",\\"1, 1\\",\\"ZO0681906819, ZO0549705497\\",\\"0, 0\\",\\"80, 10.992\\",\\"80, 10.992\\",\\"0, 0\\",\\"ZO0681906819, ZO0549705497\\",91,91,2,2,order,samir +BQMtOW0BH63Xcmy46HPV,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Betty,Betty,\\"Betty Swanson\\",\\"Betty Swanson\\",FEMALE,44,Swanson,Swanson,\\"(empty)\\",Sunday,6,\\"betty@swanson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Oceanavigations, Champion Arts\\",\\"Oceanavigations, Champion Arts\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564221,\\"sold_product_564221_5979, sold_product_564221_19823\\",\\"sold_product_564221_5979, sold_product_564221_19823\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Champion Arts\\",\\"Oceanavigations, Champion Arts\\",\\"33.75, 12.25\\",\\"75, 24.984\\",\\"5,979, 19,823\\",\\"Ankle boots - Antique White, Slim fit jeans - dark grey\\",\\"Ankle boots - Antique White, Slim fit jeans - dark grey\\",\\"1, 1\\",\\"ZO0249702497, ZO0487404874\\",\\"0, 0\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"0, 0\\",\\"ZO0249702497, ZO0487404874\\",100,100,2,2,order,betty +CgMtOW0BH63Xcmy46HPV,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Selena,Selena,\\"Selena Rose\\",\\"Selena Rose\\",FEMALE,42,Rose,Rose,\\"(empty)\\",Sunday,6,\\"selena@rose-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 22, 2019 @ 00:00:00.000\\",564174,\\"sold_product_564174_12644, sold_product_564174_20872\\",\\"sold_product_564174_12644, sold_product_564174_20872\\",\\"33, 50\\",\\"33, 50\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 11, 2016 @ 00:00:00.000, Dec 11, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"16.172, 25.484\\",\\"33, 50\\",\\"12,644, 20,872\\",\\"Jumpsuit - black, Ballet pumps - grey\\",\\"Jumpsuit - black, Ballet pumps - grey\\",\\"1, 1\\",\\"ZO0032300323, ZO0236302363\\",\\"0, 0\\",\\"33, 50\\",\\"33, 50\\",\\"0, 0\\",\\"ZO0032300323, ZO0236302363\\",83,83,2,2,order,selena +DgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane Powell\\",\\"Diane Powell\\",FEMALE,22,Powell,Powell,\\"(empty)\\",Saturday,5,\\"diane@powell-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Pyramidustries active\\",\\"Pyramidustries active\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562835,\\"sold_product_562835_23805, sold_product_562835_22240\\",\\"sold_product_562835_23805, sold_product_562835_22240\\",\\"20.984, 14.992\\",\\"20.984, 14.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Pyramidustries active\\",\\"Pyramidustries active, Pyramidustries active\\",\\"9.453, 7.051\\",\\"20.984, 14.992\\",\\"23,805, 22,240\\",\\"Tights - black , Tights - mid grey multicolor\\",\\"Tights - black , Tights - mid grey multicolor\\",\\"1, 1\\",\\"ZO0222302223, ZO0223502235\\",\\"0, 0\\",\\"20.984, 14.992\\",\\"20.984, 14.992\\",\\"0, 0\\",\\"ZO0222302223, ZO0223502235\\",\\"35.969\\",\\"35.969\\",2,2,order,diane +DwMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Dixon\\",\\"Tariq Dixon\\",MALE,25,Dixon,Dixon,\\"(empty)\\",Saturday,5,\\"tariq@dixon-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562882,\\"sold_product_562882_16957, sold_product_562882_6401\\",\\"sold_product_562882_16957, sold_product_562882_6401\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"5.711, 10.078\\",\\"10.992, 20.984\\",\\"16,957, 6,401\\",\\"Cap - navy, Shirt - Blue Violety\\",\\"Cap - navy, Shirt - Blue Violety\\",\\"1, 1\\",\\"ZO0460804608, ZO0523905239\\",\\"0, 0\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"0, 0\\",\\"ZO0460804608, ZO0523905239\\",\\"31.984\\",\\"31.984\\",2,2,order,tariq +EAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Sonya,Sonya,\\"Sonya Daniels\\",\\"Sonya Daniels\\",FEMALE,28,Daniels,Daniels,\\"(empty)\\",Saturday,5,\\"sonya@daniels-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562629,\\"sold_product_562629_21956, sold_product_562629_24341\\",\\"sold_product_562629_21956, sold_product_562629_24341\\",\\"10.992, 13.992\\",\\"10.992, 13.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"5.82, 6.859\\",\\"10.992, 13.992\\",\\"21,956, 24,341\\",\\"Long sleeved top - royal blue, Scarf - rose\\",\\"Long sleeved top - royal blue, Scarf - rose\\",\\"1, 1\\",\\"ZO0639506395, ZO0083000830\\",\\"0, 0\\",\\"10.992, 13.992\\",\\"10.992, 13.992\\",\\"0, 0\\",\\"ZO0639506395, ZO0083000830\\",\\"24.984\\",\\"24.984\\",2,2,order,sonya +EQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jim,Jim,\\"Jim Maldonado\\",\\"Jim Maldonado\\",MALE,41,Maldonado,Maldonado,\\"(empty)\\",Saturday,5,\\"jim@maldonado-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562672,\\"sold_product_562672_14354, sold_product_562672_18181\\",\\"sold_product_562672_14354, sold_product_562672_18181\\",\\"7.988, 10.992\\",\\"7.988, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"3.68, 5.711\\",\\"7.988, 10.992\\",\\"14,354, 18,181\\",\\"(3) Pack - Socks - white/black , Long sleeved top - bordeaux\\",\\"(3) Pack - Socks - white/black , Long sleeved top - bordeaux\\",\\"1, 1\\",\\"ZO0613406134, ZO0436304363\\",\\"0, 0\\",\\"7.988, 10.992\\",\\"7.988, 10.992\\",\\"0, 0\\",\\"ZO0613406134, ZO0436304363\\",\\"18.984\\",\\"18.984\\",2,2,order,jim +YwMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Munoz\\",\\"rania Munoz\\",FEMALE,24,Munoz,Munoz,\\"(empty)\\",Saturday,5,\\"rania@munoz-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563193,\\"sold_product_563193_13167, sold_product_563193_12035\\",\\"sold_product_563193_13167, sold_product_563193_12035\\",\\"7.988, 14.992\\",\\"7.988, 14.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"3.68, 7.051\\",\\"7.988, 14.992\\",\\"13,167, 12,035\\",\\"Vest - dark grey, Jersey dress - black\\",\\"Vest - dark grey, Jersey dress - black\\",\\"1, 1\\",\\"ZO0636906369, ZO0150301503\\",\\"0, 0\\",\\"7.988, 14.992\\",\\"7.988, 14.992\\",\\"0, 0\\",\\"ZO0636906369, ZO0150301503\\",\\"22.984\\",\\"22.984\\",2,2,order,rani +ZAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Swanson\\",\\"Fitzgerald Swanson\\",MALE,11,Swanson,Swanson,\\"(empty)\\",Saturday,5,\\"fitzgerald@swanson-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563440,\\"sold_product_563440_17325, sold_product_563440_1907\\",\\"sold_product_563440_17325, sold_product_563440_1907\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"9.867, 33.75\\",\\"20.984, 75\\",\\"17,325, 1,907\\",\\"Sweatshirt - white, Lace-up boots - black\\",\\"Sweatshirt - white, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0589605896, ZO0257202572\\",\\"0, 0\\",\\"20.984, 75\\",\\"20.984, 75\\",\\"0, 0\\",\\"ZO0589605896, ZO0257202572\\",96,96,2,2,order,fuzzy +ZQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Jim,Jim,\\"Jim Cortez\\",\\"Jim Cortez\\",MALE,41,Cortez,Cortez,\\"(empty)\\",Saturday,5,\\"jim@cortez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 21, 2019 @ 00:00:00.000\\",563485,\\"sold_product_563485_23858, sold_product_563485_16559\\",\\"sold_product_563485_23858, sold_product_563485_16559\\",\\"11.992, 37\\",\\"11.992, 37\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"6.23, 18.5\\",\\"11.992, 37\\",\\"23,858, 16,559\\",\\"Wallet - cognac, Boots - black\\",\\"Wallet - cognac, Boots - black\\",\\"1, 1\\",\\"ZO0602606026, ZO0522005220\\",\\"0, 0\\",\\"11.992, 37\\",\\"11.992, 37\\",\\"0, 0\\",\\"ZO0602606026, ZO0522005220\\",\\"48.969\\",\\"48.969\\",2,2,order,jim +1QMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Diane,Diane,\\"Diane Underwood\\",\\"Diane Underwood\\",FEMALE,22,Underwood,Underwood,\\"(empty)\\",Saturday,5,\\"diane@underwood-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562792,\\"sold_product_562792_14720, sold_product_562792_9051\\",\\"sold_product_562792_14720, sold_product_562792_9051\\",\\"50, 33\\",\\"50, 33\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"26.984, 17.156\\",\\"50, 33\\",\\"14,720, 9,051\\",\\"High heeled sandals - nude, Jersey dress - navy blazer\\",\\"High heeled sandals - nude, Jersey dress - navy blazer\\",\\"1, 1\\",\\"ZO0242602426, ZO0336103361\\",\\"0, 0\\",\\"50, 33\\",\\"50, 33\\",\\"0, 0\\",\\"ZO0242602426, ZO0336103361\\",83,83,2,2,order,diane +dwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Boone\\",\\"Stephanie Boone\\",FEMALE,6,Boone,Boone,\\"(empty)\\",Saturday,5,\\"stephanie@boone-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563365,\\"sold_product_563365_24862, sold_product_563365_20441\\",\\"sold_product_563365_24862, sold_product_563365_20441\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"5.5, 14.211\\",\\"10.992, 28.984\\",\\"24,862, 20,441\\",\\"Print T-shirt - dark blue/off white, Blouse - black/white\\",\\"Print T-shirt - dark blue/off white, Blouse - black/white\\",\\"1, 1\\",\\"ZO0646206462, ZO0065200652\\",\\"0, 0\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"0, 0\\",\\"ZO0646206462, ZO0065200652\\",\\"39.969\\",\\"39.969\\",2,2,order,stephanie +iwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Marwan,Marwan,\\"Marwan Wood\\",\\"Marwan Wood\\",MALE,51,Wood,Wood,\\"(empty)\\",Saturday,5,\\"marwan@wood-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562688,\\"sold_product_562688_22319, sold_product_562688_11707\\",\\"sold_product_562688_22319, sold_product_562688_11707\\",\\"24.984, 13.992\\",\\"24.984, 13.992\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"13.742, 7.41\\",\\"24.984, 13.992\\",\\"22,319, 11,707\\",\\"Trainers - black, Wash bag - dark grey \\",\\"Trainers - black, Wash bag - dark grey \\",\\"1, 1\\",\\"ZO0394603946, ZO0608406084\\",\\"0, 0\\",\\"24.984, 13.992\\",\\"24.984, 13.992\\",\\"0, 0\\",\\"ZO0394603946, ZO0608406084\\",\\"38.969\\",\\"38.969\\",2,2,order,marwan +jAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Women's Accessories\\",\\"Men's Shoes, Women's Accessories\\",EUR,Marwan,Marwan,\\"Marwan Barnes\\",\\"Marwan Barnes\\",MALE,51,Barnes,Barnes,\\"(empty)\\",Saturday,5,\\"marwan@barnes-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563647,\\"sold_product_563647_20757, sold_product_563647_11341\\",\\"sold_product_563647_20757, sold_product_563647_11341\\",\\"80, 42\\",\\"80, 42\\",\\"Men's Shoes, Women's Accessories\\",\\"Men's Shoes, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"40.781, 22.25\\",\\"80, 42\\",\\"20,757, 11,341\\",\\"Lace-up boots - dark brown, Weekend bag - classic navy\\",\\"Lace-up boots - dark brown, Weekend bag - classic navy\\",\\"1, 1\\",\\"ZO0690906909, ZO0319003190\\",\\"0, 0\\",\\"80, 42\\",\\"80, 42\\",\\"0, 0\\",\\"ZO0690906909, ZO0319003190\\",122,122,2,2,order,marwan +jQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Kamal,Kamal,\\"Kamal Reese\\",\\"Kamal Reese\\",MALE,39,Reese,Reese,\\"(empty)\\",Saturday,5,\\"kamal@reese-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,Oceanavigations,Oceanavigations,\\"Jun 21, 2019 @ 00:00:00.000\\",563711,\\"sold_product_563711_22407, sold_product_563711_11553\\",\\"sold_product_563711_22407, sold_product_563711_11553\\",\\"60, 140\\",\\"60, 140\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"33, 72.813\\",\\"60, 140\\",\\"22,407, 11,553\\",\\"Lace-ups - grey, Leather jacket - camel\\",\\"Lace-ups - grey, Leather jacket - camel\\",\\"1, 1\\",\\"ZO0254202542, ZO0288202882\\",\\"0, 0\\",\\"60, 140\\",\\"60, 140\\",\\"0, 0\\",\\"ZO0254202542, ZO0288202882\\",200,200,2,2,order,kamal +2AMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Phil,Phil,\\"Phil Willis\\",\\"Phil Willis\\",MALE,50,Willis,Willis,\\"(empty)\\",Saturday,5,\\"phil@willis-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563763,\\"sold_product_563763_16794, sold_product_563763_13661\\",\\"sold_product_563763_16794, sold_product_563763_13661\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"10.703, 10.492\\",\\"20.984, 20.984\\",\\"16,794, 13,661\\",\\"Swimming shorts - white, Tracksuit bottoms - light grey\\",\\"Swimming shorts - white, Tracksuit bottoms - light grey\\",\\"1, 1\\",\\"ZO0479404794, ZO0525305253\\",\\"0, 0\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"0, 0\\",\\"ZO0479404794, ZO0525305253\\",\\"41.969\\",\\"41.969\\",2,2,order,phil +BQMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Mary,Mary,\\"Mary Brock\\",\\"Mary Brock\\",FEMALE,20,Brock,Brock,\\"(empty)\\",Saturday,5,\\"mary@brock-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,Oceanavigations,Oceanavigations,\\"Jun 21, 2019 @ 00:00:00.000\\",563825,\\"sold_product_563825_25104, sold_product_563825_5962\\",\\"sold_product_563825_25104, sold_product_563825_5962\\",\\"65, 65\\",\\"65, 65\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"35.094, 33.125\\",\\"65, 65\\",\\"25,104, 5,962\\",\\"Classic heels - rose/true nude, High heels - black\\",\\"Classic heels - rose/true nude, High heels - black\\",\\"1, 1\\",\\"ZO0238202382, ZO0237102371\\",\\"0, 0\\",\\"65, 65\\",\\"65, 65\\",\\"0, 0\\",\\"ZO0238202382, ZO0237102371\\",130,130,2,2,order,mary +HAMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Irwin,Irwin,\\"Irwin Cook\\",\\"Irwin Cook\\",MALE,14,Cook,Cook,\\"(empty)\\",Saturday,5,\\"irwin@cook-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562797,\\"sold_product_562797_20442, sold_product_562797_20442\\",\\"sold_product_562797_20442, sold_product_562797_20442\\",\\"11.992, 11.992\\",\\"11.992, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"5.398, 5.398\\",\\"11.992, 11.992\\",\\"20,442, 20,442\\",\\"Polo shirt - dark grey multicolor, Polo shirt - dark grey multicolor\\",\\"Polo shirt - dark grey multicolor, Polo shirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0442504425, ZO0442504425\\",\\"0, 0\\",\\"11.992, 11.992\\",\\"11.992, 11.992\\",\\"0, 0\\",ZO0442504425,\\"23.984\\",\\"23.984\\",2,2,order,irwin +SgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Goodwin\\",\\"Abigail Goodwin\\",FEMALE,46,Goodwin,Goodwin,\\"(empty)\\",Saturday,5,\\"abigail@goodwin-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563846,\\"sold_product_563846_23161, sold_product_563846_13874\\",\\"sold_product_563846_23161, sold_product_563846_13874\\",\\"100, 16.984\\",\\"100, 16.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"53, 9\\",\\"100, 16.984\\",\\"23,161, 13,874\\",\\"Boots - brandy, Long sleeved top - khaki\\",\\"Boots - brandy, Long sleeved top - khaki\\",\\"1, 1\\",\\"ZO0244102441, ZO0169301693\\",\\"0, 0\\",\\"100, 16.984\\",\\"100, 16.984\\",\\"0, 0\\",\\"ZO0244102441, ZO0169301693\\",117,117,2,2,order,abigail +SwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Burton\\",\\"Youssef Burton\\",MALE,31,Burton,Burton,\\"(empty)\\",Saturday,5,\\"youssef@burton-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563887,\\"sold_product_563887_11751, sold_product_563887_18663\\",\\"sold_product_563887_11751, sold_product_563887_18663\\",\\"28.984, 16.984\\",\\"28.984, 16.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"14.781, 8.156\\",\\"28.984, 16.984\\",\\"11,751, 18,663\\",\\"Shorts - beige, Print T-shirt - dark blue multicolor\\",\\"Shorts - beige, Print T-shirt - dark blue multicolor\\",\\"1, 1\\",\\"ZO0423104231, ZO0438204382\\",\\"0, 0\\",\\"28.984, 16.984\\",\\"28.984, 16.984\\",\\"0, 0\\",\\"ZO0423104231, ZO0438204382\\",\\"45.969\\",\\"45.969\\",2,2,order,youssef +UgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Willis\\",\\"Rabbia Al Willis\\",FEMALE,5,Willis,Willis,\\"(empty)\\",Saturday,5,\\"rabbia al@willis-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563607,\\"sold_product_563607_23412, sold_product_563607_14303\\",\\"sold_product_563607_23412, sold_product_563607_14303\\",\\"33, 75\\",\\"33, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"17.813, 36\\",\\"33, 75\\",\\"23,412, 14,303\\",\\"Jeans Skinny Fit - black, Ankle boots - black\\",\\"Jeans Skinny Fit - black, Ankle boots - black\\",\\"1, 1\\",\\"ZO0271002710, ZO0678806788\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0271002710, ZO0678806788\\",108,108,2,2,order,rabbia +jgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Betty,Betty,\\"Betty Bryan\\",\\"Betty Bryan\\",FEMALE,44,Bryan,Bryan,\\"(empty)\\",Saturday,5,\\"betty@bryan-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562762,\\"sold_product_562762_23139, sold_product_562762_13840\\",\\"sold_product_562762_23139, sold_product_562762_13840\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"6.23, 29.906\\",\\"11.992, 65\\",\\"23,139, 13,840\\",\\"Print T-shirt - black/berry, Boots - Royal Blue\\",\\"Print T-shirt - black/berry, Boots - Royal Blue\\",\\"1, 1\\",\\"ZO0162401624, ZO0375203752\\",\\"0, 0\\",\\"11.992, 65\\",\\"11.992, 65\\",\\"0, 0\\",\\"ZO0162401624, ZO0375203752\\",77,77,2,2,order,betty +9AMtOW0BH63Xcmy44mSR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Sutton\\",\\"Elyssa Sutton\\",FEMALE,27,Sutton,Sutton,\\"(empty)\\",Saturday,5,\\"elyssa@sutton-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Primemaster, Spherecords\\",\\"Tigress Enterprises, Primemaster, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",723905,\\"sold_product_723905_24589, sold_product_723905_11977, sold_product_723905_13368, sold_product_723905_14021\\",\\"sold_product_723905_24589, sold_product_723905_11977, sold_product_723905_13368, sold_product_723905_14021\\",\\"24.984, 100, 21.984, 20.984\\",\\"24.984, 100, 21.984, 20.984\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Clothing\\",\\"Women's Shoes, Women's Shoes, Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Primemaster, Spherecords, Spherecords\\",\\"Tigress Enterprises, Primemaster, Spherecords, Spherecords\\",\\"13.492, 54, 11.867, 10.906\\",\\"24.984, 100, 21.984, 20.984\\",\\"24,589, 11,977, 13,368, 14,021\\",\\"Boots - black, Ankle boots - Midnight Blue, Chinos - light blue, Shirt - black\\",\\"Boots - black, Ankle boots - Midnight Blue, Chinos - light blue, Shirt - black\\",\\"1, 1, 1, 1\\",\\"ZO0030300303, ZO0360003600, ZO0632906329, ZO0650906509\\",\\"0, 0, 0, 0\\",\\"24.984, 100, 21.984, 20.984\\",\\"24.984, 100, 21.984, 20.984\\",\\"0, 0, 0, 0\\",\\"ZO0030300303, ZO0360003600, ZO0632906329, ZO0650906509\\",168,168,4,4,order,elyssa +FQMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Boone\\",\\"Elyssa Boone\\",FEMALE,27,Boone,Boone,\\"(empty)\\",Saturday,5,\\"elyssa@boone-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises MAMA, Champion Arts\\",\\"Tigress Enterprises MAMA, Champion Arts\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563195,\\"sold_product_563195_14393, sold_product_563195_22789\\",\\"sold_product_563195_14393, sold_product_563195_22789\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Champion Arts\\",\\"Tigress Enterprises MAMA, Champion Arts\\",\\"9.453, 13.633\\",\\"20.984, 28.984\\",\\"14,393, 22,789\\",\\"Print T-shirt - grey metallic, Tracksuit top - blue\\",\\"Print T-shirt - grey metallic, Tracksuit top - blue\\",\\"1, 1\\",\\"ZO0231802318, ZO0501805018\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0231802318, ZO0501805018\\",\\"49.969\\",\\"49.969\\",2,2,order,elyssa +FgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Selena,Selena,\\"Selena Bowers\\",\\"Selena Bowers\\",FEMALE,42,Bowers,Bowers,\\"(empty)\\",Saturday,5,\\"selena@bowers-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563436,\\"sold_product_563436_24555, sold_product_563436_11768\\",\\"sold_product_563436_24555, sold_product_563436_11768\\",\\"20.984, 7.988\\",\\"20.984, 7.988\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"10.492, 4.07\\",\\"20.984, 7.988\\",\\"24,555, 11,768\\",\\"Blouse - dark red, Bracelet - black\\",\\"Blouse - dark red, Bracelet - black\\",\\"1, 1\\",\\"ZO0651606516, ZO0078100781\\",\\"0, 0\\",\\"20.984, 7.988\\",\\"20.984, 7.988\\",\\"0, 0\\",\\"ZO0651606516, ZO0078100781\\",\\"28.984\\",\\"28.984\\",2,2,order,selena +FwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Robert,Robert,\\"Robert Phelps\\",\\"Robert Phelps\\",MALE,29,Phelps,Phelps,\\"(empty)\\",Saturday,5,\\"robert@phelps-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Microlutions, (empty)\\",\\"Microlutions, (empty)\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563489,\\"sold_product_563489_21239, sold_product_563489_13428\\",\\"sold_product_563489_21239, sold_product_563489_13428\\",\\"11.992, 165\\",\\"11.992, 165\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, (empty)\\",\\"Microlutions, (empty)\\",\\"6.469, 90.75\\",\\"11.992, 165\\",\\"21,239, 13,428\\",\\"Hat - multicolor/black, Demi-Boots\\",\\"Hat - multicolor/black, Demi-Boots\\",\\"1, 1\\",\\"ZO0126101261, ZO0483704837\\",\\"0, 0\\",\\"11.992, 165\\",\\"11.992, 165\\",\\"0, 0\\",\\"ZO0126101261, ZO0483704837\\",177,177,2,2,order,robert +dgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Graham\\",\\"Elyssa Graham\\",FEMALE,27,Graham,Graham,\\"(empty)\\",Saturday,5,\\"elyssa@graham-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Oceanavigations, Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Pyramidustries, Oceanavigations, Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",727576,\\"sold_product_727576_18143, sold_product_727576_19012, sold_product_727576_16454, sold_product_727576_11955\\",\\"sold_product_727576_18143, sold_product_727576_19012, sold_product_727576_16454, sold_product_727576_11955\\",\\"20.984, 20.984, 18.984, 18.984\\",\\"20.984, 20.984, 18.984, 18.984\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Oceanavigations, Tigress Enterprises MAMA, Tigress Enterprises\\",\\"Pyramidustries, Oceanavigations, Tigress Enterprises MAMA, Tigress Enterprises\\",\\"11.117, 9.453, 10.063, 10.438\\",\\"20.984, 20.984, 18.984, 18.984\\",\\"18,143, 19,012, 16,454, 11,955\\",\\"Jumper - bordeaux, Vest - black/rose, Vest - black, Print T-shirt - red\\",\\"Jumper - bordeaux, Vest - black/rose, Vest - black, Print T-shirt - red\\",\\"1, 1, 1, 1\\",\\"ZO0181201812, ZO0266902669, ZO0231702317, ZO0055800558\\",\\"0, 0, 0, 0\\",\\"20.984, 20.984, 18.984, 18.984\\",\\"20.984, 20.984, 18.984, 18.984\\",\\"0, 0, 0, 0\\",\\"ZO0181201812, ZO0266902669, ZO0231702317, ZO0055800558\\",\\"79.938\\",\\"79.938\\",4,4,order,elyssa +swMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Stewart\\",\\"Marwan Stewart\\",MALE,51,Stewart,Stewart,\\"(empty)\\",Saturday,5,\\"marwan@stewart-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563167,\\"sold_product_563167_24934, sold_product_563167_11541\\",\\"sold_product_563167_24934, sold_product_563167_11541\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"22.5, 8.547\\",\\"50, 18.984\\",\\"24,934, 11,541\\",\\"Lace-up boots - resin coffee, Polo shirt - black\\",\\"Lace-up boots - resin coffee, Polo shirt - black\\",\\"1, 1\\",\\"ZO0403504035, ZO0295602956\\",\\"0, 0\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"0, 0\\",\\"ZO0403504035, ZO0295602956\\",69,69,2,2,order,marwan +tAMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Selena,Selena,\\"Selena Gibbs\\",\\"Selena Gibbs\\",FEMALE,42,Gibbs,Gibbs,\\"(empty)\\",Saturday,5,\\"selena@gibbs-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563212,\\"sold_product_563212_21217, sold_product_563212_22846\\",\\"sold_product_563212_21217, sold_product_563212_22846\\",\\"33, 50\\",\\"33, 50\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"15.844, 25\\",\\"33, 50\\",\\"21,217, 22,846\\",\\"Jumper dress - grey/Medium Slate Blue multicolor, Over-the-knee boots - cognac\\",\\"Jumper dress - grey/Medium Slate Blue multicolor, Over-the-knee boots - cognac\\",\\"1, 1\\",\\"ZO0043700437, ZO0139001390\\",\\"0, 0\\",\\"33, 50\\",\\"33, 50\\",\\"0, 0\\",\\"ZO0043700437, ZO0139001390\\",83,83,2,2,order,selena +tQMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Abbott\\",\\"Muniz Abbott\\",MALE,37,Abbott,Abbott,\\"(empty)\\",Saturday,5,\\"muniz@abbott-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563460,\\"sold_product_563460_2036, sold_product_563460_17157\\",\\"sold_product_563460_2036, sold_product_563460_17157\\",\\"80, 20.984\\",\\"80, 20.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"40, 10.289\\",\\"80, 20.984\\",\\"2,036, 17,157\\",\\"Lace-ups - Midnight Blue, Sweatshirt - off white\\",\\"Lace-ups - Midnight Blue, Sweatshirt - off white\\",\\"1, 1\\",\\"ZO0682506825, ZO0594505945\\",\\"0, 0\\",\\"80, 20.984\\",\\"80, 20.984\\",\\"0, 0\\",\\"ZO0682506825, ZO0594505945\\",101,101,2,2,order,muniz +tgMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Reese\\",\\"Robbie Reese\\",MALE,48,Reese,Reese,\\"(empty)\\",Saturday,5,\\"robbie@reese-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563492,\\"sold_product_563492_13753, sold_product_563492_16739\\",\\"sold_product_563492_13753, sold_product_563492_16739\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"13.742, 29.25\\",\\"24.984, 65\\",\\"13,753, 16,739\\",\\"Formal shirt - white/blue, Suit jacket - dark grey\\",\\"Formal shirt - white/blue, Suit jacket - dark grey\\",\\"1, 1\\",\\"ZO0412004120, ZO0274102741\\",\\"0, 0\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"0, 0\\",\\"ZO0412004120, ZO0274102741\\",90,90,2,2,order,robbie +0wMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Phil,Phil,\\"Phil Graham\\",\\"Phil Graham\\",MALE,50,Graham,Graham,\\"(empty)\\",Saturday,5,\\"phil@graham-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562729,\\"sold_product_562729_12601, sold_product_562729_22654\\",\\"sold_product_562729_12601, sold_product_562729_22654\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"10.906, 12.25\\",\\"20.984, 24.984\\",\\"12,601, 22,654\\",\\"Sweatshirt - bordeaux multicolor, Relaxed fit jeans - vintage blue\\",\\"Sweatshirt - bordeaux multicolor, Relaxed fit jeans - vintage blue\\",\\"1, 1\\",\\"ZO0456404564, ZO0535605356\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0456404564, ZO0535605356\\",\\"45.969\\",\\"45.969\\",2,2,order,phil +4AMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Caldwell\\",\\"Sonya Caldwell\\",FEMALE,28,Caldwell,Caldwell,\\"(empty)\\",Saturday,5,\\"sonya@caldwell-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562978,\\"sold_product_562978_12226, sold_product_562978_11632\\",\\"sold_product_562978_12226, sold_product_562978_11632\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"21.828, 9.867\\",\\"42, 20.984\\",\\"12,226, 11,632\\",\\"Sandals - beige, Summer dress - coral/pink\\",\\"Sandals - beige, Summer dress - coral/pink\\",\\"1, 1\\",\\"ZO0371003710, ZO0150601506\\",\\"0, 0\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"0, 0\\",\\"ZO0371003710, ZO0150601506\\",\\"62.969\\",\\"62.969\\",2,2,order,sonya +4gMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Mcdonald\\",\\"Wagdi Mcdonald\\",MALE,15,Mcdonald,Mcdonald,\\"(empty)\\",Saturday,5,\\"wagdi@mcdonald-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563324,\\"sold_product_563324_24573, sold_product_563324_20665\\",\\"sold_product_563324_24573, sold_product_563324_20665\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"9.344, 4.949\\",\\"16.984, 10.992\\",\\"24,573, 20,665\\",\\"Basic T-shirt - dark blue multicolor, 3 PACK - Socks - black/white/grey\\",\\"Basic T-shirt - dark blue multicolor, 3 PACK - Socks - black/white/grey\\",\\"1, 1\\",\\"ZO0440004400, ZO0130401304\\",\\"0, 0\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"0, 0\\",\\"ZO0440004400, ZO0130401304\\",\\"27.984\\",\\"27.984\\",2,2,order,wagdi +4wMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Byrd\\",\\"Elyssa Byrd\\",FEMALE,27,Byrd,Byrd,\\"(empty)\\",Saturday,5,\\"elyssa@byrd-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563249,\\"sold_product_563249_14397, sold_product_563249_5141\\",\\"sold_product_563249_14397, sold_product_563249_5141\\",\\"21.984, 60\\",\\"21.984, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Low Tide Media\\",\\"Pyramidustries, Low Tide Media\\",\\"10.344, 33\\",\\"21.984, 60\\",\\"14,397, 5,141\\",\\"Sweatshirt - light grey multicolor, Ankle boots - black\\",\\"Sweatshirt - light grey multicolor, Ankle boots - black\\",\\"1, 1\\",\\"ZO0181001810, ZO0378903789\\",\\"0, 0\\",\\"21.984, 60\\",\\"21.984, 60\\",\\"0, 0\\",\\"ZO0181001810, ZO0378903789\\",82,82,2,2,order,elyssa +5AMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Chandler\\",\\"Brigitte Chandler\\",FEMALE,12,Chandler,Chandler,\\"(empty)\\",Saturday,5,\\"brigitte@chandler-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563286,\\"sold_product_563286_11887, sold_product_563286_22261\\",\\"sold_product_563286_11887, sold_product_563286_22261\\",\\"50, 50\\",\\"50, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"24.5, 22.5\\",\\"50, 50\\",\\"11,887, 22,261\\",\\"Maxi dress - black, Winter jacket - bordeaux\\",\\"Maxi dress - black, Winter jacket - bordeaux\\",\\"1, 1\\",\\"ZO0040000400, ZO0503805038\\",\\"0, 0\\",\\"50, 50\\",\\"50, 50\\",\\"0, 0\\",\\"ZO0040000400, ZO0503805038\\",100,100,2,2,order,brigitte +dgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Shaw\\",\\"Abd Shaw\\",MALE,52,Shaw,Shaw,\\"(empty)\\",Saturday,5,\\"abd@shaw-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563187,\\"sold_product_563187_12040, sold_product_563187_21172\\",\\"sold_product_563187_12040, sold_product_563187_21172\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"12.492, 12.992\\",\\"24.984, 24.984\\",\\"12,040, 21,172\\",\\"Shirt - navy, Jeans Skinny Fit - blue\\",\\"Shirt - navy, Jeans Skinny Fit - blue\\",\\"1, 1\\",\\"ZO0278702787, ZO0425404254\\",\\"0, 0\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"0, 0\\",\\"ZO0278702787, ZO0425404254\\",\\"49.969\\",\\"49.969\\",2,2,order,abd +dwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Gregory\\",\\"Elyssa Gregory\\",FEMALE,27,Gregory,Gregory,\\"(empty)\\",Saturday,5,\\"elyssa@gregory-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563503,\\"sold_product_563503_23310, sold_product_563503_16900\\",\\"sold_product_563503_23310, sold_product_563503_16900\\",\\"19.984, 24.984\\",\\"19.984, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"9.797, 13.742\\",\\"19.984, 24.984\\",\\"23,310, 16,900\\",\\"Blouse - dark green, Jersey dress - black/white\\",\\"Blouse - dark green, Jersey dress - black/white\\",\\"1, 1\\",\\"ZO0649306493, ZO0490704907\\",\\"0, 0\\",\\"19.984, 24.984\\",\\"19.984, 24.984\\",\\"0, 0\\",\\"ZO0649306493, ZO0490704907\\",\\"44.969\\",\\"44.969\\",2,2,order,elyssa +ewMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robert,Robert,\\"Robert Moran\\",\\"Robert Moran\\",MALE,29,Moran,Moran,\\"(empty)\\",Saturday,5,\\"robert@moran-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563275,\\"sold_product_563275_21731, sold_product_563275_19441\\",\\"sold_product_563275_21731, sold_product_563275_19441\\",\\"37, 24.984\\",\\"37, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"17.016, 11.5\\",\\"37, 24.984\\",\\"21,731, 19,441\\",\\"Bomber Jacket - black, Jumper - green multicolor\\",\\"Bomber Jacket - black, Jumper - green multicolor\\",\\"1, 1\\",\\"ZO0287402874, ZO0453404534\\",\\"0, 0\\",\\"37, 24.984\\",\\"37, 24.984\\",\\"0, 0\\",\\"ZO0287402874, ZO0453404534\\",\\"61.969\\",\\"61.969\\",2,2,order,robert +kgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,rania,rania,\\"rania Mccarthy\\",\\"rania Mccarthy\\",FEMALE,24,Mccarthy,Mccarthy,\\"(empty)\\",Saturday,5,\\"rania@mccarthy-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563737,\\"sold_product_563737_12413, sold_product_563737_19717\\",\\"sold_product_563737_12413, sold_product_563737_19717\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"12.25, 22.25\\",\\"24.984, 42\\",\\"12,413, 19,717\\",\\"Clutch - black, Ballet pumps - blue/white\\",\\"Clutch - black, Ballet pumps - blue/white\\",\\"1, 1\\",\\"ZO0306903069, ZO0320703207\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0306903069, ZO0320703207\\",67,67,2,2,order,rani +kwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Foster\\",\\"Boris Foster\\",MALE,36,Foster,Foster,\\"(empty)\\",Saturday,5,\\"boris@foster-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Spritechnologies, Oceanavigations\\",\\"Spritechnologies, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563796,\\"sold_product_563796_15607, sold_product_563796_14438\\",\\"sold_product_563796_15607, sold_product_563796_14438\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Oceanavigations\\",\\"Spritechnologies, Oceanavigations\\",\\"21.406, 13.344\\",\\"42, 28.984\\",\\"15,607, 14,438\\",\\"Soft shell jacket - dark grey, Jumper - dark grey multicolor\\",\\"Soft shell jacket - dark grey, Jumper - dark grey multicolor\\",\\"1, 1\\",\\"ZO0625806258, ZO0297602976\\",\\"0, 0\\",\\"42, 28.984\\",\\"42, 28.984\\",\\"0, 0\\",\\"ZO0625806258, ZO0297602976\\",71,71,2,2,order,boris +vgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robert,Robert,\\"Robert Mcdonald\\",\\"Robert Mcdonald\\",MALE,29,Mcdonald,Mcdonald,\\"(empty)\\",Saturday,5,\\"robert@mcdonald-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562853,\\"sold_product_562853_21053, sold_product_562853_23834\\",\\"sold_product_562853_21053, sold_product_562853_23834\\",\\"10.992, 7.988\\",\\"10.992, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.391, 4.07\\",\\"10.992, 7.988\\",\\"21,053, 23,834\\",\\"Print T-shirt - white/blue, 3 PACK - Socks - blue/grey\\",\\"Print T-shirt - white/blue, 3 PACK - Socks - blue/grey\\",\\"1, 1\\",\\"ZO0564705647, ZO0481004810\\",\\"0, 0\\",\\"10.992, 7.988\\",\\"10.992, 7.988\\",\\"0, 0\\",\\"ZO0564705647, ZO0481004810\\",\\"18.984\\",\\"18.984\\",2,2,order,robert +vwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Love\\",\\"Elyssa Love\\",FEMALE,27,Love,Love,\\"(empty)\\",Saturday,5,\\"elyssa@love-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562900,\\"sold_product_562900_15312, sold_product_562900_12544\\",\\"sold_product_562900_15312, sold_product_562900_12544\\",\\"28.984, 24.984\\",\\"28.984, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"14.211, 12.992\\",\\"28.984, 24.984\\",\\"15,312, 12,544\\",\\"Print T-shirt - coronet blue, Faux leather jacket - black\\",\\"Print T-shirt - coronet blue, Faux leather jacket - black\\",\\"1, 1\\",\\"ZO0349203492, ZO0173801738\\",\\"0, 0\\",\\"28.984, 24.984\\",\\"28.984, 24.984\\",\\"0, 0\\",\\"ZO0349203492, ZO0173801738\\",\\"53.969\\",\\"53.969\\",2,2,order,elyssa +wAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Thompson\\",\\"Betty Thompson\\",FEMALE,44,Thompson,Thompson,\\"(empty)\\",Saturday,5,\\"betty@thompson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562668,\\"sold_product_562668_22190, sold_product_562668_24239\\",\\"sold_product_562668_22190, sold_product_562668_24239\\",\\"33, 25.984\\",\\"33, 25.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"15.844, 12.219\\",\\"33, 25.984\\",\\"22,190, 24,239\\",\\"Vest - black, Long sleeved top - winter white/peacoat\\",\\"Vest - black, Long sleeved top - winter white/peacoat\\",\\"1, 1\\",\\"ZO0348503485, ZO0059100591\\",\\"0, 0\\",\\"33, 25.984\\",\\"33, 25.984\\",\\"0, 0\\",\\"ZO0348503485, ZO0059100591\\",\\"58.969\\",\\"58.969\\",2,2,order,betty +zgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Perkins\\",\\"Muniz Perkins\\",MALE,37,Perkins,Perkins,\\"(empty)\\",Saturday,5,\\"muniz@perkins-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562794,\\"sold_product_562794_12403, sold_product_562794_24539\\",\\"sold_product_562794_12403, sold_product_562794_24539\\",\\"75, 15.992\\",\\"75, 15.992\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"35.25, 8.148\\",\\"75, 15.992\\",\\"12,403, 24,539\\",\\"Rucksack - brandy, Long sleeved top - off-white\\",\\"Rucksack - brandy, Long sleeved top - off-white\\",\\"1, 1\\",\\"ZO0701707017, ZO0440404404\\",\\"0, 0\\",\\"75, 15.992\\",\\"75, 15.992\\",\\"0, 0\\",\\"ZO0701707017, ZO0440404404\\",91,91,2,2,order,muniz +\\"-QMtOW0BH63Xcmy442fU\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Caldwell\\",\\"Marwan Caldwell\\",MALE,51,Caldwell,Caldwell,\\"(empty)\\",Saturday,5,\\"marwan@caldwell-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Elitelligence,Elitelligence,\\"Jun 21, 2019 @ 00:00:00.000\\",562720,\\"sold_product_562720_17428, sold_product_562720_13612\\",\\"sold_product_562720_17428, sold_product_562720_13612\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"10.078, 6.469\\",\\"20.984, 11.992\\",\\"17,428, 13,612\\",\\"Sweatshirt - bordeaux, Basic T-shirt - light red/white\\",\\"Sweatshirt - bordeaux, Basic T-shirt - light red/white\\",\\"1, 1\\",\\"ZO0585605856, ZO0549505495\\",\\"0, 0\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"0, 0\\",\\"ZO0585605856, ZO0549505495\\",\\"32.969\\",\\"32.969\\",2,2,order,marwan +\\"-gMtOW0BH63Xcmy442fU\\",ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Robert,Robert,\\"Robert Reyes\\",\\"Robert Reyes\\",MALE,29,Reyes,Reyes,\\"(empty)\\",Saturday,5,\\"robert@reyes-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562759,\\"sold_product_562759_15827, sold_product_562759_22599\\",\\"sold_product_562759_15827, sold_product_562759_22599\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"9.867, 11.5\\",\\"20.984, 24.984\\",\\"15,827, 22,599\\",\\"Belt - black/brown, Sweatshirt - black\\",\\"Belt - black/brown, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0310403104, ZO0595005950\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0310403104, ZO0595005950\\",\\"45.969\\",\\"45.969\\",2,2,order,robert +KQMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Boris,Boris,\\"Boris Little\\",\\"Boris Little\\",MALE,36,Little,Little,\\"(empty)\\",Saturday,5,\\"boris@little-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563442,\\"sold_product_563442_23887, sold_product_563442_17436\\",\\"sold_product_563442_23887, sold_product_563442_17436\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"27, 5.391\\",\\"60, 10.992\\",\\"23,887, 17,436\\",\\"Casual lace-ups - blue, Print T-shirt - white/orange\\",\\"Casual lace-ups - blue, Print T-shirt - white/orange\\",\\"1, 1\\",\\"ZO0394303943, ZO0556305563\\",\\"0, 0\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"0, 0\\",\\"ZO0394303943, ZO0556305563\\",71,71,2,2,order,boris +qwMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Samir,Samir,\\"Samir Valdez\\",\\"Samir Valdez\\",MALE,34,Valdez,Valdez,\\"(empty)\\",Saturday,5,\\"samir@valdez-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563775,\\"sold_product_563775_16063, sold_product_563775_12691\\",\\"sold_product_563775_16063, sold_product_563775_12691\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"6.469, 11.75\\",\\"11.992, 24.984\\",\\"16,063, 12,691\\",\\"Long sleeved top - tan, Windbreaker - Cornflower Blue\\",\\"Long sleeved top - tan, Windbreaker - Cornflower Blue\\",\\"1, 1\\",\\"ZO0562805628, ZO0622806228\\",\\"0, 0\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"0, 0\\",\\"ZO0562805628, ZO0622806228\\",\\"36.969\\",\\"36.969\\",2,2,order,samir +rAMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Samir,Samir,\\"Samir Cross\\",\\"Samir Cross\\",MALE,34,Cross,Cross,\\"(empty)\\",Saturday,5,\\"samir@cross-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563813,\\"sold_product_563813_20520, sold_product_563813_19613\\",\\"sold_product_563813_20520, sold_product_563813_19613\\",\\"14.992, 50\\",\\"14.992, 50\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"7.352, 25.484\\",\\"14.992, 50\\",\\"20,520, 19,613\\",\\"Print T-shirt - bright white, Summer jacket - black\\",\\"Print T-shirt - bright white, Summer jacket - black\\",\\"1, 1\\",\\"ZO0120001200, ZO0286602866\\",\\"0, 0\\",\\"14.992, 50\\",\\"14.992, 50\\",\\"0, 0\\",\\"ZO0120001200, ZO0286602866\\",65,65,2,2,order,samir +NgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Marwan,Marwan,\\"Marwan Reyes\\",\\"Marwan Reyes\\",MALE,51,Reyes,Reyes,\\"(empty)\\",Saturday,5,\\"marwan@reyes-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563250,\\"sold_product_563250_18528, sold_product_563250_12730\\",\\"sold_product_563250_18528, sold_product_563250_12730\\",\\"10.992, 75\\",\\"10.992, 75\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.281, 38.25\\",\\"10.992, 75\\",\\"18,528, 12,730\\",\\"Print T-shirt - black, Crossover Strap Bag\\",\\"Print T-shirt - black, Crossover Strap Bag\\",\\"1, 1\\",\\"ZO0557805578, ZO0463904639\\",\\"0, 0\\",\\"10.992, 75\\",\\"10.992, 75\\",\\"0, 0\\",\\"ZO0557805578, ZO0463904639\\",86,86,2,2,order,marwan +NwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Gilbert\\",\\"Pia Gilbert\\",FEMALE,45,Gilbert,Gilbert,\\"(empty)\\",Saturday,5,\\"pia@gilbert-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563282,\\"sold_product_563282_19216, sold_product_563282_16990\\",\\"sold_product_563282_19216, sold_product_563282_16990\\",\\"25.984, 20.984\\",\\"25.984, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"13.25, 9.656\\",\\"25.984, 20.984\\",\\"19,216, 16,990\\",\\"SET - Pyjamas - black/light pink, Shirt - white/blue\\",\\"SET - Pyjamas - black/light pink, Shirt - white/blue\\",\\"1, 1\\",\\"ZO0100701007, ZO0651106511\\",\\"0, 0\\",\\"25.984, 20.984\\",\\"25.984, 20.984\\",\\"0, 0\\",\\"ZO0100701007, ZO0651106511\\",\\"46.969\\",\\"46.969\\",2,2,order,pia +bQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Tariq,Tariq,\\"Tariq Washington\\",\\"Tariq Washington\\",MALE,25,Washington,Washington,\\"(empty)\\",Saturday,5,\\"tariq@washington-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563392,\\"sold_product_563392_12047, sold_product_563392_17700\\",\\"sold_product_563392_12047, sold_product_563392_17700\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"10.289, 9\\",\\"20.984, 16.984\\",\\"12,047, 17,700\\",\\"Tracksuit bottoms - dark red, Belt - black\\",\\"Tracksuit bottoms - dark red, Belt - black\\",\\"1, 1\\",\\"ZO0525405254, ZO0310203102\\",\\"0, 0\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"0, 0\\",\\"ZO0525405254, ZO0310203102\\",\\"37.969\\",\\"37.969\\",2,2,order,tariq +kgMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Brigitte,Brigitte,\\"Brigitte Martin\\",\\"Brigitte Martin\\",FEMALE,12,Martin,Martin,\\"(empty)\\",Saturday,5,\\"brigitte@martin-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563697,\\"sold_product_563697_15646, sold_product_563697_21369\\",\\"sold_product_563697_15646, sold_product_563697_21369\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"9.867, 5.602\\",\\"20.984, 10.992\\",\\"15,646, 21,369\\",\\"Jumper - off-white, Ballet pumps - yellow\\",\\"Jumper - off-white, Ballet pumps - yellow\\",\\"1, 1\\",\\"ZO0264702647, ZO0000700007\\",\\"0, 0\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"0, 0\\",\\"ZO0264702647, ZO0000700007\\",\\"31.984\\",\\"31.984\\",2,2,order,brigitte +lwMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Phil,Phil,\\"Phil Williams\\",\\"Phil Williams\\",MALE,50,Williams,Williams,\\"(empty)\\",Saturday,5,\\"phil@williams-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563246,\\"sold_product_563246_17897, sold_product_563246_20203\\",\\"sold_product_563246_17897, sold_product_563246_20203\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"10.703, 14.781\\",\\"20.984, 28.984\\",\\"17,897, 20,203\\",\\"Trainers - grey, Sweatshirt - black\\",\\"Trainers - grey, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0515205152, ZO0300803008\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0515205152, ZO0300803008\\",\\"49.969\\",\\"49.969\\",2,2,order,phil +2gMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Garza\\",\\"Wilhemina St. Garza\\",FEMALE,17,Garza,Garza,\\"(empty)\\",Saturday,5,\\"wilhemina st.@garza-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Angeldale, Gnomehouse\\",\\"Angeldale, Gnomehouse\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562934,\\"sold_product_562934_5758, sold_product_562934_18453\\",\\"sold_product_562934_5758, sold_product_562934_18453\\",\\"75, 85\\",\\"75, 85\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Gnomehouse\\",\\"Angeldale, Gnomehouse\\",\\"33.75, 40.813\\",\\"75, 85\\",\\"5,758, 18,453\\",\\"Ankle boots - cognac, High heeled ankle boots - black\\",\\"Ankle boots - cognac, High heeled ankle boots - black\\",\\"1, 1\\",\\"ZO0674206742, ZO0326303263\\",\\"0, 0\\",\\"75, 85\\",\\"75, 85\\",\\"0, 0\\",\\"ZO0674206742, ZO0326303263\\",160,160,2,2,order,wilhemina +2wMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",EUR,Yuri,Yuri,\\"Yuri Burton\\",\\"Yuri Burton\\",MALE,21,Burton,Burton,\\"(empty)\\",Saturday,5,\\"yuri@burton-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Microlutions, Angeldale\\",\\"Microlutions, Angeldale\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562994,\\"sold_product_562994_12714, sold_product_562994_21404\\",\\"sold_product_562994_12714, sold_product_562994_21404\\",\\"85, 11.992\\",\\"85, 11.992\\",\\"Men's Clothing, Women's Accessories\\",\\"Men's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Angeldale\\",\\"Microlutions, Angeldale\\",\\"40.813, 6.352\\",\\"85, 11.992\\",\\"12,714, 21,404\\",\\"Classic coat - black, Wallet - brown\\",\\"Classic coat - black, Wallet - brown\\",\\"1, 1\\",\\"ZO0115801158, ZO0701507015\\",\\"0, 0\\",\\"85, 11.992\\",\\"85, 11.992\\",\\"0, 0\\",\\"ZO0115801158, ZO0701507015\\",97,97,2,2,order,yuri +3gMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,rania,rania,\\"rania James\\",\\"rania James\\",FEMALE,24,James,James,\\"(empty)\\",Saturday,5,\\"rania@james-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563317,\\"sold_product_563317_12022, sold_product_563317_12978\\",\\"sold_product_563317_12022, sold_product_563317_12978\\",\\"11.992, 10.992\\",\\"11.992, 10.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"5.762, 5.172\\",\\"11.992, 10.992\\",\\"12,022, 12,978\\",\\"T-Shirt - blue, Scarf - offwhite/black\\",\\"T-Shirt - blue, Scarf - offwhite/black\\",\\"1, 1\\",\\"ZO0631706317, ZO0192701927\\",\\"0, 0\\",\\"11.992, 10.992\\",\\"11.992, 10.992\\",\\"0, 0\\",\\"ZO0631706317, ZO0192701927\\",\\"22.984\\",\\"22.984\\",2,2,order,rani +3wMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Webb\\",\\"Eddie Webb\\",MALE,38,Webb,Webb,\\"(empty)\\",Saturday,5,\\"eddie@webb-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563341,\\"sold_product_563341_18784, sold_product_563341_16207\\",\\"sold_product_563341_18784, sold_product_563341_16207\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"29.406, 5.82\\",\\"60, 10.992\\",\\"18,784, 16,207\\",\\"Smart slip-ons - blue, Bow tie - black\\",\\"Smart slip-ons - blue, Bow tie - black\\",\\"1, 1\\",\\"ZO0397303973, ZO0410304103\\",\\"0, 0\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"0, 0\\",\\"ZO0397303973, ZO0410304103\\",71,71,2,2,order,eddie +CgMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Turner\\",\\"Gwen Turner\\",FEMALE,26,Turner,Turner,\\"(empty)\\",Saturday,5,\\"gwen@turner-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Gnomehouse, Pyramidustries active\\",\\"Gnomehouse, Pyramidustries active\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563622,\\"sold_product_563622_19912, sold_product_563622_10691\\",\\"sold_product_563622_19912, sold_product_563622_10691\\",\\"37, 13.992\\",\\"37, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries active\\",\\"Gnomehouse, Pyramidustries active\\",\\"17.016, 6.719\\",\\"37, 13.992\\",\\"19,912, 10,691\\",\\"A-line skirt - june bug, 3/4 sports trousers - magnet \\",\\"A-line skirt - june bug, 3/4 sports trousers - magnet \\",\\"1, 1\\",\\"ZO0328103281, ZO0224602246\\",\\"0, 0\\",\\"37, 13.992\\",\\"37, 13.992\\",\\"0, 0\\",\\"ZO0328103281, ZO0224602246\\",\\"50.969\\",\\"50.969\\",2,2,order,gwen +CwMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Boone\\",\\"Abdulraheem Al Boone\\",MALE,33,Boone,Boone,\\"(empty)\\",Saturday,5,\\"abdulraheem al@boone-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563666,\\"sold_product_563666_1967, sold_product_563666_15695\\",\\"sold_product_563666_1967, sold_product_563666_15695\\",\\"65, 33\\",\\"65, 33\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"34.438, 15.18\\",\\"65, 33\\",\\"1,967, 15,695\\",\\"Lace-ups - cognac, Watch - gunmetal\\",\\"Lace-ups - cognac, Watch - gunmetal\\",\\"1, 1\\",\\"ZO0390903909, ZO0126801268\\",\\"0, 0\\",\\"65, 33\\",\\"65, 33\\",\\"0, 0\\",\\"ZO0390903909, ZO0126801268\\",98,98,2,2,order,abdulraheem +DgMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Clayton\\",\\"Mostafa Clayton\\",MALE,9,Clayton,Clayton,\\"(empty)\\",Saturday,5,\\"mostafa@clayton-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563026,\\"sold_product_563026_18853, sold_product_563026_17728\\",\\"sold_product_563026_18853, sold_product_563026_17728\\",\\"85, 60\\",\\"85, 60\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"40.813, 32.375\\",\\"85, 60\\",\\"18,853, 17,728\\",\\"Tote bag - black , Suit jacket - navy\\",\\"Tote bag - black , Suit jacket - navy\\",\\"1, 1\\",\\"ZO0703407034, ZO0275102751\\",\\"0, 0\\",\\"85, 60\\",\\"85, 60\\",\\"0, 0\\",\\"ZO0703407034, ZO0275102751\\",145,145,2,2,order,mostafa +DwMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Marshall\\",\\"Brigitte Marshall\\",FEMALE,12,Marshall,Marshall,\\"(empty)\\",Saturday,5,\\"brigitte@marshall-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Gnomehouse,Gnomehouse,\\"Jun 21, 2019 @ 00:00:00.000\\",563084,\\"sold_product_563084_23929, sold_product_563084_13484\\",\\"sold_product_563084_23929, sold_product_563084_13484\\",\\"65, 42\\",\\"65, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Gnomehouse\\",\\"Gnomehouse, Gnomehouse\\",\\"29.906, 19.313\\",\\"65, 42\\",\\"23,929, 13,484\\",\\"Summer dress - black, Summer dress - pastel blue\\",\\"Summer dress - black, Summer dress - pastel blue\\",\\"1, 1\\",\\"ZO0338803388, ZO0334203342\\",\\"0, 0\\",\\"65, 42\\",\\"65, 42\\",\\"0, 0\\",\\"ZO0338803388, ZO0334203342\\",107,107,2,2,order,brigitte +GwMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Rivera\\",\\"Sonya Rivera\\",FEMALE,28,Rivera,Rivera,\\"(empty)\\",Saturday,5,\\"sonya@rivera-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562963,\\"sold_product_562963_5747, sold_product_562963_19886\\",\\"sold_product_562963_5747, sold_product_562963_19886\\",\\"28.984, 7.988\\",\\"28.984, 7.988\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"13.633, 4.391\\",\\"28.984, 7.988\\",\\"5,747, 19,886\\",\\"High heels - nude, Mini skirt - dark grey multicolor\\",\\"High heels - nude, Mini skirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0004900049, ZO0633806338\\",\\"0, 0\\",\\"28.984, 7.988\\",\\"28.984, 7.988\\",\\"0, 0\\",\\"ZO0004900049, ZO0633806338\\",\\"36.969\\",\\"36.969\\",2,2,order,sonya +HAMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yahya,Yahya,\\"Yahya Jimenez\\",\\"Yahya Jimenez\\",MALE,23,Jimenez,Jimenez,\\"(empty)\\",Saturday,5,\\"yahya@jimenez-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Elitelligence,Elitelligence,\\"Jun 21, 2019 @ 00:00:00.000\\",563016,\\"sold_product_563016_19484, sold_product_563016_11795\\",\\"sold_product_563016_19484, sold_product_563016_11795\\",\\"50, 20.984\\",\\"50, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"25.484, 10.289\\",\\"50, 20.984\\",\\"19,484, 11,795\\",\\"Summer jacket - khaki, Tracksuit bottoms - dark blue\\",\\"Summer jacket - khaki, Tracksuit bottoms - dark blue\\",\\"1, 1\\",\\"ZO0539605396, ZO0525505255\\",\\"0, 0\\",\\"50, 20.984\\",\\"50, 20.984\\",\\"0, 0\\",\\"ZO0539605396, ZO0525505255\\",71,71,2,2,order,yahya +HgMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Diane,Diane,\\"Diane Walters\\",\\"Diane Walters\\",FEMALE,22,Walters,Walters,\\"(empty)\\",Saturday,5,\\"diane@walters-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Spherecords\\",\\"Low Tide Media, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562598,\\"sold_product_562598_5045, sold_product_562598_18398\\",\\"sold_product_562598_5045, sold_product_562598_18398\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spherecords\\",\\"Low Tide Media, Spherecords\\",\\"30.594, 5.391\\",\\"60, 10.992\\",\\"5,045, 18,398\\",\\"Boots - black, Vest - black\\",\\"Boots - black, Vest - black\\",\\"1, 1\\",\\"ZO0383203832, ZO0642806428\\",\\"0, 0\\",\\"60, 10.992\\",\\"60, 10.992\\",\\"0, 0\\",\\"ZO0383203832, ZO0642806428\\",71,71,2,2,order,diane +HwMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Brigitte,Brigitte,\\"Brigitte Underwood\\",\\"Brigitte Underwood\\",FEMALE,12,Underwood,Underwood,\\"(empty)\\",Saturday,5,\\"brigitte@underwood-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563336,\\"sold_product_563336_19599, sold_product_563336_21032\\",\\"sold_product_563336_19599, sold_product_563336_21032\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"25.484, 15.648\\",\\"50, 28.984\\",\\"19,599, 21,032\\",\\"Maxi dress - Pale Violet Red, Lace-ups - black\\",\\"Maxi dress - Pale Violet Red, Lace-ups - black\\",\\"1, 1\\",\\"ZO0332903329, ZO0008300083\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0332903329, ZO0008300083\\",79,79,2,2,order,brigitte +bAMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Roberson\\",\\"Wagdi Roberson\\",MALE,15,Roberson,Roberson,\\"(empty)\\",Saturday,5,\\"wagdi@roberson-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563558,\\"sold_product_563558_21248, sold_product_563558_15382\\",\\"sold_product_563558_21248, sold_product_563558_15382\\",\\"27.984, 37\\",\\"27.984, 37\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"13.992, 19.594\\",\\"27.984, 37\\",\\"21,248, 15,382\\",\\"Windbreaker - navy blazer, Tracksuit top - mottled grey\\",\\"Windbreaker - navy blazer, Tracksuit top - mottled grey\\",\\"1, 1\\",\\"ZO0622706227, ZO0584505845\\",\\"0, 0\\",\\"27.984, 37\\",\\"27.984, 37\\",\\"0, 0\\",\\"ZO0622706227, ZO0584505845\\",65,65,2,2,order,wagdi +cwMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Holland\\",\\"Tariq Holland\\",MALE,25,Holland,Holland,\\"(empty)\\",Saturday,5,\\"tariq@holland-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Oceanavigations, Microlutions\\",\\"Oceanavigations, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563150,\\"sold_product_563150_12819, sold_product_563150_19994\\",\\"sold_product_563150_12819, sold_product_563150_19994\\",\\"24.984, 6.988\\",\\"24.984, 6.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Microlutions\\",\\"Oceanavigations, Microlutions\\",\\"11.25, 3.631\\",\\"24.984, 6.988\\",\\"12,819, 19,994\\",\\"Chinos - dark green, STAY TRUE 2 PACK - Socks - white/grey/black\\",\\"Chinos - dark green, STAY TRUE 2 PACK - Socks - white/grey/black\\",\\"1, 1\\",\\"ZO0281802818, ZO0130201302\\",\\"0, 0\\",\\"24.984, 6.988\\",\\"24.984, 6.988\\",\\"0, 0\\",\\"ZO0281802818, ZO0130201302\\",\\"31.984\\",\\"31.984\\",2,2,order,tariq +eQMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Smith\\",\\"Wilhemina St. Smith\\",FEMALE,17,Smith,Smith,\\"(empty)\\",Saturday,5,\\"wilhemina st.@smith-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises, Oceanavigations, Pyramidustries\\",\\"Tigress Enterprises, Oceanavigations, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",728845,\\"sold_product_728845_11691, sold_product_728845_23205, sold_product_728845_14170, sold_product_728845_8257\\",\\"sold_product_728845_11691, sold_product_728845_23205, sold_product_728845_14170, sold_product_728845_8257\\",\\"24.984, 65, 28.984, 13.992\\",\\"24.984, 65, 28.984, 13.992\\",\\"Women's Clothing, Women's Accessories, Women's Accessories, Women's Clothing\\",\\"Women's Clothing, Women's Accessories, Women's Accessories, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Oceanavigations, Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Oceanavigations, Tigress Enterprises, Pyramidustries\\",\\"13.492, 32.5, 13.047, 7.41\\",\\"24.984, 65, 28.984, 13.992\\",\\"11,691, 23,205, 14,170, 8,257\\",\\"Cape - grey multicolor, Handbag - black, Handbag - brown, Print T-shirt - dark grey\\",\\"Cape - grey multicolor, Handbag - black, Handbag - brown, Print T-shirt - dark grey\\",\\"1, 1, 1, 1\\",\\"ZO0082300823, ZO0306203062, ZO0094600946, ZO0158901589\\",\\"0, 0, 0, 0\\",\\"24.984, 65, 28.984, 13.992\\",\\"24.984, 65, 28.984, 13.992\\",\\"0, 0, 0, 0\\",\\"ZO0082300823, ZO0306203062, ZO0094600946, ZO0158901589\\",133,133,4,4,order,wilhemina +lQMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Craig\\",\\"Abd Craig\\",MALE,52,Craig,Craig,\\"(empty)\\",Saturday,5,\\"abd@craig-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562723,\\"sold_product_562723_15183, sold_product_562723_15983\\",\\"sold_product_562723_15183, sold_product_562723_15983\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"16.5, 11.25\\",\\"33, 24.984\\",\\"15,183, 15,983\\",\\"Shirt - blue/off white, Shirt - grey/white\\",\\"Shirt - blue/off white, Shirt - grey/white\\",\\"1, 1\\",\\"ZO0109901099, ZO0277802778\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0109901099, ZO0277802778\\",\\"57.969\\",\\"57.969\\",2,2,order,abd +lgMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Oliver,Oliver,\\"Oliver Mullins\\",\\"Oliver Mullins\\",MALE,7,Mullins,Mullins,\\"(empty)\\",Saturday,5,\\"oliver@mullins-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562745,\\"sold_product_562745_12209, sold_product_562745_15674\\",\\"sold_product_562745_12209, sold_product_562745_15674\\",\\"22.984, 28.984\\",\\"22.984, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"11.953, 14.211\\",\\"22.984, 28.984\\",\\"12,209, 15,674\\",\\"Hoodie - black/olive, Sweatshirt - black\\",\\"Hoodie - black/olive, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0541905419, ZO0628306283\\",\\"0, 0\\",\\"22.984, 28.984\\",\\"22.984, 28.984\\",\\"0, 0\\",\\"ZO0541905419, ZO0628306283\\",\\"51.969\\",\\"51.969\\",2,2,order,oliver +lwMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Perry\\",\\"Robbie Perry\\",MALE,48,Perry,Perry,\\"(empty)\\",Saturday,5,\\"robbie@perry-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562763,\\"sold_product_562763_3029, sold_product_562763_23796\\",\\"sold_product_562763_3029, sold_product_562763_23796\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"22.5, 10.063\\",\\"50, 18.984\\",\\"3,029, 23,796\\",\\"Light jacket - dark blue, Long sleeved top - mid grey multicolor\\",\\"Light jacket - dark blue, Long sleeved top - mid grey multicolor\\",\\"1, 1\\",\\"ZO0428604286, ZO0119601196\\",\\"0, 0\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"0, 0\\",\\"ZO0428604286, ZO0119601196\\",69,69,2,2,order,robbie +yAMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Mostafa,Mostafa,\\"Mostafa Graham\\",\\"Mostafa Graham\\",MALE,9,Graham,Graham,\\"(empty)\\",Saturday,5,\\"mostafa@graham-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563604,\\"sold_product_563604_11391, sold_product_563604_13058\\",\\"sold_product_563604_11391, sold_product_563604_13058\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"9, 28.203\\",\\"16.984, 60\\",\\"11,391, 13,058\\",\\"Sweatshirt - mottled grey, Lace-ups - Midnight Blue\\",\\"Sweatshirt - mottled grey, Lace-ups - Midnight Blue\\",\\"1, 1\\",\\"ZO0588005880, ZO0388703887\\",\\"0, 0\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"0, 0\\",\\"ZO0588005880, ZO0388703887\\",77,77,2,2,order,mostafa +7AMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Women's Accessories\\",\\"Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Mckenzie\\",\\"Elyssa Mckenzie\\",FEMALE,27,Mckenzie,Mckenzie,\\"(empty)\\",Saturday,5,\\"elyssa@mckenzie-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563867,\\"sold_product_563867_15363, sold_product_563867_23604\\",\\"sold_product_563867_15363, sold_product_563867_23604\\",\\"20.984, 13.992\\",\\"20.984, 13.992\\",\\"Women's Accessories, Women's Accessories\\",\\"Women's Accessories, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"10.289, 6.719\\",\\"20.984, 13.992\\",\\"15,363, 23,604\\",\\"Across body bag - red , Across body bag - rose\\",\\"Across body bag - red , Across body bag - rose\\",\\"1, 1\\",\\"ZO0097300973, ZO0196301963\\",\\"0, 0\\",\\"20.984, 13.992\\",\\"20.984, 13.992\\",\\"0, 0\\",\\"ZO0097300973, ZO0196301963\\",\\"34.969\\",\\"34.969\\",2,2,order,elyssa +AQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Clarice,Clarice,\\"Clarice Valdez\\",\\"Clarice Valdez\\",FEMALE,18,Valdez,Valdez,\\"(empty)\\",Saturday,5,\\"clarice@valdez-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563383,\\"sold_product_563383_21467, sold_product_563383_17467\\",\\"sold_product_563383_21467, sold_product_563383_17467\\",\\"60, 50\\",\\"60, 50\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"32.375, 26.484\\",\\"60, 50\\",\\"21,467, 17,467\\",\\"Lace-ups - black, Ankle boots - cognac\\",\\"Lace-ups - black, Ankle boots - cognac\\",\\"1, 1\\",\\"ZO0369103691, ZO0378603786\\",\\"0, 0\\",\\"60, 50\\",\\"60, 50\\",\\"0, 0\\",\\"ZO0369103691, ZO0378603786\\",110,110,2,2,order,clarice +AgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Abd,Abd,\\"Abd Wood\\",\\"Abd Wood\\",MALE,52,Wood,Wood,\\"(empty)\\",Saturday,5,\\"abd@wood-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563218,\\"sold_product_563218_16231, sold_product_563218_18727\\",\\"sold_product_563218_16231, sold_product_563218_18727\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"9, 5.391\\",\\"16.984, 10.992\\",\\"16,231, 18,727\\",\\"Print T-shirt - bright white, Belt - cognac \\",\\"Print T-shirt - bright white, Belt - cognac \\",\\"1, 1\\",\\"ZO0120401204, ZO0598605986\\",\\"0, 0\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"0, 0\\",\\"ZO0120401204, ZO0598605986\\",\\"27.984\\",\\"27.984\\",2,2,order,abd +TAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Betty,Betty,\\"Betty Ramsey\\",\\"Betty Ramsey\\",FEMALE,44,Ramsey,Ramsey,\\"(empty)\\",Saturday,5,\\"betty@ramsey-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563554,\\"sold_product_563554_15671, sold_product_563554_13795\\",\\"sold_product_563554_15671, sold_product_563554_13795\\",\\"70, 33\\",\\"70, 33\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"31.5, 16.5\\",\\"70, 33\\",\\"15,671, 13,795\\",\\"Ankle boots - taupe, Trousers - navy\\",\\"Ankle boots - taupe, Trousers - navy\\",\\"1, 1\\",\\"ZO0246502465, ZO0032100321\\",\\"0, 0\\",\\"70, 33\\",\\"70, 33\\",\\"0, 0\\",\\"ZO0246502465, ZO0032100321\\",103,103,2,2,order,betty +wAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,rania,rania,\\"rania Long\\",\\"rania Long\\",FEMALE,24,Long,Long,\\"(empty)\\",Saturday,5,\\"rania@long-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563023,\\"sold_product_563023_24484, sold_product_563023_21752\\",\\"sold_product_563023_24484, sold_product_563023_21752\\",\\"12.992, 13.992\\",\\"12.992, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"6.879, 6.301\\",\\"12.992, 13.992\\",\\"24,484, 21,752\\",\\"Print T-shirt - black, Pencil skirt - dark grey multicolor\\",\\"Print T-shirt - black, Pencil skirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0055100551, ZO0149701497\\",\\"0, 0\\",\\"12.992, 13.992\\",\\"12.992, 13.992\\",\\"0, 0\\",\\"ZO0055100551, ZO0149701497\\",\\"26.984\\",\\"26.984\\",2,2,order,rani +wQMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Betty,Betty,\\"Betty Webb\\",\\"Betty Webb\\",FEMALE,44,Webb,Webb,\\"(empty)\\",Saturday,5,\\"betty@webb-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563060,\\"sold_product_563060_22520, sold_product_563060_22874\\",\\"sold_product_563060_22520, sold_product_563060_22874\\",\\"42, 42\\",\\"42, 42\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"22.672, 22.672\\",\\"42, 42\\",\\"22,520, 22,874\\",\\"Summer dress - black, Across body bag - black\\",\\"Summer dress - black, Across body bag - black\\",\\"1, 1\\",\\"ZO0040600406, ZO0356503565\\",\\"0, 0\\",\\"42, 42\\",\\"42, 42\\",\\"0, 0\\",\\"ZO0040600406, ZO0356503565\\",84,84,2,2,order,betty +wgMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Phil,Phil,\\"Phil Hudson\\",\\"Phil Hudson\\",MALE,50,Hudson,Hudson,\\"(empty)\\",Saturday,5,\\"phil@hudson-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563108,\\"sold_product_563108_13510, sold_product_563108_11051\\",\\"sold_product_563108_13510, sold_product_563108_11051\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"25.484, 13.344\\",\\"50, 28.984\\",\\"13,510, 11,051\\",\\"Waistcoat - dark blue, Across body bag - brown/brown\\",\\"Waistcoat - dark blue, Across body bag - brown/brown\\",\\"1, 1\\",\\"ZO0429604296, ZO0465204652\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0429604296, ZO0465204652\\",79,79,2,2,order,phil +hAMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Selena,Selena,\\"Selena Richards\\",\\"Selena Richards\\",FEMALE,42,Richards,Richards,\\"(empty)\\",Saturday,5,\\"selena@richards-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563778,\\"sold_product_563778_15546, sold_product_563778_11477\\",\\"sold_product_563778_15546, sold_product_563778_11477\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"8.328, 11.25\\",\\"16.984, 24.984\\",\\"15,546, 11,477\\",\\"Sweatshirt - coral, Across body bag - cognac\\",\\"Sweatshirt - coral, Across body bag - cognac\\",\\"1, 1\\",\\"ZO0656606566, ZO0186001860\\",\\"0, 0\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"0, 0\\",\\"ZO0656606566, ZO0186001860\\",\\"41.969\\",\\"41.969\\",2,2,order,selena +xwMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Cortez\\",\\"Gwen Cortez\\",FEMALE,26,Cortez,Cortez,\\"(empty)\\",Saturday,5,\\"gwen@cortez-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562705,\\"sold_product_562705_12529, sold_product_562705_22843\\",\\"sold_product_562705_12529, sold_product_562705_22843\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Champion Arts\\",\\"Spherecords, Champion Arts\\",\\"5.398, 12\\",\\"11.992, 24.984\\",\\"12,529, 22,843\\",\\"Jumpsuit - black, Shirt - black denim\\",\\"Jumpsuit - black, Shirt - black denim\\",\\"1, 1\\",\\"ZO0633106331, ZO0495904959\\",\\"0, 0\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"0, 0\\",\\"ZO0633106331, ZO0495904959\\",\\"36.969\\",\\"36.969\\",2,2,order,gwen +yAMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Phil,Phil,\\"Phil Sutton\\",\\"Phil Sutton\\",MALE,50,Sutton,Sutton,\\"(empty)\\",Saturday,5,\\"phil@sutton-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563639,\\"sold_product_563639_24934, sold_product_563639_3499\\",\\"sold_product_563639_24934, sold_product_563639_3499\\",\\"50, 60\\",\\"50, 60\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"22.5, 28.203\\",\\"50, 60\\",\\"24,934, 3,499\\",\\"Lace-up boots - resin coffee, Hardshell jacket - jet black\\",\\"Lace-up boots - resin coffee, Hardshell jacket - jet black\\",\\"1, 1\\",\\"ZO0403504035, ZO0623006230\\",\\"0, 0\\",\\"50, 60\\",\\"50, 60\\",\\"0, 0\\",\\"ZO0403504035, ZO0623006230\\",110,110,2,2,order,phil +yQMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Yasmine,Yasmine,\\"Yasmine Mcdonald\\",\\"Yasmine Mcdonald\\",FEMALE,43,Mcdonald,Mcdonald,\\"(empty)\\",Saturday,5,\\"yasmine@mcdonald-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563698,\\"sold_product_563698_23206, sold_product_563698_15645\\",\\"sold_product_563698_23206, sold_product_563698_15645\\",\\"33, 11.992\\",\\"33, 11.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"15.844, 6.109\\",\\"33, 11.992\\",\\"23,206, 15,645\\",\\"Cardigan - greymulticolor/black, Scarf - green\\",\\"Cardigan - greymulticolor/black, Scarf - green\\",\\"1, 1\\",\\"ZO0070800708, ZO0084100841\\",\\"0, 0\\",\\"33, 11.992\\",\\"33, 11.992\\",\\"0, 0\\",\\"ZO0070800708, ZO0084100841\\",\\"44.969\\",\\"44.969\\",2,2,order,yasmine +MwMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Abd,Abd,\\"Abd Banks\\",\\"Abd Banks\\",MALE,52,Banks,Banks,\\"(empty)\\",Saturday,5,\\"abd@banks-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Oceanavigations, Microlutions\\",\\"Elitelligence, Oceanavigations, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",714638,\\"sold_product_714638_14544, sold_product_714638_19885, sold_product_714638_13083, sold_product_714638_17585\\",\\"sold_product_714638_14544, sold_product_714638_19885, sold_product_714638_13083, sold_product_714638_17585\\",\\"28.984, 10.992, 24.984, 33\\",\\"28.984, 10.992, 24.984, 33\\",\\"Men's Clothing, Men's Accessories, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Accessories, Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Elitelligence, Oceanavigations, Microlutions\\",\\"Elitelligence, Elitelligence, Oceanavigations, Microlutions\\",\\"13.633, 5.93, 12.25, 17.484\\",\\"28.984, 10.992, 24.984, 33\\",\\"14,544, 19,885, 13,083, 17,585\\",\\"Jumper - black, Wallet - grey/cognac, Chinos - sand, Shirt - black denim\\",\\"Jumper - black, Wallet - grey/cognac, Chinos - sand, Shirt - black denim\\",\\"1, 1, 1, 1\\",\\"ZO0576205762, ZO0602006020, ZO0281502815, ZO0111001110\\",\\"0, 0, 0, 0\\",\\"28.984, 10.992, 24.984, 33\\",\\"28.984, 10.992, 24.984, 33\\",\\"0, 0, 0, 0\\",\\"ZO0576205762, ZO0602006020, ZO0281502815, ZO0111001110\\",\\"97.938\\",\\"97.938\\",4,4,order,abd +bAMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Lloyd\\",\\"Mostafa Lloyd\\",MALE,9,Lloyd,Lloyd,\\"(empty)\\",Saturday,5,\\"mostafa@lloyd-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563602,\\"sold_product_563602_11928, sold_product_563602_13191\\",\\"sold_product_563602_11928, sold_product_563602_13191\\",\\"22.984, 50\\",\\"22.984, 50\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"11.039, 25.984\\",\\"22.984, 50\\",\\"11,928, 13,191\\",\\"Casual lace-ups - black, SOLID - Summer jacket - royal blue\\",\\"Casual lace-ups - black, SOLID - Summer jacket - royal blue\\",\\"1, 1\\",\\"ZO0508705087, ZO0427804278\\",\\"0, 0\\",\\"22.984, 50\\",\\"22.984, 50\\",\\"0, 0\\",\\"ZO0508705087, ZO0427804278\\",73,73,2,2,order,mostafa +8gMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Munoz\\",\\"Sultan Al Munoz\\",MALE,19,Munoz,Munoz,\\"(empty)\\",Saturday,5,\\"sultan al@munoz-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563054,\\"sold_product_563054_11706, sold_product_563054_13408\\",\\"sold_product_563054_11706, sold_product_563054_13408\\",\\"100, 50\\",\\"100, 50\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"49, 23\\",\\"100, 50\\",\\"11,706, 13,408\\",\\"Weekend bag - dark brown, Cowboy/Biker boots - dark brown/tan\\",\\"Weekend bag - dark brown, Cowboy/Biker boots - dark brown/tan\\",\\"1, 1\\",\\"ZO0701907019, ZO0519405194\\",\\"0, 0\\",\\"100, 50\\",\\"100, 50\\",\\"0, 0\\",\\"ZO0701907019, ZO0519405194\\",150,150,2,2,order,sultan +8wMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Abd,Abd,\\"Abd Shaw\\",\\"Abd Shaw\\",MALE,52,Shaw,Shaw,\\"(empty)\\",Saturday,5,\\"abd@shaw-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563093,\\"sold_product_563093_18385, sold_product_563093_16783\\",\\"sold_product_563093_18385, sold_product_563093_16783\\",\\"7.988, 42\\",\\"7.988, 42\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"4.07, 20.156\\",\\"7.988, 42\\",\\"18,385, 16,783\\",\\"Basic T-shirt - dark grey multicolor, Weekend bag - black\\",\\"Basic T-shirt - dark grey multicolor, Weekend bag - black\\",\\"1, 1\\",\\"ZO0435004350, ZO0472104721\\",\\"0, 0\\",\\"7.988, 42\\",\\"7.988, 42\\",\\"0, 0\\",\\"ZO0435004350, ZO0472104721\\",\\"49.969\\",\\"49.969\\",2,2,order,abd +IQMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Ryan\\",\\"Pia Ryan\\",FEMALE,45,Ryan,Ryan,\\"(empty)\\",Saturday,5,\\"pia@ryan-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562875,\\"sold_product_562875_19166, sold_product_562875_21969\\",\\"sold_product_562875_19166, sold_product_562875_21969\\",\\"60, 7.988\\",\\"60, 7.988\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Spherecords\\",\\"Gnomehouse, Spherecords\\",\\"29.406, 3.68\\",\\"60, 7.988\\",\\"19,166, 21,969\\",\\"Cardigan - camel, Vest - bordeaux\\",\\"Cardigan - camel, Vest - bordeaux\\",\\"1, 1\\",\\"ZO0353003530, ZO0637006370\\",\\"0, 0\\",\\"60, 7.988\\",\\"60, 7.988\\",\\"0, 0\\",\\"ZO0353003530, ZO0637006370\\",68,68,2,2,order,pia +IgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Brigitte,Brigitte,\\"Brigitte Holland\\",\\"Brigitte Holland\\",FEMALE,12,Holland,Holland,\\"(empty)\\",Saturday,5,\\"brigitte@holland-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Primemaster, Pyramidustries\\",\\"Primemaster, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562914,\\"sold_product_562914_16495, sold_product_562914_16949\\",\\"sold_product_562914_16495, sold_product_562914_16949\\",\\"75, 13.992\\",\\"75, 13.992\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Primemaster, Pyramidustries\\",\\"Primemaster, Pyramidustries\\",\\"39.75, 6.859\\",\\"75, 13.992\\",\\"16,495, 16,949\\",\\"Sandals - nuvola, Scarf - bordeaux/mustard\\",\\"Sandals - nuvola, Scarf - bordeaux/mustard\\",\\"1, 1\\",\\"ZO0360503605, ZO0194501945\\",\\"0, 0\\",\\"75, 13.992\\",\\"75, 13.992\\",\\"0, 0\\",\\"ZO0360503605, ZO0194501945\\",89,89,2,2,order,brigitte +IwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Bailey\\",\\"Brigitte Bailey\\",FEMALE,12,Bailey,Bailey,\\"(empty)\\",Saturday,5,\\"brigitte@bailey-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562654,\\"sold_product_562654_13316, sold_product_562654_13303\\",\\"sold_product_562654_13316, sold_product_562654_13303\\",\\"24.984, 10.992\\",\\"24.984, 10.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"12, 5.602\\",\\"24.984, 10.992\\",\\"13,316, 13,303\\",\\"Blouse - black, Print T-shirt - white\\",\\"Blouse - black, Print T-shirt - white\\",\\"1, 1\\",\\"ZO0065400654, ZO0158701587\\",\\"0, 0\\",\\"24.984, 10.992\\",\\"24.984, 10.992\\",\\"0, 0\\",\\"ZO0065400654, ZO0158701587\\",\\"35.969\\",\\"35.969\\",2,2,order,brigitte +JQMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Betty,Betty,\\"Betty Massey\\",\\"Betty Massey\\",FEMALE,44,Massey,Massey,\\"(empty)\\",Saturday,5,\\"betty@massey-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563860,\\"sold_product_563860_17204, sold_product_563860_5970\\",\\"sold_product_563860_17204, sold_product_563860_5970\\",\\"33, 33\\",\\"33, 33\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"17.156, 15.844\\",\\"33, 33\\",\\"17,204, 5,970\\",\\"Blouse - potent purple, Wedge boots - toffee\\",\\"Blouse - potent purple, Wedge boots - toffee\\",\\"1, 1\\",\\"ZO0344703447, ZO0031000310\\",\\"0, 0\\",\\"33, 33\\",\\"33, 33\\",\\"0, 0\\",\\"ZO0344703447, ZO0031000310\\",66,66,2,2,order,betty +JgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Rivera\\",\\"Yasmine Rivera\\",FEMALE,43,Rivera,Rivera,\\"(empty)\\",Saturday,5,\\"yasmine@rivera-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563907,\\"sold_product_563907_11709, sold_product_563907_20859\\",\\"sold_product_563907_11709, sold_product_563907_20859\\",\\"20.984, 18.984\\",\\"20.984, 18.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"11.328, 10.063\\",\\"20.984, 18.984\\",\\"11,709, 20,859\\",\\"Jersey dress - black, Long sleeved top - navy\\",\\"Jersey dress - black, Long sleeved top - navy\\",\\"1, 1\\",\\"ZO0036700367, ZO0054300543\\",\\"0, 0\\",\\"20.984, 18.984\\",\\"20.984, 18.984\\",\\"0, 0\\",\\"ZO0036700367, ZO0054300543\\",\\"39.969\\",\\"39.969\\",2,2,order,yasmine +QQMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Youssef,Youssef,\\"Youssef Conner\\",\\"Youssef Conner\\",MALE,31,Conner,Conner,\\"(empty)\\",Saturday,5,\\"youssef@conner-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562833,\\"sold_product_562833_21511, sold_product_562833_14742\\",\\"sold_product_562833_21511, sold_product_562833_14742\\",\\"13.992, 33\\",\\"13.992, 33\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"7.41, 15.18\\",\\"13.992, 33\\",\\"21,511, 14,742\\",\\"3 PACK - Shorts - black, Laptop bag - brown\\",\\"3 PACK - Shorts - black, Laptop bag - brown\\",\\"1, 1\\",\\"ZO0610806108, ZO0316803168\\",\\"0, 0\\",\\"13.992, 33\\",\\"13.992, 33\\",\\"0, 0\\",\\"ZO0610806108, ZO0316803168\\",\\"46.969\\",\\"46.969\\",2,2,order,youssef +QgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Soto\\",\\"Abd Soto\\",MALE,52,Soto,Soto,\\"(empty)\\",Saturday,5,\\"abd@soto-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562899,\\"sold_product_562899_21057, sold_product_562899_13717\\",\\"sold_product_562899_21057, sold_product_562899_13717\\",\\"13.992, 28.984\\",\\"13.992, 28.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"6.859, 15.359\\",\\"13.992, 28.984\\",\\"21,057, 13,717\\",\\"Scarf - navy/grey, Tracksuit top - blue\\",\\"Scarf - navy/grey, Tracksuit top - blue\\",\\"1, 1\\",\\"ZO0313403134, ZO0587105871\\",\\"0, 0\\",\\"13.992, 28.984\\",\\"13.992, 28.984\\",\\"0, 0\\",\\"ZO0313403134, ZO0587105871\\",\\"42.969\\",\\"42.969\\",2,2,order,abd +QwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al Soto\\",\\"Ahmed Al Soto\\",MALE,4,Soto,Soto,\\"(empty)\\",Saturday,5,\\"ahmed al@soto-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Elitelligence, Spherecords\\",\\"Elitelligence, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562665,\\"sold_product_562665_15130, sold_product_562665_14446\\",\\"sold_product_562665_15130, sold_product_562665_14446\\",\\"11.992, 8.992\\",\\"11.992, 8.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spherecords\\",\\"Elitelligence, Spherecords\\",\\"6.469, 4.578\\",\\"11.992, 8.992\\",\\"15,130, 14,446\\",\\"Long sleeved top - white, 5 PACK - Socks - dark grey\\",\\"Long sleeved top - white, 5 PACK - Socks - dark grey\\",\\"1, 1\\",\\"ZO0569205692, ZO0664006640\\",\\"0, 0\\",\\"11.992, 8.992\\",\\"11.992, 8.992\\",\\"0, 0\\",\\"ZO0569205692, ZO0664006640\\",\\"20.984\\",\\"20.984\\",2,2,order,ahmed +RwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Mostafa,Mostafa,\\"Mostafa Clayton\\",\\"Mostafa Clayton\\",MALE,9,Clayton,Clayton,\\"(empty)\\",Saturday,5,\\"mostafa@clayton-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563579,\\"sold_product_563579_12028, sold_product_563579_14742\\",\\"sold_product_563579_12028, sold_product_563579_14742\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"3.92, 15.18\\",\\"7.988, 33\\",\\"12,028, 14,742\\",\\"Vest - light blue multicolor, Laptop bag - brown\\",\\"Vest - light blue multicolor, Laptop bag - brown\\",\\"1, 1\\",\\"ZO0548905489, ZO0316803168\\",\\"0, 0\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"0, 0\\",\\"ZO0548905489, ZO0316803168\\",\\"40.969\\",\\"40.969\\",2,2,order,mostafa +SAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Chandler\\",\\"Elyssa Chandler\\",FEMALE,27,Chandler,Chandler,\\"(empty)\\",Saturday,5,\\"elyssa@chandler-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563119,\\"sold_product_563119_22794, sold_product_563119_23300\\",\\"sold_product_563119_22794, sold_product_563119_23300\\",\\"100, 35\\",\\"100, 35\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Low Tide Media, Tigress Enterprises\\",\\"46, 16.453\\",\\"100, 35\\",\\"22,794, 23,300\\",\\"Boots - Midnight Blue, Shift dress - black\\",\\"Boots - Midnight Blue, Shift dress - black\\",\\"1, 1\\",\\"ZO0374603746, ZO0041300413\\",\\"0, 0\\",\\"100, 35\\",\\"100, 35\\",\\"0, 0\\",\\"ZO0374603746, ZO0041300413\\",135,135,2,2,order,elyssa +SQMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Accessories, Women's Accessories\\",\\"Men's Accessories, Women's Accessories\\",EUR,Recip,Recip,\\"Recip Gilbert\\",\\"Recip Gilbert\\",MALE,10,Gilbert,Gilbert,\\"(empty)\\",Saturday,5,\\"recip@gilbert-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,Elitelligence,Elitelligence,\\"Jun 21, 2019 @ 00:00:00.000\\",563152,\\"sold_product_563152_22166, sold_product_563152_14897\\",\\"sold_product_563152_22166, sold_product_563152_14897\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"Men's Accessories, Women's Accessories\\",\\"Men's Accessories, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"6.469, 12.992\\",\\"11.992, 24.984\\",\\"22,166, 14,897\\",\\"Scarf - navy/turqoise, Rucksack - olive \\",\\"Scarf - navy/turqoise, Rucksack - olive \\",\\"1, 1\\",\\"ZO0603606036, ZO0608206082\\",\\"0, 0\\",\\"11.992, 24.984\\",\\"11.992, 24.984\\",\\"0, 0\\",\\"ZO0603606036, ZO0608206082\\",\\"36.969\\",\\"36.969\\",2,2,order,recip +dwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Chandler\\",\\"Wilhemina St. Chandler\\",FEMALE,17,Chandler,Chandler,\\"(empty)\\",Saturday,5,\\"wilhemina st.@chandler-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",725079,\\"sold_product_725079_18356, sold_product_725079_16691, sold_product_725079_9233, sold_product_725079_13733\\",\\"sold_product_725079_18356, sold_product_725079_16691, sold_product_725079_9233, sold_product_725079_13733\\",\\"10.992, 20.984, 42, 14.992\\",\\"10.992, 20.984, 42, 14.992\\",\\"Women's Clothing, Women's Accessories, Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories, Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spherecords, Tigress Enterprises, Tigress Enterprises, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises, Tigress Enterprises, Tigress Enterprises\\",\\"5.391, 10.492, 22.672, 7.641\\",\\"10.992, 20.984, 42, 14.992\\",\\"18,356, 16,691, 9,233, 13,733\\",\\"2 PACK - Vest - white/white, Across body bag - black, Jumper - grey multicolor, Scarf - mint\\",\\"2 PACK - Vest - white/white, Across body bag - black, Jumper - grey multicolor, Scarf - mint\\",\\"1, 1, 1, 1\\",\\"ZO0641506415, ZO0086200862, ZO0071500715, ZO0085700857\\",\\"0, 0, 0, 0\\",\\"10.992, 20.984, 42, 14.992\\",\\"10.992, 20.984, 42, 14.992\\",\\"0, 0, 0, 0\\",\\"ZO0641506415, ZO0086200862, ZO0071500715, ZO0085700857\\",\\"88.938\\",\\"88.938\\",4,4,order,wilhemina +kQMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Robbie,Robbie,\\"Robbie Harvey\\",\\"Robbie Harvey\\",MALE,48,Harvey,Harvey,\\"(empty)\\",Saturday,5,\\"robbie@harvey-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563736,\\"sold_product_563736_22302, sold_product_563736_14502\\",\\"sold_product_563736_22302, sold_product_563736_14502\\",\\"28.984, 15.992\\",\\"28.984, 15.992\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"13.633, 7.84\\",\\"28.984, 15.992\\",\\"22,302, 14,502\\",\\"Shirt - white, Belt - black\\",\\"Shirt - white, Belt - black\\",\\"1, 1\\",\\"ZO0415604156, ZO0461704617\\",\\"0, 0\\",\\"28.984, 15.992\\",\\"28.984, 15.992\\",\\"0, 0\\",\\"ZO0415604156, ZO0461704617\\",\\"44.969\\",\\"44.969\\",2,2,order,robbie +kgMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Bryant\\",\\"Stephanie Bryant\\",FEMALE,6,Bryant,Bryant,\\"(empty)\\",Saturday,5,\\"stephanie@bryant-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563761,\\"sold_product_563761_13657, sold_product_563761_15397\\",\\"sold_product_563761_13657, sold_product_563761_15397\\",\\"33, 42\\",\\"33, 42\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"15.844, 20.156\\",\\"33, 42\\",\\"13,657, 15,397\\",\\"Tote bag - black, A-line skirt - coronet blue\\",\\"Tote bag - black, A-line skirt - coronet blue\\",\\"1, 1\\",\\"ZO0087700877, ZO0330603306\\",\\"0, 0\\",\\"33, 42\\",\\"33, 42\\",\\"0, 0\\",\\"ZO0087700877, ZO0330603306\\",75,75,2,2,order,stephanie +kwMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Jackson\\",\\"Gwen Jackson\\",FEMALE,26,Jackson,Jackson,\\"(empty)\\",Saturday,5,\\"gwen@jackson-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563800,\\"sold_product_563800_19249, sold_product_563800_20352\\",\\"sold_product_563800_19249, sold_product_563800_20352\\",\\"85, 11.992\\",\\"85, 11.992\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Pyramidustries\\",\\"Oceanavigations, Pyramidustries\\",\\"41.656, 6\\",\\"85, 11.992\\",\\"19,249, 20,352\\",\\"Handbag - black, Vest - red\\",\\"Handbag - black, Vest - red\\",\\"1, 1\\",\\"ZO0307303073, ZO0161601616\\",\\"0, 0\\",\\"85, 11.992\\",\\"85, 11.992\\",\\"0, 0\\",\\"ZO0307303073, ZO0161601616\\",97,97,2,2,order,gwen +\\"-AMtOW0BH63Xcmy4524Z\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Austin\\",\\"Eddie Austin\\",MALE,38,Austin,Austin,\\"(empty)\\",Saturday,5,\\"eddie@austin-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Oceanavigations,Oceanavigations,\\"Jun 21, 2019 @ 00:00:00.000\\",563822,\\"sold_product_563822_13869, sold_product_563822_12632\\",\\"sold_product_563822_13869, sold_product_563822_12632\\",\\"13.992, 50\\",\\"13.992, 50\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"6.859, 26.484\\",\\"13.992, 50\\",\\"13,869, 12,632\\",\\"Tie - black, Down jacket - black\\",\\"Tie - black, Down jacket - black\\",\\"1, 1\\",\\"ZO0277402774, ZO0288502885\\",\\"0, 0\\",\\"13.992, 50\\",\\"13.992, 50\\",\\"0, 0\\",\\"ZO0277402774, ZO0288502885\\",\\"63.969\\",\\"63.969\\",2,2,order,eddie +GQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Oliver,Oliver,\\"Oliver Hansen\\",\\"Oliver Hansen\\",MALE,7,Hansen,Hansen,\\"(empty)\\",Saturday,5,\\"oliver@hansen-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562948,\\"sold_product_562948_23445, sold_product_562948_17355\\",\\"sold_product_562948_23445, sold_product_562948_17355\\",\\"28.984, 7.988\\",\\"28.984, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"13.633, 4\\",\\"28.984, 7.988\\",\\"23,445, 17,355\\",\\"Chinos - navy, Print T-shirt - white\\",\\"Chinos - navy, Print T-shirt - white\\",\\"1, 1\\",\\"ZO0282102821, ZO0554405544\\",\\"0, 0\\",\\"28.984, 7.988\\",\\"28.984, 7.988\\",\\"0, 0\\",\\"ZO0282102821, ZO0554405544\\",\\"36.969\\",\\"36.969\\",2,2,order,oliver +GgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Frances,Frances,\\"Frances Moran\\",\\"Frances Moran\\",FEMALE,49,Moran,Moran,\\"(empty)\\",Saturday,5,\\"frances@moran-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562993,\\"sold_product_562993_17227, sold_product_562993_17918\\",\\"sold_product_562993_17227, sold_product_562993_17918\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"27.594, 6.23\\",\\"60, 11.992\\",\\"17,227, 17,918\\",\\"Trainers - bianco, Basic T-shirt - lilac\\",\\"Trainers - bianco, Basic T-shirt - lilac\\",\\"1, 1\\",\\"ZO0255202552, ZO0560005600\\",\\"0, 0\\",\\"60, 11.992\\",\\"60, 11.992\\",\\"0, 0\\",\\"ZO0255202552, ZO0560005600\\",72,72,2,2,order,frances +HAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Morrison\\",\\"Sonya Morrison\\",FEMALE,28,Morrison,Morrison,\\"(empty)\\",Saturday,5,\\"sonya@morrison-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562585,\\"sold_product_562585_16665, sold_product_562585_8623\\",\\"sold_product_562585_16665, sold_product_562585_8623\\",\\"20.984, 17.984\\",\\"20.984, 17.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"11.539, 8.102\\",\\"20.984, 17.984\\",\\"16,665, 8,623\\",\\"Vest - black, Long sleeved top - red ochre\\",\\"Vest - black, Long sleeved top - red ochre\\",\\"1, 1\\",\\"ZO0063800638, ZO0165301653\\",\\"0, 0\\",\\"20.984, 17.984\\",\\"20.984, 17.984\\",\\"0, 0\\",\\"ZO0063800638, ZO0165301653\\",\\"38.969\\",\\"38.969\\",2,2,order,sonya +HQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Diane,Diane,\\"Diane Ball\\",\\"Diane Ball\\",FEMALE,22,Ball,Ball,\\"(empty)\\",Saturday,5,\\"diane@ball-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563326,\\"sold_product_563326_22030, sold_product_563326_23066\\",\\"sold_product_563326_22030, sold_product_563326_23066\\",\\"42, 85\\",\\"42, 85\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"21.406, 44.188\\",\\"42, 85\\",\\"22,030, 23,066\\",\\"Blouse - black, Lace-up boots - black\\",\\"Blouse - black, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0266702667, ZO0680306803\\",\\"0, 0\\",\\"42, 85\\",\\"42, 85\\",\\"0, 0\\",\\"ZO0266702667, ZO0680306803\\",127,127,2,2,order,diane +JQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Fletcher\\",\\"Stephanie Fletcher\\",FEMALE,6,Fletcher,Fletcher,\\"(empty)\\",Saturday,5,\\"stephanie@fletcher-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563755,\\"sold_product_563755_13226, sold_product_563755_12114\\",\\"sold_product_563755_13226, sold_product_563755_12114\\",\\"16.984, 29.984\\",\\"16.984, 29.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"Spherecords Curvy, Tigress Enterprises\\",\\"8.828, 16.188\\",\\"16.984, 29.984\\",\\"13,226, 12,114\\",\\"Blouse - offwhite, Jersey dress - black/white\\",\\"Blouse - offwhite, Jersey dress - black/white\\",\\"1, 1\\",\\"ZO0710707107, ZO0038300383\\",\\"0, 0\\",\\"16.984, 29.984\\",\\"16.984, 29.984\\",\\"0, 0\\",\\"ZO0710707107, ZO0038300383\\",\\"46.969\\",\\"46.969\\",2,2,order,stephanie +TwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories, Men's Shoes\\",\\"Men's Clothing, Men's Accessories, Men's Shoes\\",EUR,Abd,Abd,\\"Abd Hopkins\\",\\"Abd Hopkins\\",MALE,52,Hopkins,Hopkins,\\"(empty)\\",Saturday,5,\\"abd@hopkins-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Oceanavigations, Spherecords\\",\\"Low Tide Media, Oceanavigations, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",715450,\\"sold_product_715450_13559, sold_product_715450_21852, sold_product_715450_16570, sold_product_715450_11336\\",\\"sold_product_715450_13559, sold_product_715450_21852, sold_product_715450_16570, sold_product_715450_11336\\",\\"13.992, 20.984, 65, 10.992\\",\\"13.992, 20.984, 65, 10.992\\",\\"Men's Clothing, Men's Accessories, Men's Shoes, Men's Clothing\\",\\"Men's Clothing, Men's Accessories, Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Low Tide Media, Oceanavigations, Spherecords\\",\\"Low Tide Media, Low Tide Media, Oceanavigations, Spherecords\\",\\"6.441, 10.078, 31.844, 5.059\\",\\"13.992, 20.984, 65, 10.992\\",\\"13,559, 21,852, 16,570, 11,336\\",\\"3 PACK - Shorts - light blue/dark blue/white, Wallet - brown, Boots - navy, Long sleeved top - white/black\\",\\"3 PACK - Shorts - light blue/dark blue/white, Wallet - brown, Boots - navy, Long sleeved top - white/black\\",\\"1, 1, 1, 1\\",\\"ZO0476604766, ZO0462404624, ZO0258302583, ZO0658206582\\",\\"0, 0, 0, 0\\",\\"13.992, 20.984, 65, 10.992\\",\\"13.992, 20.984, 65, 10.992\\",\\"0, 0, 0, 0\\",\\"ZO0476604766, ZO0462404624, ZO0258302583, ZO0658206582\\",\\"110.938\\",\\"110.938\\",4,4,order,abd +dgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Boone\\",\\"Abdulraheem Al Boone\\",MALE,33,Boone,Boone,\\"(empty)\\",Saturday,5,\\"abdulraheem al@boone-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Oceanavigations,Oceanavigations,\\"Jun 21, 2019 @ 00:00:00.000\\",563181,\\"sold_product_563181_15447, sold_product_563181_19692\\",\\"sold_product_563181_15447, sold_product_563181_19692\\",\\"50, 13.992\\",\\"50, 13.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"24.5, 6.859\\",\\"50, 13.992\\",\\"15,447, 19,692\\",\\"Suit jacket - grey, Print T-shirt - black\\",\\"Suit jacket - grey, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0274902749, ZO0293902939\\",\\"0, 0\\",\\"50, 13.992\\",\\"50, 13.992\\",\\"0, 0\\",\\"ZO0274902749, ZO0293902939\\",\\"63.969\\",\\"63.969\\",2,2,order,abdulraheem +jQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Diane,Diane,\\"Diane Graves\\",\\"Diane Graves\\",FEMALE,22,Graves,Graves,\\"(empty)\\",Saturday,5,\\"diane@graves-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563131,\\"sold_product_563131_15426, sold_product_563131_21432\\",\\"sold_product_563131_15426, sold_product_563131_21432\\",\\"75, 20.984\\",\\"75, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"39, 11.539\\",\\"75, 20.984\\",\\"15,426, 21,432\\",\\"Cowboy/Biker boots - black, Blouse - peacoat\\",\\"Cowboy/Biker boots - black, Blouse - peacoat\\",\\"1, 1\\",\\"ZO0326803268, ZO0059600596\\",\\"0, 0\\",\\"75, 20.984\\",\\"75, 20.984\\",\\"0, 0\\",\\"ZO0326803268, ZO0059600596\\",96,96,2,2,order,diane +0gMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Wood\\",\\"Selena Wood\\",FEMALE,42,Wood,Wood,\\"(empty)\\",Saturday,5,\\"selena@wood-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563254,\\"sold_product_563254_23719, sold_product_563254_11095\\",\\"sold_product_563254_23719, sold_product_563254_11095\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Champion Arts\\",\\"13.922, 9.867\\",\\"28.984, 20.984\\",\\"23,719, 11,095\\",\\"Jersey dress - peacoat, Tracksuit top - pink multicolor\\",\\"Jersey dress - peacoat, Tracksuit top - pink multicolor\\",\\"1, 1\\",\\"ZO0052100521, ZO0498804988\\",\\"0, 0\\",\\"28.984, 20.984\\",\\"28.984, 20.984\\",\\"0, 0\\",\\"ZO0052100521, ZO0498804988\\",\\"49.969\\",\\"49.969\\",2,2,order,selena +OQMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Brigitte,Brigitte,\\"Brigitte Tran\\",\\"Brigitte Tran\\",FEMALE,12,Tran,Tran,\\"(empty)\\",Saturday,5,\\"brigitte@tran-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563573,\\"sold_product_563573_22735, sold_product_563573_23822\\",\\"sold_product_563573_22735, sold_product_563573_23822\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Oceanavigations\\",\\"Pyramidustries, Oceanavigations\\",\\"13.742, 32.375\\",\\"24.984, 60\\",\\"22,735, 23,822\\",\\"Platform heels - black, Sandals - Midnight Blue\\",\\"Platform heels - black, Sandals - Midnight Blue\\",\\"1, 1\\",\\"ZO0132601326, ZO0243002430\\",\\"0, 0\\",\\"24.984, 60\\",\\"24.984, 60\\",\\"0, 0\\",\\"ZO0132601326, ZO0243002430\\",85,85,2,2,order,brigitte +VwMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Thad,Thad,\\"Thad Chapman\\",\\"Thad Chapman\\",MALE,30,Chapman,Chapman,\\"(empty)\\",Saturday,5,\\"thad@chapman-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562699,\\"sold_product_562699_24934, sold_product_562699_20799\\",\\"sold_product_562699_24934, sold_product_562699_20799\\",\\"50, 14.992\\",\\"50, 14.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"22.5, 7.5\\",\\"50, 14.992\\",\\"24,934, 20,799\\",\\"Lace-up boots - resin coffee, Long sleeved top - white/black\\",\\"Lace-up boots - resin coffee, Long sleeved top - white/black\\",\\"1, 1\\",\\"ZO0403504035, ZO0558905589\\",\\"0, 0\\",\\"50, 14.992\\",\\"50, 14.992\\",\\"0, 0\\",\\"ZO0403504035, ZO0558905589\\",65,65,2,2,order,thad +WAMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Accessories\\",\\"Men's Accessories\\",EUR,Tariq,Tariq,\\"Tariq Rivera\\",\\"Tariq Rivera\\",MALE,25,Rivera,Rivera,\\"(empty)\\",Saturday,5,\\"tariq@rivera-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563644,\\"sold_product_563644_20541, sold_product_563644_14121\\",\\"sold_product_563644_20541, sold_product_563644_14121\\",\\"90, 17.984\\",\\"90, 17.984\\",\\"Men's Accessories, Men's Accessories\\",\\"Men's Accessories, Men's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"44.094, 9.172\\",\\"90, 17.984\\",\\"20,541, 14,121\\",\\"Laptop bag - Dark Sea Green, Watch - grey\\",\\"Laptop bag - Dark Sea Green, Watch - grey\\",\\"1, 1\\",\\"ZO0470104701, ZO0600506005\\",\\"0, 0\\",\\"90, 17.984\\",\\"90, 17.984\\",\\"0, 0\\",\\"ZO0470104701, ZO0600506005\\",108,108,2,2,order,tariq +WQMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Eddie,Eddie,\\"Eddie Davidson\\",\\"Eddie Davidson\\",MALE,38,Davidson,Davidson,\\"(empty)\\",Saturday,5,\\"eddie@davidson-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563701,\\"sold_product_563701_20743, sold_product_563701_23294\\",\\"sold_product_563701_20743, sold_product_563701_23294\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"11.75, 15.938\\",\\"24.984, 28.984\\",\\"20,743, 23,294\\",\\"Slim fit jeans - grey, Tracksuit bottoms - dark blue\\",\\"Slim fit jeans - grey, Tracksuit bottoms - dark blue\\",\\"1, 1\\",\\"ZO0536305363, ZO0282702827\\",\\"0, 0\\",\\"24.984, 28.984\\",\\"24.984, 28.984\\",\\"0, 0\\",\\"ZO0536305363, ZO0282702827\\",\\"53.969\\",\\"53.969\\",2,2,order,eddie +ZQMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al Frank\\",\\"Ahmed Al Frank\\",MALE,4,Frank,Frank,\\"(empty)\\",Saturday,5,\\"ahmed al@frank-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562817,\\"sold_product_562817_1438, sold_product_562817_22804\\",\\"sold_product_562817_1438, sold_product_562817_22804\\",\\"60, 29.984\\",\\"60, 29.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"32.375, 15.891\\",\\"60, 29.984\\",\\"1,438, 22,804\\",\\"Trainers - black, Bomber Jacket - navy\\",\\"Trainers - black, Bomber Jacket - navy\\",\\"1, 1\\",\\"ZO0254702547, ZO0457804578\\",\\"0, 0\\",\\"60, 29.984\\",\\"60, 29.984\\",\\"0, 0\\",\\"ZO0254702547, ZO0457804578\\",90,90,2,2,order,ahmed +ZgMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Stokes\\",\\"Stephanie Stokes\\",FEMALE,6,Stokes,Stokes,\\"(empty)\\",Saturday,5,\\"stephanie@stokes-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562881,\\"sold_product_562881_20244, sold_product_562881_21108\\",\\"sold_product_562881_20244, sold_product_562881_21108\\",\\"28.984, 9.992\\",\\"28.984, 9.992\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"15.359, 5\\",\\"28.984, 9.992\\",\\"20,244, 21,108\\",\\"Handbag - black, Jersey dress - black\\",\\"Handbag - black, Jersey dress - black\\",\\"1, 1\\",\\"ZO0091700917, ZO0635406354\\",\\"0, 0\\",\\"28.984, 9.992\\",\\"28.984, 9.992\\",\\"0, 0\\",\\"ZO0091700917, ZO0635406354\\",\\"38.969\\",\\"38.969\\",2,2,order,stephanie +ZwMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Brigitte,Brigitte,\\"Brigitte Sherman\\",\\"Brigitte Sherman\\",FEMALE,12,Sherman,Sherman,\\"(empty)\\",Saturday,5,\\"brigitte@sherman-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562630,\\"sold_product_562630_18015, sold_product_562630_15858\\",\\"sold_product_562630_18015, sold_product_562630_15858\\",\\"60, 24.984\\",\\"60, 24.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"30, 13.492\\",\\"60, 24.984\\",\\"18,015, 15,858\\",\\"Summer dress - blue fog, Slip-ons - gold\\",\\"Summer dress - blue fog, Slip-ons - gold\\",\\"1, 1\\",\\"ZO0339803398, ZO0009700097\\",\\"0, 0\\",\\"60, 24.984\\",\\"60, 24.984\\",\\"0, 0\\",\\"ZO0339803398, ZO0009700097\\",85,85,2,2,order,brigitte +aAMtOW0BH63Xcmy453AZ,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Hicham,Hicham,\\"Hicham Hudson\\",\\"Hicham Hudson\\",MALE,8,Hudson,Hudson,\\"(empty)\\",Saturday,5,\\"hicham@hudson-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Spherecords, Elitelligence\\",\\"Spherecords, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562667,\\"sold_product_562667_21772, sold_product_562667_1559\\",\\"sold_product_562667_21772, sold_product_562667_1559\\",\\"8.992, 33\\",\\"8.992, 33\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Elitelligence\\",\\"Spherecords, Elitelligence\\",\\"4.672, 17.813\\",\\"8.992, 33\\",\\"21,772, 1,559\\",\\"3 PACK - Socks - white, Lace-ups - light brown\\",\\"3 PACK - Socks - white, Lace-ups - light brown\\",\\"1, 1\\",\\"ZO0664706647, ZO0506005060\\",\\"0, 0\\",\\"8.992, 33\\",\\"8.992, 33\\",\\"0, 0\\",\\"ZO0664706647, ZO0506005060\\",\\"41.969\\",\\"41.969\\",2,2,order,hicham +jQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Palmer\\",\\"Abd Palmer\\",MALE,52,Palmer,Palmer,\\"(empty)\\",Saturday,5,\\"abd@palmer-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563342,\\"sold_product_563342_24934, sold_product_563342_21049\\",\\"sold_product_563342_24934, sold_product_563342_21049\\",\\"50, 14.992\\",\\"50, 14.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"22.5, 7.941\\",\\"50, 14.992\\",\\"24,934, 21,049\\",\\"Lace-up boots - resin coffee, Print T-shirt - dark grey\\",\\"Lace-up boots - resin coffee, Print T-shirt - dark grey\\",\\"1, 1\\",\\"ZO0403504035, ZO0121101211\\",\\"0, 0\\",\\"50, 14.992\\",\\"50, 14.992\\",\\"0, 0\\",\\"ZO0403504035, ZO0121101211\\",65,65,2,2,order,abd +mgMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Hansen\\",\\"Jackson Hansen\\",MALE,13,Hansen,Hansen,\\"(empty)\\",Saturday,5,\\"jackson@hansen-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563366,\\"sold_product_563366_13189, sold_product_563366_18905\\",\\"sold_product_563366_13189, sold_product_563366_18905\\",\\"33, 42\\",\\"33, 42\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"17.156, 20.156\\",\\"33, 42\\",\\"13,189, 18,905\\",\\"Smart lace-ups - black , Light jacket - khaki\\",\\"Smart lace-ups - black , Light jacket - khaki\\",\\"1, 1\\",\\"ZO0388103881, ZO0540005400\\",\\"0, 0\\",\\"33, 42\\",\\"33, 42\\",\\"0, 0\\",\\"ZO0388103881, ZO0540005400\\",75,75,2,2,order,jackson +oAMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Recip,Recip,\\"Recip Webb\\",\\"Recip Webb\\",MALE,10,Webb,Webb,\\"(empty)\\",Saturday,5,\\"recip@webb-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562919,\\"sold_product_562919_24934, sold_product_562919_22599\\",\\"sold_product_562919_24934, sold_product_562919_22599\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"22.5, 11.5\\",\\"50, 24.984\\",\\"24,934, 22,599\\",\\"Lace-up boots - resin coffee, Sweatshirt - black\\",\\"Lace-up boots - resin coffee, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0403504035, ZO0595005950\\",\\"0, 0\\",\\"50, 24.984\\",\\"50, 24.984\\",\\"0, 0\\",\\"ZO0403504035, ZO0595005950\\",75,75,2,2,order,recip +oQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Hicham,Hicham,\\"Hicham Sutton\\",\\"Hicham Sutton\\",MALE,8,Sutton,Sutton,\\"(empty)\\",Saturday,5,\\"hicham@sutton-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562976,\\"sold_product_562976_23426, sold_product_562976_1978\\",\\"sold_product_562976_23426, sold_product_562976_1978\\",\\"33, 50\\",\\"33, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"16.813, 27.484\\",\\"33, 50\\",\\"23,426, 1,978\\",\\"Slim fit jeans - navy coated , Lace-up boots - black\\",\\"Slim fit jeans - navy coated , Lace-up boots - black\\",\\"1, 1\\",\\"ZO0426904269, ZO0520305203\\",\\"0, 0\\",\\"33, 50\\",\\"33, 50\\",\\"0, 0\\",\\"ZO0426904269, ZO0520305203\\",83,83,2,2,order,hicham +sgMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Barber\\",\\"Elyssa Barber\\",FEMALE,27,Barber,Barber,\\"(empty)\\",Saturday,5,\\"elyssa@barber-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563371,\\"sold_product_563371_16009, sold_product_563371_24465\\",\\"sold_product_563371_16009, sold_product_563371_24465\\",\\"30.984, 24.984\\",\\"30.984, 24.984\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"16.734, 11.5\\",\\"30.984, 24.984\\",\\"16,009, 24,465\\",\\"Handbag - black, Cowboy/Biker boots - black\\",\\"Handbag - black, Cowboy/Biker boots - black\\",\\"1, 1\\",\\"ZO0097500975, ZO0017100171\\",\\"0, 0\\",\\"30.984, 24.984\\",\\"30.984, 24.984\\",\\"0, 0\\",\\"ZO0097500975, ZO0017100171\\",\\"55.969\\",\\"55.969\\",2,2,order,elyssa +1wMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Oliver,Oliver,\\"Oliver Graves\\",\\"Oliver Graves\\",MALE,7,Graves,Graves,\\"(empty)\\",Saturday,5,\\"oliver@graves-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562989,\\"sold_product_562989_22919, sold_product_562989_22668\\",\\"sold_product_562989_22919, sold_product_562989_22668\\",\\"22.984, 22.984\\",\\"22.984, 22.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"10.813, 11.492\\",\\"22.984, 22.984\\",\\"22,919, 22,668\\",\\"Sweatshirt - white, Shirt - petrol\\",\\"Sweatshirt - white, Shirt - petrol\\",\\"1, 1\\",\\"ZO0590905909, ZO0279902799\\",\\"0, 0\\",\\"22.984, 22.984\\",\\"22.984, 22.984\\",\\"0, 0\\",\\"ZO0590905909, ZO0279902799\\",\\"45.969\\",\\"45.969\\",2,2,order,oliver +2QMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Pia,Pia,\\"Pia Harmon\\",\\"Pia Harmon\\",FEMALE,45,Harmon,Harmon,\\"(empty)\\",Saturday,5,\\"pia@harmon-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562597,\\"sold_product_562597_24187, sold_product_562597_14371\\",\\"sold_product_562597_24187, sold_product_562597_14371\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"25.984, 10.063\\",\\"50, 18.984\\",\\"24,187, 14,371\\",\\"Boots - cognac, Across body bag - black\\",\\"Boots - cognac, Across body bag - black\\",\\"1, 1\\",\\"ZO0013200132, ZO0093800938\\",\\"0, 0\\",\\"50, 18.984\\",\\"50, 18.984\\",\\"0, 0\\",\\"ZO0013200132, ZO0093800938\\",69,69,2,2,order,pia +TwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Clarice,Clarice,\\"Clarice Goodwin\\",\\"Clarice Goodwin\\",FEMALE,18,Goodwin,Goodwin,\\"(empty)\\",Saturday,5,\\"clarice@goodwin-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563548,\\"sold_product_563548_5972, sold_product_563548_20864\\",\\"sold_product_563548_5972, sold_product_563548_20864\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"12.992, 16.172\\",\\"24.984, 33\\",\\"5,972, 20,864\\",\\"Ankle boots - black, Winter boots - cognac\\",\\"Ankle boots - black, Winter boots - cognac\\",\\"1, 1\\",\\"ZO0021600216, ZO0031600316\\",\\"0, 0\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"0, 0\\",\\"ZO0021600216, ZO0031600316\\",\\"57.969\\",\\"57.969\\",2,2,order,clarice +awMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Marwan,Marwan,\\"Marwan Shaw\\",\\"Marwan Shaw\\",MALE,51,Shaw,Shaw,\\"(empty)\\",Saturday,5,\\"marwan@shaw-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 21, 2019 @ 00:00:00.000\\",562715,\\"sold_product_562715_21515, sold_product_562715_13710\\",\\"sold_product_562715_21515, sold_product_562715_13710\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"13.922, 5.52\\",\\"28.984, 11.992\\",\\"21,515, 13,710\\",\\"Shirt - dark blue, Print T-shirt - blue\\",\\"Shirt - dark blue, Print T-shirt - blue\\",\\"1, 1\\",\\"ZO0413404134, ZO0437204372\\",\\"0, 0\\",\\"28.984, 11.992\\",\\"28.984, 11.992\\",\\"0, 0\\",\\"ZO0413404134, ZO0437204372\\",\\"40.969\\",\\"40.969\\",2,2,order,marwan +bAMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Mary,Mary,\\"Mary Dennis\\",\\"Mary Dennis\\",FEMALE,20,Dennis,Dennis,\\"(empty)\\",Saturday,5,\\"mary@dennis-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563657,\\"sold_product_563657_21922, sold_product_563657_16149\\",\\"sold_product_563657_21922, sold_product_563657_16149\\",\\"20.984, 65\\",\\"20.984, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"10.492, 29.906\\",\\"20.984, 65\\",\\"21,922, 16,149\\",\\"Jumper - dark blue/off white , Lace-up heels - cognac\\",\\"Jumper - dark blue/off white , Lace-up heels - cognac\\",\\"1, 1\\",\\"ZO0653506535, ZO0322303223\\",\\"0, 0\\",\\"20.984, 65\\",\\"20.984, 65\\",\\"0, 0\\",\\"ZO0653506535, ZO0322303223\\",86,86,2,2,order,mary +bQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Chapman\\",\\"Wilhemina St. Chapman\\",FEMALE,17,Chapman,Chapman,\\"(empty)\\",Saturday,5,\\"wilhemina st.@chapman-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563704,\\"sold_product_563704_21823, sold_product_563704_19078\\",\\"sold_product_563704_21823, sold_product_563704_19078\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"9.656, 8.828\\",\\"20.984, 16.984\\",\\"21,823, 19,078\\",\\"Long sleeved top - peacoat, Print T-shirt - black\\",\\"Long sleeved top - peacoat, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0062700627, ZO0054100541\\",\\"0, 0\\",\\"20.984, 16.984\\",\\"20.984, 16.984\\",\\"0, 0\\",\\"ZO0062700627, ZO0054100541\\",\\"37.969\\",\\"37.969\\",2,2,order,wilhemina +bgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Underwood\\",\\"Elyssa Underwood\\",FEMALE,27,Underwood,Underwood,\\"(empty)\\",Saturday,5,\\"elyssa@underwood-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563534,\\"sold_product_563534_18172, sold_product_563534_19097\\",\\"sold_product_563534_18172, sold_product_563534_19097\\",\\"42, 60\\",\\"42, 60\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"22.25, 29.406\\",\\"42, 60\\",\\"18,172, 19,097\\",\\"Boots - black, Ankle boots - camel\\",\\"Boots - black, Ankle boots - camel\\",\\"1, 1\\",\\"ZO0014300143, ZO0249202492\\",\\"0, 0\\",\\"42, 60\\",\\"42, 60\\",\\"0, 0\\",\\"ZO0014300143, ZO0249202492\\",102,102,2,2,order,elyssa +jgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes, Men's Clothing\\",\\"Men's Accessories, Men's Shoes, Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Rivera\\",\\"Sultan Al Rivera\\",MALE,19,Rivera,Rivera,\\"(empty)\\",Saturday,5,\\"sultan al@rivera-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",716616,\\"sold_product_716616_11922, sold_product_716616_19741, sold_product_716616_6283, sold_product_716616_6868\\",\\"sold_product_716616_11922, sold_product_716616_19741, sold_product_716616_6283, sold_product_716616_6868\\",\\"18.984, 16.984, 11.992, 42\\",\\"18.984, 16.984, 11.992, 42\\",\\"Men's Accessories, Men's Shoes, Men's Clothing, Men's Clothing\\",\\"Men's Accessories, Men's Shoes, Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Elitelligence, Elitelligence, Microlutions\\",\\"Elitelligence, Elitelligence, Elitelligence, Microlutions\\",\\"9.68, 7.988, 6.352, 20.156\\",\\"18.984, 16.984, 11.992, 42\\",\\"11,922, 19,741, 6,283, 6,868\\",\\"Watch - black, Trainers - black, Basic T-shirt - dark blue/white, Bomber Jacket - bordeaux\\",\\"Watch - black, Trainers - black, Basic T-shirt - dark blue/white, Bomber Jacket - bordeaux\\",\\"1, 1, 1, 1\\",\\"ZO0601506015, ZO0507505075, ZO0549605496, ZO0114701147\\",\\"0, 0, 0, 0\\",\\"18.984, 16.984, 11.992, 42\\",\\"18.984, 16.984, 11.992, 42\\",\\"0, 0, 0, 0\\",\\"ZO0601506015, ZO0507505075, ZO0549605496, ZO0114701147\\",\\"89.938\\",\\"89.938\\",4,4,order,sultan +oQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jason,Jason,\\"Jason Rice\\",\\"Jason Rice\\",MALE,16,Rice,Rice,\\"(empty)\\",Saturday,5,\\"jason@rice-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 21, 2019 @ 00:00:00.000\\",563419,\\"sold_product_563419_17629, sold_product_563419_21599\\",\\"sold_product_563419_17629, sold_product_563419_21599\\",\\"24.984, 26.984\\",\\"24.984, 26.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"12.992, 13.492\\",\\"24.984, 26.984\\",\\"17,629, 21,599\\",\\"Tracksuit bottoms - mottled grey, Jumper - black\\",\\"Tracksuit bottoms - mottled grey, Jumper - black\\",\\"1, 1\\",\\"ZO0528605286, ZO0578505785\\",\\"0, 0\\",\\"24.984, 26.984\\",\\"24.984, 26.984\\",\\"0, 0\\",\\"ZO0528605286, ZO0578505785\\",\\"51.969\\",\\"51.969\\",2,2,order,jason +ogMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Wise\\",\\"Elyssa Wise\\",FEMALE,27,Wise,Wise,\\"(empty)\\",Saturday,5,\\"elyssa@wise-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Spherecords Curvy\\",\\"Gnomehouse, Spherecords Curvy\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563468,\\"sold_product_563468_18486, sold_product_563468_18903\\",\\"sold_product_563468_18486, sold_product_563468_18903\\",\\"100, 26.984\\",\\"100, 26.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Spherecords Curvy\\",\\"Gnomehouse, Spherecords Curvy\\",\\"46, 13.758\\",\\"100, 26.984\\",\\"18,486, 18,903\\",\\"Over-the-knee boots - black, Shirt - white\\",\\"Over-the-knee boots - black, Shirt - white\\",\\"1, 1\\",\\"ZO0324003240, ZO0711107111\\",\\"0, 0\\",\\"100, 26.984\\",\\"100, 26.984\\",\\"0, 0\\",\\"ZO0324003240, ZO0711107111\\",127,127,2,2,order,elyssa +owMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Mcdonald\\",\\"Rabbia Al Mcdonald\\",FEMALE,5,Mcdonald,Mcdonald,\\"(empty)\\",Saturday,5,\\"rabbia al@mcdonald-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563496,\\"sold_product_563496_19888, sold_product_563496_15294\\",\\"sold_product_563496_19888, sold_product_563496_15294\\",\\"100, 18.984\\",\\"100, 18.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"51, 9.68\\",\\"100, 18.984\\",\\"19,888, 15,294\\",\\"Classic coat - camel, Across body bag - cognac\\",\\"Classic coat - camel, Across body bag - cognac\\",\\"1, 1\\",\\"ZO0354103541, ZO0196101961\\",\\"0, 0\\",\\"100, 18.984\\",\\"100, 18.984\\",\\"0, 0\\",\\"ZO0354103541, ZO0196101961\\",119,119,2,2,order,rabbia +3QMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Gilbert\\",\\"Yasmine Gilbert\\",FEMALE,43,Gilbert,Gilbert,\\"(empty)\\",Saturday,5,\\"yasmine@gilbert-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563829,\\"sold_product_563829_18348, sold_product_563829_22842\\",\\"sold_product_563829_18348, sold_product_563829_22842\\",\\"50, 50\\",\\"50, 50\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"26.484, 26.984\\",\\"50, 50\\",\\"18,348, 22,842\\",\\"Summer dress - apple butter, Beaded Occasion Dress\\",\\"Summer dress - apple butter, Beaded Occasion Dress\\",\\"1, 1\\",\\"ZO0335103351, ZO0043000430\\",\\"0, 0\\",\\"50, 50\\",\\"50, 50\\",\\"0, 0\\",\\"ZO0335103351, ZO0043000430\\",100,100,2,2,order,yasmine +3gMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Selena,Selena,\\"Selena Wells\\",\\"Selena Wells\\",FEMALE,42,Wells,Wells,\\"(empty)\\",Saturday,5,\\"selena@wells-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563888,\\"sold_product_563888_24162, sold_product_563888_20172\\",\\"sold_product_563888_24162, sold_product_563888_20172\\",\\"24.984, 21.984\\",\\"24.984, 21.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"13.242, 11.648\\",\\"24.984, 21.984\\",\\"24,162, 20,172\\",\\"Rucksack - cognac, Nightie - dark green\\",\\"Rucksack - cognac, Nightie - dark green\\",\\"1, 1\\",\\"ZO0090400904, ZO0100501005\\",\\"0, 0\\",\\"24.984, 21.984\\",\\"24.984, 21.984\\",\\"0, 0\\",\\"ZO0090400904, ZO0100501005\\",\\"46.969\\",\\"46.969\\",2,2,order,selena +\\"-QMtOW0BH63Xcmy453H9\\",ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Hodges\\",\\"Pia Hodges\\",FEMALE,45,Hodges,Hodges,\\"(empty)\\",Saturday,5,\\"pia@hodges-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Microlutions\\",\\"Pyramidustries, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563037,\\"sold_product_563037_20079, sold_product_563037_11032\\",\\"sold_product_563037_20079, sold_product_563037_11032\\",\\"24.984, 75\\",\\"24.984, 75\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Microlutions\\",\\"Pyramidustries, Microlutions\\",\\"12, 38.25\\",\\"24.984, 75\\",\\"20,079, 11,032\\",\\"Vest - black, Parka - mottled grey\\",\\"Vest - black, Parka - mottled grey\\",\\"1, 1\\",\\"ZO0172801728, ZO0115701157\\",\\"0, 0\\",\\"24.984, 75\\",\\"24.984, 75\\",\\"0, 0\\",\\"ZO0172801728, ZO0115701157\\",100,100,2,2,order,pia +\\"-gMtOW0BH63Xcmy453H9\\",ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Brewer\\",\\"Mostafa Brewer\\",MALE,9,Brewer,Brewer,\\"(empty)\\",Saturday,5,\\"mostafa@brewer-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563105,\\"sold_product_563105_23911, sold_product_563105_15250\\",\\"sold_product_563105_23911, sold_product_563105_15250\\",\\"6.988, 33\\",\\"6.988, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"3.5, 18.141\\",\\"6.988, 33\\",\\"23,911, 15,250\\",\\"Basic T-shirt - black, Shirt - beige\\",\\"Basic T-shirt - black, Shirt - beige\\",\\"1, 1\\",\\"ZO0562205622, ZO0110901109\\",\\"0, 0\\",\\"6.988, 33\\",\\"6.988, 33\\",\\"0, 0\\",\\"ZO0562205622, ZO0110901109\\",\\"39.969\\",\\"39.969\\",2,2,order,mostafa +ZwMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Rose\\",\\"Wilhemina St. Rose\\",FEMALE,17,Rose,Rose,\\"(empty)\\",Saturday,5,\\"wilhemina st.@rose-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563066,\\"sold_product_563066_18616, sold_product_563066_17298\\",\\"sold_product_563066_18616, sold_product_563066_17298\\",\\"75, 16.984\\",\\"75, 16.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"36.75, 9.344\\",\\"75, 16.984\\",\\"18,616, 17,298\\",\\"Boots - brown, Across body bag - turquoise\\",\\"Boots - brown, Across body bag - turquoise\\",\\"1, 1\\",\\"ZO0373503735, ZO0206902069\\",\\"0, 0\\",\\"75, 16.984\\",\\"75, 16.984\\",\\"0, 0\\",\\"ZO0373503735, ZO0206902069\\",92,92,2,2,order,wilhemina +aAMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine King\\",\\"Yasmine King\\",FEMALE,43,King,King,\\"(empty)\\",Saturday,5,\\"yasmine@king-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 21, 2019 @ 00:00:00.000\\",563113,\\"sold_product_563113_13234, sold_product_563113_18481\\",\\"sold_product_563113_13234, sold_product_563113_18481\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 10, 2016 @ 00:00:00.000, Dec 10, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"17.156, 13.242\\",\\"33, 24.984\\",\\"13,234, 18,481\\",\\"Jersey dress - red ochre, Jersey dress - dark red\\",\\"Jersey dress - red ochre, Jersey dress - dark red\\",\\"1, 1\\",\\"ZO0333903339, ZO0151801518\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0333903339, ZO0151801518\\",\\"57.969\\",\\"57.969\\",2,2,order,yasmine +\\"_QMtOW0BH63Xcmy432DJ\\",ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Parker\\",\\"Wilhemina St. Parker\\",FEMALE,17,Parker,Parker,\\"(empty)\\",Friday,4,\\"wilhemina st.@parker-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562351,\\"sold_product_562351_18495, sold_product_562351_22598\\",\\"sold_product_562351_18495, sold_product_562351_22598\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Low Tide Media, Tigress Enterprises\\",\\"25, 14.781\\",\\"50, 28.984\\",\\"18,495, 22,598\\",\\"Ankle boots - cognac, Shift dress - black\\",\\"Ankle boots - cognac, Shift dress - black\\",\\"1, 1\\",\\"ZO0376403764, ZO0050800508\\",\\"0, 0\\",\\"50, 28.984\\",\\"50, 28.984\\",\\"0, 0\\",\\"ZO0376403764, ZO0050800508\\",79,79,2,2,order,wilhemina +WwMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Graham\\",\\"Gwen Graham\\",FEMALE,26,Graham,Graham,\\"(empty)\\",Friday,4,\\"gwen@graham-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561666,\\"sold_product_561666_24242, sold_product_561666_16817\\",\\"sold_product_561666_24242, sold_product_561666_16817\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"17.813, 10.25\\",\\"33, 18.984\\",\\"24,242, 16,817\\",\\"Jersey dress - black/white, Long sleeved top - black\\",\\"Jersey dress - black/white, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0042600426, ZO0166401664\\",\\"0, 0\\",\\"33, 18.984\\",\\"33, 18.984\\",\\"0, 0\\",\\"ZO0042600426, ZO0166401664\\",\\"51.969\\",\\"51.969\\",2,2,order,gwen +XAMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Porter\\",\\"Rabbia Al Porter\\",FEMALE,5,Porter,Porter,\\"(empty)\\",Friday,4,\\"rabbia al@porter-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561236,\\"sold_product_561236_23790, sold_product_561236_19511\\",\\"sold_product_561236_23790, sold_product_561236_19511\\",\\"28.984, 16.984\\",\\"28.984, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"14.492, 8.656\\",\\"28.984, 16.984\\",\\"23,790, 19,511\\",\\"Jumper - peacoat, Nightie - black\\",\\"Jumper - peacoat, Nightie - black\\",\\"1, 1\\",\\"ZO0072700727, ZO0101001010\\",\\"0, 0\\",\\"28.984, 16.984\\",\\"28.984, 16.984\\",\\"0, 0\\",\\"ZO0072700727, ZO0101001010\\",\\"45.969\\",\\"45.969\\",2,2,order,rabbia +XQMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Shaw\\",\\"Hicham Shaw\\",MALE,8,Shaw,Shaw,\\"(empty)\\",Friday,4,\\"hicham@shaw-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561290,\\"sold_product_561290_1694, sold_product_561290_15025\\",\\"sold_product_561290_1694, sold_product_561290_15025\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"38.25, 12.992\\",\\"75, 24.984\\",\\"1,694, 15,025\\",\\"Slip-ons - Midnight Blue, Jumper - black\\",\\"Slip-ons - Midnight Blue, Jumper - black\\",\\"1, 1\\",\\"ZO0255702557, ZO0577605776\\",\\"0, 0\\",\\"75, 24.984\\",\\"75, 24.984\\",\\"0, 0\\",\\"ZO0255702557, ZO0577605776\\",100,100,2,2,order,hicham +XgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Washington\\",\\"Abd Washington\\",MALE,52,Washington,Washington,\\"(empty)\\",Friday,4,\\"abd@washington-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Elitelligence,Elitelligence,\\"Jun 20, 2019 @ 00:00:00.000\\",561739,\\"sold_product_561739_16553, sold_product_561739_14242\\",\\"sold_product_561739_16553, sold_product_561739_14242\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"12, 11.75\\",\\"24.984, 24.984\\",\\"16,553, 14,242\\",\\"Straight leg jeans - blue denim, Jeans Tapered Fit - black denim \\",\\"Straight leg jeans - blue denim, Jeans Tapered Fit - black denim \\",\\"1, 1\\",\\"ZO0537805378, ZO0538005380\\",\\"0, 0\\",\\"24.984, 24.984\\",\\"24.984, 24.984\\",\\"0, 0\\",\\"ZO0537805378, ZO0538005380\\",\\"49.969\\",\\"49.969\\",2,2,order,abd +XwMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Tran\\",\\"Rabbia Al Tran\\",FEMALE,5,Tran,Tran,\\"(empty)\\",Friday,4,\\"rabbia al@tran-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561786,\\"sold_product_561786_12183, sold_product_561786_15264\\",\\"sold_product_561786_12183, sold_product_561786_15264\\",\\"25.984, 29.984\\",\\"25.984, 29.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"13.508, 14.102\\",\\"25.984, 29.984\\",\\"12,183, 15,264\\",\\"Blouse - navy, Cardigan - black/anthrazit \\",\\"Blouse - navy, Cardigan - black/anthrazit \\",\\"1, 1\\",\\"ZO0064100641, ZO0068600686\\",\\"0, 0\\",\\"25.984, 29.984\\",\\"25.984, 29.984\\",\\"0, 0\\",\\"ZO0064100641, ZO0068600686\\",\\"55.969\\",\\"55.969\\",2,2,order,rabbia +hgMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Diane,Diane,\\"Diane Willis\\",\\"Diane Willis\\",FEMALE,22,Willis,Willis,\\"(empty)\\",Friday,4,\\"diane@willis-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562400,\\"sold_product_562400_16415, sold_product_562400_5857\\",\\"sold_product_562400_16415, sold_product_562400_5857\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Low Tide Media\\",\\"Tigress Enterprises, Low Tide Media\\",\\"8.156, 23.5\\",\\"16.984, 50\\",\\"16,415, 5,857\\",\\"Across body bag - black, Ankle boots - cognac\\",\\"Across body bag - black, Ankle boots - cognac\\",\\"1, 1\\",\\"ZO0094200942, ZO0376603766\\",\\"0, 0\\",\\"16.984, 50\\",\\"16.984, 50\\",\\"0, 0\\",\\"ZO0094200942, ZO0376603766\\",67,67,2,2,order,diane +1gMtOW0BH63Xcmy432HJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Weber\\",\\"Elyssa Weber\\",FEMALE,27,Weber,Weber,\\"(empty)\\",Friday,4,\\"elyssa@weber-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562352,\\"sold_product_562352_19189, sold_product_562352_8284\\",\\"sold_product_562352_19189, sold_product_562352_8284\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"13.344, 16.813\\",\\"28.984, 33\\",\\"19,189, 8,284\\",\\"Blouse - black, Shirt - soft pink nude\\",\\"Blouse - black, Shirt - soft pink nude\\",\\"1, 1\\",\\"ZO0265302653, ZO0348203482\\",\\"0, 0\\",\\"28.984, 33\\",\\"28.984, 33\\",\\"0, 0\\",\\"ZO0265302653, ZO0348203482\\",\\"61.969\\",\\"61.969\\",2,2,order,elyssa +BwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Garza\\",\\"Jackson Garza\\",MALE,13,Garza,Garza,\\"(empty)\\",Friday,4,\\"jackson@garza-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561343,\\"sold_product_561343_23977, sold_product_561343_19776\\",\\"sold_product_561343_23977, sold_product_561343_19776\\",\\"65, 10.992\\",\\"65, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"30.547, 5.5\\",\\"65, 10.992\\",\\"23,977, 19,776\\",\\"Waterproof trousers - pumpkin spice, Print T-shirt - white\\",\\"Waterproof trousers - pumpkin spice, Print T-shirt - white\\",\\"1, 1\\",\\"ZO0620706207, ZO0566705667\\",\\"0, 0\\",\\"65, 10.992\\",\\"65, 10.992\\",\\"0, 0\\",\\"ZO0620706207, ZO0566705667\\",76,76,2,2,order,jackson +VQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Lewis\\",\\"Elyssa Lewis\\",FEMALE,27,Lewis,Lewis,\\"(empty)\\",Friday,4,\\"elyssa@lewis-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises Curvy, Pyramidustries\\",\\"Tigress Enterprises Curvy, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561543,\\"sold_product_561543_13132, sold_product_561543_19621\\",\\"sold_product_561543_13132, sold_product_561543_19621\\",\\"42, 34\\",\\"42, 34\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises Curvy, Pyramidustries\\",\\"Tigress Enterprises Curvy, Pyramidustries\\",\\"22.672, 17.328\\",\\"42, 34\\",\\"13,132, 19,621\\",\\"Blazer - black, Waterproof jacket - black\\",\\"Blazer - black, Waterproof jacket - black\\",\\"1, 1\\",\\"ZO0106701067, ZO0175101751\\",\\"0, 0\\",\\"42, 34\\",\\"42, 34\\",\\"0, 0\\",\\"ZO0106701067, ZO0175101751\\",76,76,2,2,order,elyssa +VgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Davidson\\",\\"Fitzgerald Davidson\\",MALE,11,Davidson,Davidson,\\"(empty)\\",Friday,4,\\"fitzgerald@davidson-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561577,\\"sold_product_561577_15263, sold_product_561577_6820\\",\\"sold_product_561577_15263, sold_product_561577_6820\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"15.844, 12.992\\",\\"33, 24.984\\",\\"15,263, 6,820\\",\\"Briefcase - brown, Cardigan - dark blue\\",\\"Briefcase - brown, Cardigan - dark blue\\",\\"1, 1\\",\\"ZO0604406044, ZO0296302963\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0604406044, ZO0296302963\\",\\"57.969\\",\\"57.969\\",2,2,order,fuzzy +WQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Barnes\\",\\"Abd Barnes\\",MALE,52,Barnes,Barnes,\\"(empty)\\",Friday,4,\\"abd@barnes-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561429,\\"sold_product_561429_1791, sold_product_561429_3467\\",\\"sold_product_561429_1791, sold_product_561429_3467\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"14.852, 13.922\\",\\"33, 28.984\\",\\"1,791, 3,467\\",\\"Lace-up boots - green, Tights - black\\",\\"Lace-up boots - green, Tights - black\\",\\"1, 1\\",\\"ZO0511405114, ZO0621506215\\",\\"0, 0\\",\\"33, 28.984\\",\\"33, 28.984\\",\\"0, 0\\",\\"ZO0511405114, ZO0621506215\\",\\"61.969\\",\\"61.969\\",2,2,order,abd +egMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Pia,Pia,\\"Pia Willis\\",\\"Pia Willis\\",FEMALE,45,Willis,Willis,\\"(empty)\\",Friday,4,\\"pia@willis-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Gnomehouse, Low Tide Media\\",\\"Gnomehouse, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562050,\\"sold_product_562050_14157, sold_product_562050_19227\\",\\"sold_product_562050_14157, sold_product_562050_19227\\",\\"50, 90\\",\\"50, 90\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Low Tide Media\\",\\"Gnomehouse, Low Tide Media\\",\\"24.5, 44.094\\",\\"50, 90\\",\\"14,157, 19,227\\",\\"Classic heels - black, Boots - cognac\\",\\"Classic heels - black, Boots - cognac\\",\\"1, 1\\",\\"ZO0322103221, ZO0373903739\\",\\"0, 0\\",\\"50, 90\\",\\"50, 90\\",\\"0, 0\\",\\"ZO0322103221, ZO0373903739\\",140,140,2,2,order,pia +ewMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Jim,Jim,\\"Jim Chandler\\",\\"Jim Chandler\\",MALE,41,Chandler,Chandler,\\"(empty)\\",Friday,4,\\"jim@chandler-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562101,\\"sold_product_562101_24315, sold_product_562101_11349\\",\\"sold_product_562101_24315, sold_product_562101_11349\\",\\"33, 42\\",\\"33, 42\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"16.813, 21.406\\",\\"33, 42\\",\\"24,315, 11,349\\",\\"Weekend bag - navy/brown, Summer jacket - black\\",\\"Weekend bag - navy/brown, Summer jacket - black\\",\\"1, 1\\",\\"ZO0468804688, ZO0285502855\\",\\"0, 0\\",\\"33, 42\\",\\"33, 42\\",\\"0, 0\\",\\"ZO0468804688, ZO0285502855\\",75,75,2,2,order,jim +fAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,Betty,Betty,\\"Betty Salazar\\",\\"Betty Salazar\\",FEMALE,44,Salazar,Salazar,\\"(empty)\\",Friday,4,\\"betty@salazar-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Angeldale,Angeldale,\\"Jun 20, 2019 @ 00:00:00.000\\",562247,\\"sold_product_562247_14495, sold_product_562247_5292\\",\\"sold_product_562247_14495, sold_product_562247_5292\\",\\"70, 85\\",\\"70, 85\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Angeldale\\",\\"Angeldale, Angeldale\\",\\"34.313, 43.344\\",\\"70, 85\\",\\"14,495, 5,292\\",\\"Classic Heels with Straps, Ankle boots - camel\\",\\"Classic Heels with Straps, Ankle boots - camel\\",\\"1, 1\\",\\"ZO0666206662, ZO0673206732\\",\\"0, 0\\",\\"70, 85\\",\\"70, 85\\",\\"0, 0\\",\\"ZO0666206662, ZO0673206732\\",155,155,2,2,order,betty +fQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Ball\\",\\"Robbie Ball\\",MALE,48,Ball,Ball,\\"(empty)\\",Friday,4,\\"robbie@ball-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562285,\\"sold_product_562285_15123, sold_product_562285_21357\\",\\"sold_product_562285_15123, sold_product_562285_21357\\",\\"10.992, 9.992\\",\\"10.992, 9.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"5.93, 4.699\\",\\"10.992, 9.992\\",\\"15,123, 21,357\\",\\"Print T-shirt - black, Basic T-shirt - white\\",\\"Print T-shirt - black, Basic T-shirt - white\\",\\"1, 1\\",\\"ZO0618306183, ZO0563105631\\",\\"0, 0\\",\\"10.992, 9.992\\",\\"10.992, 9.992\\",\\"0, 0\\",\\"ZO0618306183, ZO0563105631\\",\\"20.984\\",\\"20.984\\",2,2,order,robbie +ugMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Dawson\\",\\"Betty Dawson\\",FEMALE,44,Dawson,Dawson,\\"(empty)\\",Friday,4,\\"betty@dawson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561965,\\"sold_product_561965_8728, sold_product_561965_24101\\",\\"sold_product_561965_8728, sold_product_561965_24101\\",\\"65, 42\\",\\"65, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Gnomehouse\\",\\"Spherecords, Gnomehouse\\",\\"35.094, 18.906\\",\\"65, 42\\",\\"8,728, 24,101\\",\\"Jumper - dark red, Jersey dress - jester red\\",\\"Jumper - dark red, Jersey dress - jester red\\",\\"1, 1\\",\\"ZO0655806558, ZO0334503345\\",\\"0, 0\\",\\"65, 42\\",\\"65, 42\\",\\"0, 0\\",\\"ZO0655806558, ZO0334503345\\",107,107,2,2,order,betty +uwMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Hart\\",\\"Sonya Hart\\",FEMALE,28,Hart,Hart,\\"(empty)\\",Friday,4,\\"sonya@hart-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Spherecords, Crystal Lighting\\",\\"Spherecords, Crystal Lighting\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562008,\\"sold_product_562008_21990, sold_product_562008_22639\\",\\"sold_product_562008_21990, sold_product_562008_22639\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Crystal Lighting\\",\\"Spherecords, Crystal Lighting\\",\\"15.844, 11.25\\",\\"33, 24.984\\",\\"21,990, 22,639\\",\\"Blazer - black, Wool jumper - white\\",\\"Blazer - black, Wool jumper - white\\",\\"1, 1\\",\\"ZO0657006570, ZO0485604856\\",\\"0, 0\\",\\"33, 24.984\\",\\"33, 24.984\\",\\"0, 0\\",\\"ZO0657006570, ZO0485604856\\",\\"57.969\\",\\"57.969\\",2,2,order,sonya +wAMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Simmons\\",\\"Sultan Al Simmons\\",MALE,19,Simmons,Simmons,\\"(empty)\\",Friday,4,\\"sultan al@simmons-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561472,\\"sold_product_561472_12840, sold_product_561472_24625\\",\\"sold_product_561472_12840, sold_product_561472_24625\\",\\"65, 13.992\\",\\"65, 13.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"30.547, 6.301\\",\\"65, 13.992\\",\\"12,840, 24,625\\",\\"Lace-up boots - black, Print T-shirt - dark blue multicolor\\",\\"Lace-up boots - black, Print T-shirt - dark blue multicolor\\",\\"1, 1\\",\\"ZO0399703997, ZO0439904399\\",\\"0, 0\\",\\"65, 13.992\\",\\"65, 13.992\\",\\"0, 0\\",\\"ZO0399703997, ZO0439904399\\",79,79,2,2,order,sultan +wQMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Carr\\",\\"Abdulraheem Al Carr\\",MALE,33,Carr,Carr,\\"(empty)\\",Friday,4,\\"abdulraheem al@carr-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561490,\\"sold_product_561490_12150, sold_product_561490_20378\\",\\"sold_product_561490_12150, sold_product_561490_20378\\",\\"50, 8.992\\",\\"50, 8.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Elitelligence\\",\\"Angeldale, Elitelligence\\",\\"22.5, 4.23\\",\\"50, 8.992\\",\\"12,150, 20,378\\",\\"Casual lace-ups - dark brown , Basic T-shirt - white\\",\\"Casual lace-ups - dark brown , Basic T-shirt - white\\",\\"1, 1\\",\\"ZO0681306813, ZO0545705457\\",\\"0, 0\\",\\"50, 8.992\\",\\"50, 8.992\\",\\"0, 0\\",\\"ZO0681306813, ZO0545705457\\",\\"58.969\\",\\"58.969\\",2,2,order,abdulraheem +wgMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Allison\\",\\"Selena Allison\\",FEMALE,42,Allison,Allison,\\"(empty)\\",Friday,4,\\"selena@allison-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561317,\\"sold_product_561317_20991, sold_product_561317_22586\\",\\"sold_product_561317_20991, sold_product_561317_22586\\",\\"42, 33\\",\\"42, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"21.828, 16.172\\",\\"42, 33\\",\\"20,991, 22,586\\",\\"Mini skirt - navy blazer, Cardigan - navy/brown\\",\\"Mini skirt - navy blazer, Cardigan - navy/brown\\",\\"1, 1\\",\\"ZO0329303293, ZO0074000740\\",\\"0, 0\\",\\"42, 33\\",\\"42, 33\\",\\"0, 0\\",\\"ZO0329303293, ZO0074000740\\",75,75,2,2,order,selena +0gMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Thad,Thad,\\"Thad Walters\\",\\"Thad Walters\\",MALE,30,Walters,Walters,\\"(empty)\\",Friday,4,\\"thad@walters-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562424,\\"sold_product_562424_11737, sold_product_562424_13228\\",\\"sold_product_562424_11737, sold_product_562424_13228\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"9.867, 11.5\\",\\"20.984, 24.984\\",\\"11,737, 13,228\\",\\"Sweatshirt - dark blue, Jumper - dark blue multicolor\\",\\"Sweatshirt - dark blue, Jumper - dark blue multicolor\\",\\"1, 1\\",\\"ZO0581705817, ZO0448804488\\",\\"0, 0\\",\\"20.984, 24.984\\",\\"20.984, 24.984\\",\\"0, 0\\",\\"ZO0581705817, ZO0448804488\\",\\"45.969\\",\\"45.969\\",2,2,order,thad +0wMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Potter\\",\\"Sultan Al Potter\\",MALE,19,Potter,Potter,\\"(empty)\\",Friday,4,\\"sultan al@potter-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562473,\\"sold_product_562473_13192, sold_product_562473_21203\\",\\"sold_product_562473_13192, sold_product_562473_21203\\",\\"85, 75\\",\\"85, 75\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"39.094, 36.75\\",\\"85, 75\\",\\"13,192, 21,203\\",\\"Parka - navy, Winter jacket - dark blue\\",\\"Parka - navy, Winter jacket - dark blue\\",\\"1, 1\\",\\"ZO0289202892, ZO0432304323\\",\\"0, 0\\",\\"85, 75\\",\\"85, 75\\",\\"0, 0\\",\\"ZO0289202892, ZO0432304323\\",160,160,2,2,order,sultan +1AMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Jimenez\\",\\"Hicham Jimenez\\",MALE,8,Jimenez,Jimenez,\\"(empty)\\",Friday,4,\\"hicham@jimenez-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562488,\\"sold_product_562488_13297, sold_product_562488_13138\\",\\"sold_product_562488_13297, sold_product_562488_13138\\",\\"60, 24.984\\",\\"60, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"32.375, 13.492\\",\\"60, 24.984\\",\\"13,297, 13,138\\",\\"Light jacket - navy, Jumper - black\\",\\"Light jacket - navy, Jumper - black\\",\\"1, 1\\",\\"ZO0275202752, ZO0574405744\\",\\"0, 0\\",\\"60, 24.984\\",\\"60, 24.984\\",\\"0, 0\\",\\"ZO0275202752, ZO0574405744\\",85,85,2,2,order,hicham +1QMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri Richards\\",\\"Yuri Richards\\",MALE,21,Richards,Richards,\\"(empty)\\",Friday,4,\\"yuri@richards-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562118,\\"sold_product_562118_18280, sold_product_562118_15033\\",\\"sold_product_562118_18280, sold_product_562118_15033\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"7.82, 13.492\\",\\"16.984, 24.984\\",\\"18,280, 15,033\\",\\"Tights - black, Hoodie - mottled grey\\",\\"Tights - black, Hoodie - mottled grey\\",\\"1, 1\\",\\"ZO0622406224, ZO0591405914\\",\\"0, 0\\",\\"16.984, 24.984\\",\\"16.984, 24.984\\",\\"0, 0\\",\\"ZO0622406224, ZO0591405914\\",\\"41.969\\",\\"41.969\\",2,2,order,yuri +1gMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Padilla\\",\\"Yasmine Padilla\\",FEMALE,43,Padilla,Padilla,\\"(empty)\\",Friday,4,\\"yasmine@padilla-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Crystal Lighting, Spherecords\\",\\"Crystal Lighting, Spherecords\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562159,\\"sold_product_562159_8592, sold_product_562159_19303\\",\\"sold_product_562159_8592, sold_product_562159_19303\\",\\"24.984, 9.992\\",\\"24.984, 9.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Crystal Lighting, Spherecords\\",\\"Crystal Lighting, Spherecords\\",\\"11.25, 5.488\\",\\"24.984, 9.992\\",\\"8,592, 19,303\\",\\"Wool jumper - pink, 5 PACK - Trainer socks - black\\",\\"Wool jumper - pink, 5 PACK - Trainer socks - black\\",\\"1, 1\\",\\"ZO0485704857, ZO0662006620\\",\\"0, 0\\",\\"24.984, 9.992\\",\\"24.984, 9.992\\",\\"0, 0\\",\\"ZO0485704857, ZO0662006620\\",\\"34.969\\",\\"34.969\\",2,2,order,yasmine +1wMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Robbie,Robbie,\\"Robbie Mcdonald\\",\\"Robbie Mcdonald\\",MALE,48,Mcdonald,Mcdonald,\\"(empty)\\",Friday,4,\\"robbie@mcdonald-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"(empty)\\",\\"(empty)\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562198,\\"sold_product_562198_12308, sold_product_562198_12830\\",\\"sold_product_562198_12308, sold_product_562198_12830\\",\\"155, 155\\",\\"155, 155\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"(empty), (empty)\\",\\"(empty), (empty)\\",\\"72.875, 72.875\\",\\"155, 155\\",\\"12,308, 12,830\\",\\"Smart slip-ons - brown, Lace-ups - black\\",\\"Smart slip-ons - brown, Lace-ups - black\\",\\"1, 1\\",\\"ZO0482504825, ZO0481304813\\",\\"0, 0\\",\\"155, 155\\",\\"155, 155\\",\\"0, 0\\",\\"ZO0482504825, ZO0481304813\\",310,310,2,2,order,robbie +2QMtOW0BH63Xcmy44WJv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Betty,Betty,\\"Betty Frank\\",\\"Betty Frank\\",FEMALE,44,Frank,Frank,\\"(empty)\\",Friday,4,\\"betty@frank-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562523,\\"sold_product_562523_11110, sold_product_562523_20613\\",\\"sold_product_562523_11110, sold_product_562523_20613\\",\\"28.984, 24.984\\",\\"28.984, 24.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"15.359, 11.5\\",\\"28.984, 24.984\\",\\"11,110, 20,613\\",\\"Tracksuit top - black, Watch - silver-coloured\\",\\"Tracksuit top - black, Watch - silver-coloured\\",\\"1, 1\\",\\"ZO0178001780, ZO0078400784\\",\\"0, 0\\",\\"28.984, 24.984\\",\\"28.984, 24.984\\",\\"0, 0\\",\\"ZO0178001780, ZO0078400784\\",\\"53.969\\",\\"53.969\\",2,2,order,betty +lwMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Valdez\\",\\"Youssef Valdez\\",MALE,31,Valdez,Valdez,\\"(empty)\\",Friday,4,\\"youssef@valdez-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 20, 2019 @ 00:00:00.000\\",561373,\\"sold_product_561373_20306, sold_product_561373_18262\\",\\"sold_product_561373_20306, sold_product_561373_18262\\",\\"11.992, 20.984\\",\\"11.992, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"5.52, 10.703\\",\\"11.992, 20.984\\",\\"20,306, 18,262\\",\\"Long sleeved top - mottled dark grey, Chinos - khaki\\",\\"Long sleeved top - mottled dark grey, Chinos - khaki\\",\\"1, 1\\",\\"ZO0563905639, ZO0528805288\\",\\"0, 0\\",\\"11.992, 20.984\\",\\"11.992, 20.984\\",\\"0, 0\\",\\"ZO0563905639, ZO0528805288\\",\\"32.969\\",\\"32.969\\",2,2,order,youssef +mAMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jason,Jason,\\"Jason Webb\\",\\"Jason Webb\\",MALE,16,Webb,Webb,\\"(empty)\\",Friday,4,\\"jason@webb-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Spritechnologies\\",\\"Oceanavigations, Spritechnologies\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561409,\\"sold_product_561409_1438, sold_product_561409_15672\\",\\"sold_product_561409_1438, sold_product_561409_15672\\",\\"60, 65\\",\\"60, 65\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spritechnologies\\",\\"Oceanavigations, Spritechnologies\\",\\"32.375, 33.125\\",\\"60, 65\\",\\"1,438, 15,672\\",\\"Trainers - black, Waterproof jacket - black\\",\\"Trainers - black, Waterproof jacket - black\\",\\"1, 1\\",\\"ZO0254702547, ZO0626306263\\",\\"0, 0\\",\\"60, 65\\",\\"60, 65\\",\\"0, 0\\",\\"ZO0254702547, ZO0626306263\\",125,125,2,2,order,jason +mQMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Stephanie,Stephanie,\\"Stephanie Munoz\\",\\"Stephanie Munoz\\",FEMALE,6,Munoz,Munoz,\\"(empty)\\",Friday,4,\\"stephanie@munoz-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises Curvy, Low Tide Media\\",\\"Tigress Enterprises Curvy, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561858,\\"sold_product_561858_22426, sold_product_561858_12672\\",\\"sold_product_561858_22426, sold_product_561858_12672\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises Curvy, Low Tide Media\\",\\"Tigress Enterprises Curvy, Low Tide Media\\",\\"13.742, 16.813\\",\\"24.984, 33\\",\\"22,426, 12,672\\",\\"Print T-shirt - Chocolate, Ballet pumps - black\\",\\"Print T-shirt - Chocolate, Ballet pumps - black\\",\\"1, 1\\",\\"ZO0105301053, ZO0364803648\\",\\"0, 0\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"0, 0\\",\\"ZO0105301053, ZO0364803648\\",\\"57.969\\",\\"57.969\\",2,2,order,stephanie +mgMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Marshall\\",\\"Fitzgerald Marshall\\",MALE,11,Marshall,Marshall,\\"(empty)\\",Friday,4,\\"fitzgerald@marshall-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561904,\\"sold_product_561904_15204, sold_product_561904_12074\\",\\"sold_product_561904_15204, sold_product_561904_12074\\",\\"42, 11.992\\",\\"42, 11.992\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"21.406, 5.641\\",\\"42, 11.992\\",\\"15,204, 12,074\\",\\"Weekend bag - black, Polo shirt - blue\\",\\"Weekend bag - black, Polo shirt - blue\\",\\"1, 1\\",\\"ZO0315303153, ZO0441904419\\",\\"0, 0\\",\\"42, 11.992\\",\\"42, 11.992\\",\\"0, 0\\",\\"ZO0315303153, ZO0441904419\\",\\"53.969\\",\\"53.969\\",2,2,order,fuzzy +9QMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Tran\\",\\"Betty Tran\\",FEMALE,44,Tran,Tran,\\"(empty)\\",Friday,4,\\"betty@tran-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",\\"Tigress Enterprises MAMA, Tigress Enterprises Curvy\\",\\"Tigress Enterprises MAMA, Tigress Enterprises Curvy\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561381,\\"sold_product_561381_16065, sold_product_561381_20409\\",\\"sold_product_561381_16065, sold_product_561381_20409\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Tigress Enterprises Curvy\\",\\"Tigress Enterprises MAMA, Tigress Enterprises Curvy\\",\\"10.289, 15.844\\",\\"20.984, 33\\",\\"16,065, 20,409\\",\\"Vest - rose/black, Cardigan - black/offwhite\\",\\"Vest - rose/black, Cardigan - black/offwhite\\",\\"1, 1\\",\\"ZO0231202312, ZO0106401064\\",\\"0, 0\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"0, 0\\",\\"ZO0231202312, ZO0106401064\\",\\"53.969\\",\\"53.969\\",2,2,order,betty +9gMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Nash\\",\\"Abd Nash\\",MALE,52,Nash,Nash,\\"(empty)\\",Friday,4,\\"abd@nash-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",Elitelligence,Elitelligence,\\"Jun 20, 2019 @ 00:00:00.000\\",561830,\\"sold_product_561830_15032, sold_product_561830_12189\\",\\"sold_product_561830_15032, sold_product_561830_12189\\",\\"28.984, 14.992\\",\\"28.984, 14.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"13.922, 7.199\\",\\"28.984, 14.992\\",\\"15,032, 12,189\\",\\"Sweatshirt - mottled grey, Tracksuit bottoms - mottled grey\\",\\"Sweatshirt - mottled grey, Tracksuit bottoms - mottled grey\\",\\"1, 1\\",\\"ZO0591105911, ZO0532805328\\",\\"0, 0\\",\\"28.984, 14.992\\",\\"28.984, 14.992\\",\\"0, 0\\",\\"ZO0591105911, ZO0532805328\\",\\"43.969\\",\\"43.969\\",2,2,order,abd +9wMtOW0BH63Xcmy44WNv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Wagdi,Wagdi,\\"Wagdi Gomez\\",\\"Wagdi Gomez\\",MALE,15,Gomez,Gomez,\\"(empty)\\",Friday,4,\\"wagdi@gomez-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561878,\\"sold_product_561878_17804, sold_product_561878_17209\\",\\"sold_product_561878_17804, sold_product_561878_17209\\",\\"12.992, 50\\",\\"12.992, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"6.5, 26.484\\",\\"12.992, 50\\",\\"17,804, 17,209\\",\\"Long sleeved top - mottled dark grey, Casual lace-ups - grey\\",\\"Long sleeved top - mottled dark grey, Casual lace-ups - grey\\",\\"1, 1\\",\\"ZO0562905629, ZO0388303883\\",\\"0, 0\\",\\"12.992, 50\\",\\"12.992, 50\\",\\"0, 0\\",\\"ZO0562905629, ZO0388303883\\",\\"62.969\\",\\"62.969\\",2,2,order,wagdi +\\"-AMtOW0BH63Xcmy44WNv\\",ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Baker\\",\\"Stephanie Baker\\",FEMALE,6,Baker,Baker,\\"(empty)\\",Friday,4,\\"stephanie@baker-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",Pyramidustries,Pyramidustries,\\"Jun 20, 2019 @ 00:00:00.000\\",561916,\\"sold_product_561916_15403, sold_product_561916_11041\\",\\"sold_product_561916_15403, sold_product_561916_11041\\",\\"20.984, 13.992\\",\\"20.984, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"10.703, 7.27\\",\\"20.984, 13.992\\",\\"15,403, 11,041\\",\\"Sweatshirt - dark grey multicolor, Basic T-shirt - dark grey multicolor\\",\\"Sweatshirt - dark grey multicolor, Basic T-shirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0180101801, ZO0157101571\\",\\"0, 0\\",\\"20.984, 13.992\\",\\"20.984, 13.992\\",\\"0, 0\\",\\"ZO0180101801, ZO0157101571\\",\\"34.969\\",\\"34.969\\",2,2,order,stephanie +HQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Recip,Recip,\\"Recip Shaw\\",\\"Recip Shaw\\",MALE,10,Shaw,Shaw,\\"(empty)\\",Friday,4,\\"recip@shaw-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562324,\\"sold_product_562324_20112, sold_product_562324_12375\\",\\"sold_product_562324_20112, sold_product_562324_12375\\",\\"25.984, 20.984\\",\\"25.984, 20.984\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"12.477, 10.289\\",\\"25.984, 20.984\\",\\"20,112, 12,375\\",\\"Shirt - blue, Trainers - red\\",\\"Shirt - blue, Trainers - red\\",\\"1, 1\\",\\"ZO0413604136, ZO0509005090\\",\\"0, 0\\",\\"25.984, 20.984\\",\\"25.984, 20.984\\",\\"0, 0\\",\\"ZO0413604136, ZO0509005090\\",\\"46.969\\",\\"46.969\\",2,2,order,recip +HgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Sonya,Sonya,\\"Sonya Ruiz\\",\\"Sonya Ruiz\\",FEMALE,28,Ruiz,Ruiz,\\"(empty)\\",Friday,4,\\"sonya@ruiz-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562367,\\"sold_product_562367_19018, sold_product_562367_15868\\",\\"sold_product_562367_19018, sold_product_562367_15868\\",\\"42, 10.992\\",\\"42, 10.992\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"19.734, 5.711\\",\\"42, 10.992\\",\\"19,018, 15,868\\",\\"High heeled sandals - red, Scarf - black/white\\",\\"High heeled sandals - red, Scarf - black/white\\",\\"1, 1\\",\\"ZO0371803718, ZO0195401954\\",\\"0, 0\\",\\"42, 10.992\\",\\"42, 10.992\\",\\"0, 0\\",\\"ZO0371803718, ZO0195401954\\",\\"52.969\\",\\"52.969\\",2,2,order,sonya +UwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Ryan\\",\\"Wilhemina St. Ryan\\",FEMALE,17,Ryan,Ryan,\\"(empty)\\",Friday,4,\\"wilhemina st.@ryan-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Oceanavigations, Tigress Enterprises, Pyramidustries, Angeldale\\",\\"Oceanavigations, Tigress Enterprises, Pyramidustries, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",729673,\\"sold_product_729673_23755, sold_product_729673_23467, sold_product_729673_15159, sold_product_729673_5415\\",\\"sold_product_729673_23755, sold_product_729673_23467, sold_product_729673_15159, sold_product_729673_5415\\",\\"50, 60, 24.984, 65\\",\\"50, 60, 24.984, 65\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Shoes\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, Tigress Enterprises, Pyramidustries, Angeldale\\",\\"Oceanavigations, Tigress Enterprises, Pyramidustries, Angeldale\\",\\"23, 31.188, 11.75, 31.844\\",\\"50, 60, 24.984, 65\\",\\"23,755, 23,467, 15,159, 5,415\\",\\"Cardigan - blue & white, Lohan - Maxi dress - silver/black, High heels - blue, Lace-ups - grey\\",\\"Cardigan - blue & white, Lohan - Maxi dress - silver/black, High heels - blue, Lace-ups - grey\\",\\"1, 1, 1, 1\\",\\"ZO0268202682, ZO0048200482, ZO0134801348, ZO0668406684\\",\\"0, 0, 0, 0\\",\\"50, 60, 24.984, 65\\",\\"50, 60, 24.984, 65\\",\\"0, 0, 0, 0\\",\\"ZO0268202682, ZO0048200482, ZO0134801348, ZO0668406684\\",200,200,4,4,order,wilhemina +rQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Ruiz\\",\\"Rabbia Al Ruiz\\",FEMALE,5,Ruiz,Ruiz,\\"(empty)\\",Friday,4,\\"rabbia al@ruiz-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises MAMA\\",\\"Tigress Enterprises MAMA\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561953,\\"sold_product_561953_22114, sold_product_561953_19225\\",\\"sold_product_561953_22114, sold_product_561953_19225\\",\\"29.984, 22.984\\",\\"29.984, 22.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises MAMA, Tigress Enterprises MAMA\\",\\"Tigress Enterprises MAMA, Tigress Enterprises MAMA\\",\\"15.891, 11.273\\",\\"29.984, 22.984\\",\\"22,114, 19,225\\",\\"Blouse - black/white, Blouse - black\\",\\"Blouse - black/white, Blouse - black\\",\\"1, 1\\",\\"ZO0232002320, ZO0231402314\\",\\"0, 0\\",\\"29.984, 22.984\\",\\"29.984, 22.984\\",\\"0, 0\\",\\"ZO0232002320, ZO0231402314\\",\\"52.969\\",\\"52.969\\",2,2,order,rabbia +rgMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,rania,rania,\\"rania Brady\\",\\"rania Brady\\",FEMALE,24,Brady,Brady,\\"(empty)\\",Friday,4,\\"rania@brady-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561997,\\"sold_product_561997_16402, sold_product_561997_12822\\",\\"sold_product_561997_16402, sold_product_561997_12822\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"17.484, 7.82\\",\\"33, 16.984\\",\\"16,402, 12,822\\",\\"Shirt - navy blazer, Platform sandals - navy\\",\\"Shirt - navy blazer, Platform sandals - navy\\",\\"1, 1\\",\\"ZO0346203462, ZO0010700107\\",\\"0, 0\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"0, 0\\",\\"ZO0346203462, ZO0010700107\\",\\"49.969\\",\\"49.969\\",2,2,order,rani +rwMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",EUR,Gwen,Gwen,\\"Gwen Butler\\",\\"Gwen Butler\\",FEMALE,26,Butler,Butler,\\"(empty)\\",Friday,4,\\"gwen@butler-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561534,\\"sold_product_561534_25055, sold_product_561534_15461\\",\\"sold_product_561534_25055, sold_product_561534_15461\\",\\"50, 16.984\\",\\"50, 16.984\\",\\"Women's Shoes, Women's Accessories\\",\\"Women's Shoes, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"23, 8.492\\",\\"50, 16.984\\",\\"25,055, 15,461\\",\\"Ankle boots - Dodger Blue, Across body bag - black \\",\\"Ankle boots - Dodger Blue, Across body bag - black \\",\\"1, 1\\",\\"ZO0380303803, ZO0211902119\\",\\"0, 0\\",\\"50, 16.984\\",\\"50, 16.984\\",\\"0, 0\\",\\"ZO0380303803, ZO0211902119\\",67,67,2,2,order,gwen +sQMtOW0BH63Xcmy44WRv,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Wagdi,Wagdi,\\"Wagdi Graham\\",\\"Wagdi Graham\\",MALE,15,Graham,Graham,\\"(empty)\\",Friday,4,\\"wagdi@graham-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",Elitelligence,Elitelligence,\\"Jun 20, 2019 @ 00:00:00.000\\",561632,\\"sold_product_561632_19048, sold_product_561632_15628\\",\\"sold_product_561632_19048, sold_product_561632_15628\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"5.93, 10.078\\",\\"10.992, 20.984\\",\\"19,048, 15,628\\",\\"Long sleeved top - lt grey/dk grey , Watch - brown\\",\\"Long sleeved top - lt grey/dk grey , Watch - brown\\",\\"1, 1\\",\\"ZO0546605466, ZO0600906009\\",\\"0, 0\\",\\"10.992, 20.984\\",\\"10.992, 20.984\\",\\"0, 0\\",\\"ZO0546605466, ZO0600906009\\",\\"31.984\\",\\"31.984\\",2,2,order,wagdi +DwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Romero\\",\\"Mostafa Romero\\",MALE,9,Romero,Romero,\\"(empty)\\",Friday,4,\\"mostafa@romero-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561676,\\"sold_product_561676_1702, sold_product_561676_11429\\",\\"sold_product_561676_1702, sold_product_561676_11429\\",\\"25.984, 10.992\\",\\"25.984, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Spritechnologies\\",\\"Elitelligence, Spritechnologies\\",\\"12.219, 5.391\\",\\"25.984, 10.992\\",\\"1,702, 11,429\\",\\"Trainers - black/grey, Swimming shorts - lime punch\\",\\"Trainers - black/grey, Swimming shorts - lime punch\\",\\"1, 1\\",\\"ZO0512705127, ZO0629406294\\",\\"0, 0\\",\\"25.984, 10.992\\",\\"25.984, 10.992\\",\\"0, 0\\",\\"ZO0512705127, ZO0629406294\\",\\"36.969\\",\\"36.969\\",2,2,order,mostafa +EAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Estrada\\",\\"Abdulraheem Al Estrada\\",MALE,33,Estrada,Estrada,\\"(empty)\\",Friday,4,\\"abdulraheem al@estrada-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561218,\\"sold_product_561218_14074, sold_product_561218_12696\\",\\"sold_product_561218_14074, sold_product_561218_12696\\",\\"60, 75\\",\\"60, 75\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"27.594, 36.75\\",\\"60, 75\\",\\"14,074, 12,696\\",\\"Suit jacket - dark blue, Briefcase - brandy\\",\\"Suit jacket - dark blue, Briefcase - brandy\\",\\"1, 1\\",\\"ZO0409604096, ZO0466904669\\",\\"0, 0\\",\\"60, 75\\",\\"60, 75\\",\\"0, 0\\",\\"ZO0409604096, ZO0466904669\\",135,135,2,2,order,abdulraheem +EQMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Diane,Diane,\\"Diane Reese\\",\\"Diane Reese\\",FEMALE,22,Reese,Reese,\\"(empty)\\",Friday,4,\\"diane@reese-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",Pyramidustries,Pyramidustries,\\"Jun 20, 2019 @ 00:00:00.000\\",561256,\\"sold_product_561256_23086, sold_product_561256_16589\\",\\"sold_product_561256_23086, sold_product_561256_16589\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"12.742, 8.492\\",\\"24.984, 16.984\\",\\"23,086, 16,589\\",\\"Jersey dress - black, Long sleeved top - black\\",\\"Jersey dress - black, Long sleeved top - black\\",\\"1, 1\\",\\"ZO0151601516, ZO0162901629\\",\\"0, 0\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"0, 0\\",\\"ZO0151601516, ZO0162901629\\",\\"41.969\\",\\"41.969\\",2,2,order,diane +EgMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Rivera\\",\\"Jackson Rivera\\",MALE,13,Rivera,Rivera,\\"(empty)\\",Friday,4,\\"jackson@rivera-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561311,\\"sold_product_561311_22466, sold_product_561311_13378\\",\\"sold_product_561311_22466, sold_product_561311_13378\\",\\"20.984, 50\\",\\"20.984, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"10.703, 24.5\\",\\"20.984, 50\\",\\"22,466, 13,378\\",\\"Sweatshirt - black , Casual lace-ups - cognac\\",\\"Sweatshirt - black , Casual lace-ups - cognac\\",\\"1, 1\\",\\"ZO0458604586, ZO0391603916\\",\\"0, 0\\",\\"20.984, 50\\",\\"20.984, 50\\",\\"0, 0\\",\\"ZO0458604586, ZO0391603916\\",71,71,2,2,order,jackson +EwMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Mccarthy\\",\\"Wilhemina St. Mccarthy\\",FEMALE,17,Mccarthy,Mccarthy,\\"(empty)\\",Friday,4,\\"wilhemina st.@mccarthy-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561781,\\"sold_product_561781_5453, sold_product_561781_15437\\",\\"sold_product_561781_5453, sold_product_561781_15437\\",\\"50, 33\\",\\"50, 33\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"26.984, 18.141\\",\\"50, 33\\",\\"5,453, 15,437\\",\\"Slip-ons - Midnight Blue, Summer dress - black\\",\\"Slip-ons - Midnight Blue, Summer dress - black\\",\\"1, 1\\",\\"ZO0235402354, ZO0048700487\\",\\"0, 0\\",\\"50, 33\\",\\"50, 33\\",\\"0, 0\\",\\"ZO0235402354, ZO0048700487\\",83,83,2,2,order,wilhemina +ewMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Kamal,Kamal,\\"Kamal Garza\\",\\"Kamal Garza\\",MALE,39,Garza,Garza,\\"(empty)\\",Friday,4,\\"kamal@garza-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561375,\\"sold_product_561375_2773, sold_product_561375_18549\\",\\"sold_product_561375_2773, sold_product_561375_18549\\",\\"85, 24.984\\",\\"85, 24.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"39.094, 11.5\\",\\"85, 24.984\\",\\"2,773, 18,549\\",\\"Winter jacket - black, Trousers - dark blue\\",\\"Winter jacket - black, Trousers - dark blue\\",\\"1, 1\\",\\"ZO0115201152, ZO0420404204\\",\\"0, 0\\",\\"85, 24.984\\",\\"85, 24.984\\",\\"0, 0\\",\\"ZO0115201152, ZO0420404204\\",110,110,2,2,order,kamal +fAMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Brigitte,Brigitte,\\"Brigitte Simpson\\",\\"Brigitte Simpson\\",FEMALE,12,Simpson,Simpson,\\"(empty)\\",Friday,4,\\"brigitte@simpson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561876,\\"sold_product_561876_11067, sold_product_561876_20664\\",\\"sold_product_561876_11067, sold_product_561876_20664\\",\\"13.992, 28.984\\",\\"13.992, 28.984\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"7.27, 14.781\\",\\"13.992, 28.984\\",\\"11,067, 20,664\\",\\"Print T-shirt - black/turquoise, Trainers - navy/black\\",\\"Print T-shirt - black/turquoise, Trainers - navy/black\\",\\"1, 1\\",\\"ZO0170301703, ZO0027000270\\",\\"0, 0\\",\\"13.992, 28.984\\",\\"13.992, 28.984\\",\\"0, 0\\",\\"ZO0170301703, ZO0027000270\\",\\"42.969\\",\\"42.969\\",2,2,order,brigitte +fQMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Chapman\\",\\"Betty Chapman\\",FEMALE,44,Chapman,Chapman,\\"(empty)\\",Friday,4,\\"betty@chapman-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 20, 2019 @ 00:00:00.000\\",561633,\\"sold_product_561633_23859, sold_product_561633_7687\\",\\"sold_product_561633_23859, sold_product_561633_7687\\",\\"16.984, 13.992\\",\\"16.984, 13.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"8.328, 6.719\\",\\"16.984, 13.992\\",\\"23,859, 7,687\\",\\"Long sleeved top - berry, Print T-shirt - black\\",\\"Long sleeved top - berry, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0165001650, ZO0159001590\\",\\"0, 0\\",\\"16.984, 13.992\\",\\"16.984, 13.992\\",\\"0, 0\\",\\"ZO0165001650, ZO0159001590\\",\\"30.984\\",\\"30.984\\",2,2,order,betty +4wMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Wood\\",\\"Elyssa Wood\\",FEMALE,27,Wood,Wood,\\"(empty)\\",Friday,4,\\"elyssa@wood-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562323,\\"sold_product_562323_17653, sold_product_562323_25172\\",\\"sold_product_562323_17653, sold_product_562323_25172\\",\\"65, 20.984\\",\\"65, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Spherecords\\",\\"Oceanavigations, Spherecords\\",\\"31.844, 11.539\\",\\"65, 20.984\\",\\"17,653, 25,172\\",\\"Classic heels - blush, Blouse - black\\",\\"Classic heels - blush, Blouse - black\\",\\"1, 1\\",\\"ZO0238502385, ZO0650406504\\",\\"0, 0\\",\\"65, 20.984\\",\\"65, 20.984\\",\\"0, 0\\",\\"ZO0238502385, ZO0650406504\\",86,86,2,2,order,elyssa +5AMtOW0BH63Xcmy44mWR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Elyssa,Elyssa,\\"Elyssa Nash\\",\\"Elyssa Nash\\",FEMALE,27,Nash,Nash,\\"(empty)\\",Friday,4,\\"elyssa@nash-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562358,\\"sold_product_562358_15777, sold_product_562358_20699\\",\\"sold_product_562358_15777, sold_product_562358_20699\\",\\"60, 18.984\\",\\"60, 18.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Tigress Enterprises\\",\\"Gnomehouse, Tigress Enterprises\\",\\"33, 9.68\\",\\"60, 18.984\\",\\"15,777, 20,699\\",\\"Summer dress - Lemon Chiffon, Watch - black\\",\\"Summer dress - Lemon Chiffon, Watch - black\\",\\"1, 1\\",\\"ZO0337303373, ZO0079600796\\",\\"0, 0\\",\\"60, 18.984\\",\\"60, 18.984\\",\\"0, 0\\",\\"ZO0337303373, ZO0079600796\\",79,79,2,2,order,elyssa +DwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes, Men's Accessories\\",\\"Men's Clothing, Men's Shoes, Men's Accessories\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Bryan\\",\\"Sultan Al Bryan\\",MALE,19,Bryan,Bryan,\\"(empty)\\",Friday,4,\\"sultan al@bryan-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Oceanavigations, (empty), Low Tide Media\\",\\"Oceanavigations, (empty), Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",718360,\\"sold_product_718360_16955, sold_product_718360_20827, sold_product_718360_14564, sold_product_718360_21672\\",\\"sold_product_718360_16955, sold_product_718360_20827, sold_product_718360_14564, sold_product_718360_21672\\",\\"200, 165, 10.992, 16.984\\",\\"200, 165, 10.992, 16.984\\",\\"Men's Clothing, Men's Shoes, Men's Accessories, Men's Clothing\\",\\"Men's Clothing, Men's Shoes, Men's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, (empty), Low Tide Media, Low Tide Media\\",\\"Oceanavigations, (empty), Low Tide Media, Low Tide Media\\",\\"92, 85.813, 4.949, 9\\",\\"200, 165, 10.992, 16.984\\",\\"16,955, 20,827, 14,564, 21,672\\",\\"Classic coat - navy, Boots - black, Hat - light grey multicolor, Polo shirt - black multicolor\\",\\"Classic coat - navy, Boots - black, Hat - light grey multicolor, Polo shirt - black multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0291402914, ZO0483804838, ZO0460304603, ZO0443904439\\",\\"0, 0, 0, 0\\",\\"200, 165, 10.992, 16.984\\",\\"200, 165, 10.992, 16.984\\",\\"0, 0, 0, 0\\",\\"ZO0291402914, ZO0483804838, ZO0460304603, ZO0443904439\\",393,393,4,4,order,sultan +JgMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Jim,Jim,\\"Jim Rowe\\",\\"Jim Rowe\\",MALE,41,Rowe,Rowe,\\"(empty)\\",Friday,4,\\"jim@rowe-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561969,\\"sold_product_561969_1737, sold_product_561969_14073\\",\\"sold_product_561969_1737, sold_product_561969_14073\\",\\"42, 33\\",\\"42, 33\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"18.906, 17.156\\",\\"42, 33\\",\\"1,737, 14,073\\",\\"Lace-up boots - brown, Briefcase - brown \\",\\"Lace-up boots - brown, Briefcase - brown \\",\\"1, 1\\",\\"ZO0521205212, ZO0316003160\\",\\"0, 0\\",\\"42, 33\\",\\"42, 33\\",\\"0, 0\\",\\"ZO0521205212, ZO0316003160\\",75,75,2,2,order,jim +JwMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Mary,Mary,\\"Mary Garza\\",\\"Mary Garza\\",FEMALE,20,Garza,Garza,\\"(empty)\\",Friday,4,\\"mary@garza-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562011,\\"sold_product_562011_7816, sold_product_562011_13449\\",\\"sold_product_562011_7816, sold_product_562011_13449\\",\\"33, 75\\",\\"33, 75\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"16.5, 37.5\\",\\"33, 75\\",\\"7,816, 13,449\\",\\"Cardigan - Sky Blue, Ankle boots - black\\",\\"Cardigan - Sky Blue, Ankle boots - black\\",\\"1, 1\\",\\"ZO0068200682, ZO0245202452\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0068200682, ZO0245202452\\",108,108,2,2,order,mary +oAMtOW0BH63Xcmy44maR,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories, Men's Shoes\\",\\"Men's Clothing, Men's Accessories, Men's Shoes\\",EUR,Eddie,Eddie,\\"Eddie Hodges\\",\\"Eddie Hodges\\",MALE,38,Hodges,Hodges,\\"(empty)\\",Friday,4,\\"eddie@hodges-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Microlutions, Low Tide Media, Angeldale\\",\\"Microlutions, Low Tide Media, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",719185,\\"sold_product_719185_18940, sold_product_719185_24924, sold_product_719185_20248, sold_product_719185_24003\\",\\"sold_product_719185_18940, sold_product_719185_24924, sold_product_719185_20248, sold_product_719185_24003\\",\\"14.992, 10.992, 60, 100\\",\\"14.992, 10.992, 60, 100\\",\\"Men's Clothing, Men's Clothing, Men's Accessories, Men's Shoes\\",\\"Men's Clothing, Men's Clothing, Men's Accessories, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Microlutions, Low Tide Media, Low Tide Media, Angeldale\\",\\"Microlutions, Low Tide Media, Low Tide Media, Angeldale\\",\\"7.352, 5.711, 33, 47\\",\\"14.992, 10.992, 60, 100\\",\\"18,940, 24,924, 20,248, 24,003\\",\\"Basic T-shirt - marshmallow, Print T-shirt - navy, Across body bag - black, Lace-ups - Midnight Blue\\",\\"Basic T-shirt - marshmallow, Print T-shirt - navy, Across body bag - black, Lace-ups - Midnight Blue\\",\\"1, 1, 1, 1\\",\\"ZO0118601186, ZO0438904389, ZO0468004680, ZO0684106841\\",\\"0, 0, 0, 0\\",\\"14.992, 10.992, 60, 100\\",\\"14.992, 10.992, 60, 100\\",\\"0, 0, 0, 0\\",\\"ZO0118601186, ZO0438904389, ZO0468004680, ZO0684106841\\",186,186,4,4,order,eddie +rQMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Evans\\",\\"Selena Evans\\",FEMALE,42,Evans,Evans,\\"(empty)\\",Friday,4,\\"selena@evans-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561669,\\"sold_product_561669_11107, sold_product_561669_19052\\",\\"sold_product_561669_11107, sold_product_561669_19052\\",\\"20.984, 14.992\\",\\"20.984, 14.992\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"11.117, 7.051\\",\\"20.984, 14.992\\",\\"11,107, 19,052\\",\\"Pyjamas - grey/pink , 2 PACK - Basic T-shirt - black/white\\",\\"Pyjamas - grey/pink , 2 PACK - Basic T-shirt - black/white\\",\\"1, 1\\",\\"ZO0100001000, ZO0642406424\\",\\"0, 0\\",\\"20.984, 14.992\\",\\"20.984, 14.992\\",\\"0, 0\\",\\"ZO0100001000, ZO0642406424\\",\\"35.969\\",\\"35.969\\",2,2,order,selena +rgMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Wood\\",\\"Wilhemina St. Wood\\",FEMALE,17,Wood,Wood,\\"(empty)\\",Friday,4,\\"wilhemina st.@wood-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Spherecords, Tigress Enterprises Curvy\\",\\"Spherecords, Tigress Enterprises Curvy\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561225,\\"sold_product_561225_16493, sold_product_561225_13770\\",\\"sold_product_561225_16493, sold_product_561225_13770\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises Curvy\\",\\"Spherecords, Tigress Enterprises Curvy\\",\\"12.492, 22.672\\",\\"24.984, 42\\",\\"16,493, 13,770\\",\\"Dressing gown - pale pink, Summer dress - peacoat\\",\\"Dressing gown - pale pink, Summer dress - peacoat\\",\\"1, 1\\",\\"ZO0660906609, ZO0102801028\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0660906609, ZO0102801028\\",67,67,2,2,order,wilhemina +rwMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Hampton\\",\\"Abigail Hampton\\",FEMALE,46,Hampton,Hampton,\\"(empty)\\",Friday,4,\\"abigail@hampton-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561284,\\"sold_product_561284_13751, sold_product_561284_24729\\",\\"sold_product_561284_13751, sold_product_561284_24729\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"11.5, 8.156\\",\\"24.984, 16.984\\",\\"13,751, 24,729\\",\\"Rucksack - black, Vest - black\\",\\"Rucksack - black, Vest - black\\",\\"1, 1\\",\\"ZO0086300863, ZO0171901719\\",\\"0, 0\\",\\"24.984, 16.984\\",\\"24.984, 16.984\\",\\"0, 0\\",\\"ZO0086300863, ZO0171901719\\",\\"41.969\\",\\"41.969\\",2,2,order,abigail +sAMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Rodriguez\\",\\"Gwen Rodriguez\\",FEMALE,26,Rodriguez,Rodriguez,\\"(empty)\\",Friday,4,\\"gwen@rodriguez-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561735,\\"sold_product_561735_15452, sold_product_561735_17692\\",\\"sold_product_561735_15452, sold_product_561735_17692\\",\\"33, 20.984\\",\\"33, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"17.813, 9.656\\",\\"33, 20.984\\",\\"15,452, 17,692\\",\\"High heels - black, Long sleeved top - peacoat\\",\\"High heels - black, Long sleeved top - peacoat\\",\\"1, 1\\",\\"ZO0006300063, ZO0058400584\\",\\"0, 0\\",\\"33, 20.984\\",\\"33, 20.984\\",\\"0, 0\\",\\"ZO0006300063, ZO0058400584\\",\\"53.969\\",\\"53.969\\",2,2,order,gwen +sQMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Abd,Abd,\\"Abd Fleming\\",\\"Abd Fleming\\",MALE,52,Fleming,Fleming,\\"(empty)\\",Friday,4,\\"abd@fleming-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561798,\\"sold_product_561798_23272, sold_product_561798_19140\\",\\"sold_product_561798_23272, sold_product_561798_19140\\",\\"100, 24.984\\",\\"100, 24.984\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"54, 13.742\\",\\"100, 24.984\\",\\"23,272, 19,140\\",\\"Lace-ups - bianco, Across body bag - black/dark brown\\",\\"Lace-ups - bianco, Across body bag - black/dark brown\\",\\"1, 1\\",\\"ZO0684006840, ZO0469104691\\",\\"0, 0\\",\\"100, 24.984\\",\\"100, 24.984\\",\\"0, 0\\",\\"ZO0684006840, ZO0469104691\\",125,125,2,2,order,abd +3QMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Morrison\\",\\"Elyssa Morrison\\",FEMALE,27,Morrison,Morrison,\\"(empty)\\",Friday,4,\\"elyssa@morrison-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Pyramidustries, Microlutions\\",\\"Pyramidustries, Microlutions\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562047,\\"sold_product_562047_19148, sold_product_562047_11032\\",\\"sold_product_562047_19148, sold_product_562047_11032\\",\\"11.992, 75\\",\\"11.992, 75\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Microlutions\\",\\"Pyramidustries, Microlutions\\",\\"6.109, 38.25\\",\\"11.992, 75\\",\\"19,148, 11,032\\",\\"Clutch - black, Parka - mottled grey\\",\\"Clutch - black, Parka - mottled grey\\",\\"1, 1\\",\\"ZO0203102031, ZO0115701157\\",\\"0, 0\\",\\"11.992, 75\\",\\"11.992, 75\\",\\"0, 0\\",\\"ZO0203102031, ZO0115701157\\",87,87,2,2,order,elyssa +3gMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Muniz,Muniz,\\"Muniz Reese\\",\\"Muniz Reese\\",MALE,37,Reese,Reese,\\"(empty)\\",Friday,4,\\"muniz@reese-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562107,\\"sold_product_562107_18292, sold_product_562107_23258\\",\\"sold_product_562107_18292, sold_product_562107_23258\\",\\"100, 20.984\\",\\"100, 20.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"52, 10.289\\",\\"100, 20.984\\",\\"18,292, 23,258\\",\\"Snowboard jacket - mottled grey, Jumper - grey/dark blue\\",\\"Snowboard jacket - mottled grey, Jumper - grey/dark blue\\",\\"1, 1\\",\\"ZO0624806248, ZO0579405794\\",\\"0, 0\\",\\"100, 20.984\\",\\"100, 20.984\\",\\"0, 0\\",\\"ZO0624806248, ZO0579405794\\",121,121,2,2,order,muniz +3wMtOW0BH63Xcmy442bU,ecommerce,\\"-\\",\\"Men's Shoes\\",\\"Men's Shoes\\",EUR,Samir,Samir,\\"Samir Foster\\",\\"Samir Foster\\",MALE,34,Foster,Foster,\\"(empty)\\",Friday,4,\\"samir@foster-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562290,\\"sold_product_562290_1665, sold_product_562290_24934\\",\\"sold_product_562290_1665, sold_product_562290_24934\\",\\"65, 50\\",\\"65, 50\\",\\"Men's Shoes, Men's Shoes\\",\\"Men's Shoes, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"31.203, 22.5\\",\\"65, 50\\",\\"1,665, 24,934\\",\\"Boots - light brown, Lace-up boots - resin coffee\\",\\"Boots - light brown, Lace-up boots - resin coffee\\",\\"1, 1\\",\\"ZO0686106861, ZO0403504035\\",\\"0, 0\\",\\"65, 50\\",\\"65, 50\\",\\"0, 0\\",\\"ZO0686106861, ZO0403504035\\",115,115,2,2,order,samir +PAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Harvey\\",\\"Abd Harvey\\",MALE,52,Harvey,Harvey,\\"(empty)\\",Friday,4,\\"abd@harvey-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",720967,\\"sold_product_720967_24934, sold_product_720967_12278, sold_product_720967_14535, sold_product_720967_17629\\",\\"sold_product_720967_24934, sold_product_720967_12278, sold_product_720967_14535, sold_product_720967_17629\\",\\"50, 11.992, 28.984, 24.984\\",\\"50, 11.992, 28.984, 24.984\\",\\"Men's Shoes, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Elitelligence, Elitelligence, Elitelligence\\",\\"Low Tide Media, Elitelligence, Elitelligence, Elitelligence\\",\\"22.5, 6, 13.922, 12.992\\",\\"50, 11.992, 28.984, 24.984\\",\\"24,934, 12,278, 14,535, 17,629\\",\\"Lace-up boots - resin coffee, Print T-shirt - black, Boots - brown, Tracksuit bottoms - mottled grey\\",\\"Lace-up boots - resin coffee, Print T-shirt - black, Boots - brown, Tracksuit bottoms - mottled grey\\",\\"1, 1, 1, 1\\",\\"ZO0403504035, ZO0553005530, ZO0519905199, ZO0528605286\\",\\"0, 0, 0, 0\\",\\"50, 11.992, 28.984, 24.984\\",\\"50, 11.992, 28.984, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0403504035, ZO0553005530, ZO0519905199, ZO0528605286\\",\\"115.938\\",\\"115.938\\",4,4,order,abd +bQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Nash\\",\\"Fitzgerald Nash\\",MALE,11,Nash,Nash,\\"(empty)\\",Friday,4,\\"fitzgerald@nash-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561564,\\"sold_product_561564_6597, sold_product_561564_12482\\",\\"sold_product_561564_6597, sold_product_561564_12482\\",\\"17.984, 60\\",\\"17.984, 60\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"9.531, 30\\",\\"17.984, 60\\",\\"6,597, 12,482\\",\\"Jumper - dark grey multicolor, Across body bag - black\\",\\"Jumper - dark grey multicolor, Across body bag - black\\",\\"1, 1\\",\\"ZO0451204512, ZO0463804638\\",\\"0, 0\\",\\"17.984, 60\\",\\"17.984, 60\\",\\"0, 0\\",\\"ZO0451204512, ZO0463804638\\",78,78,2,2,order,fuzzy +cAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Hopkins\\",\\"Elyssa Hopkins\\",FEMALE,27,Hopkins,Hopkins,\\"(empty)\\",Friday,4,\\"elyssa@hopkins-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561444,\\"sold_product_561444_21181, sold_product_561444_11368\\",\\"sold_product_561444_21181, sold_product_561444_11368\\",\\"21.984, 33\\",\\"21.984, 33\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"10.563, 15.18\\",\\"21.984, 33\\",\\"21,181, 11,368\\",\\"Cardigan - beige, Slip-ons - beige \\",\\"Cardigan - beige, Slip-ons - beige \\",\\"1, 1\\",\\"ZO0651806518, ZO0369703697\\",\\"0, 0\\",\\"21.984, 33\\",\\"21.984, 33\\",\\"0, 0\\",\\"ZO0651806518, ZO0369703697\\",\\"54.969\\",\\"54.969\\",2,2,order,elyssa +cQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Brady\\",\\"Betty Brady\\",FEMALE,44,Brady,Brady,\\"(empty)\\",Friday,4,\\"betty@brady-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 20, 2019 @ 00:00:00.000\\",561482,\\"sold_product_561482_8985, sold_product_561482_15058\\",\\"sold_product_561482_8985, sold_product_561482_15058\\",\\"60, 33\\",\\"60, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"27.594, 16.172\\",\\"60, 33\\",\\"8,985, 15,058\\",\\"Light jacket - cognac, Faux leather jacket - pink\\",\\"Light jacket - cognac, Faux leather jacket - pink\\",\\"1, 1\\",\\"ZO0184901849, ZO0174301743\\",\\"0, 0\\",\\"60, 33\\",\\"60, 33\\",\\"0, 0\\",\\"ZO0184901849, ZO0174301743\\",93,93,2,2,order,betty +jgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Mostafa,Mostafa,\\"Mostafa Hopkins\\",\\"Mostafa Hopkins\\",MALE,9,Hopkins,Hopkins,\\"(empty)\\",Friday,4,\\"mostafa@hopkins-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562456,\\"sold_product_562456_11345, sold_product_562456_15411\\",\\"sold_product_562456_11345, sold_product_562456_15411\\",\\"7.988, 16.984\\",\\"7.988, 16.984\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"3.76, 7.82\\",\\"7.988, 16.984\\",\\"11,345, 15,411\\",\\"Tie - grey, Belt - black\\",\\"Tie - grey, Belt - black\\",\\"1, 1\\",\\"ZO0276302763, ZO0701407014\\",\\"0, 0\\",\\"7.988, 16.984\\",\\"7.988, 16.984\\",\\"0, 0\\",\\"ZO0276302763, ZO0701407014\\",\\"24.984\\",\\"24.984\\",2,2,order,mostafa +jwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Tyler\\",\\"Rabbia Al Tyler\\",FEMALE,5,Tyler,Tyler,\\"(empty)\\",Friday,4,\\"rabbia al@tyler-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562499,\\"sold_product_562499_5501, sold_product_562499_20439\\",\\"sold_product_562499_5501, sold_product_562499_20439\\",\\"75, 22.984\\",\\"75, 22.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"Oceanavigations, Tigress Enterprises Curvy\\",\\"40.5, 11.492\\",\\"75, 22.984\\",\\"5,501, 20,439\\",\\"Ankle boots - Midnight Blue, Blouse - black\\",\\"Ankle boots - Midnight Blue, Blouse - black\\",\\"1, 1\\",\\"ZO0244802448, ZO0105701057\\",\\"0, 0\\",\\"75, 22.984\\",\\"75, 22.984\\",\\"0, 0\\",\\"ZO0244802448, ZO0105701057\\",98,98,2,2,order,rabbia +kAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Yuri,Yuri,\\"Yuri James\\",\\"Yuri James\\",MALE,21,James,James,\\"(empty)\\",Friday,4,\\"yuri@james-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562152,\\"sold_product_562152_17873, sold_product_562152_19670\\",\\"sold_product_562152_17873, sold_product_562152_19670\\",\\"10.992, 37\\",\\"10.992, 37\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"5.602, 19.594\\",\\"10.992, 37\\",\\"17,873, 19,670\\",\\"Sports shirt - Seashell, Tracksuit top - black\\",\\"Sports shirt - Seashell, Tracksuit top - black\\",\\"1, 1\\",\\"ZO0616606166, ZO0589705897\\",\\"0, 0\\",\\"10.992, 37\\",\\"10.992, 37\\",\\"0, 0\\",\\"ZO0616606166, ZO0589705897\\",\\"47.969\\",\\"47.969\\",2,2,order,yuri +kQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Gibbs\\",\\"Wilhemina St. Gibbs\\",FEMALE,17,Gibbs,Gibbs,\\"(empty)\\",Friday,4,\\"wilhemina st.@gibbs-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562192,\\"sold_product_562192_18762, sold_product_562192_21085\\",\\"sold_product_562192_18762, sold_product_562192_21085\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"8.656, 7.988\\",\\"16.984, 16.984\\",\\"18,762, 21,085\\",\\"Watch - nude, Vest - black\\",\\"Watch - nude, Vest - black\\",\\"1, 1\\",\\"ZO0079700797, ZO0168201682\\",\\"0, 0\\",\\"16.984, 16.984\\",\\"16.984, 16.984\\",\\"0, 0\\",\\"ZO0079700797, ZO0168201682\\",\\"33.969\\",\\"33.969\\",2,2,order,wilhemina +lAMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Jim,Jim,\\"Jim Graves\\",\\"Jim Graves\\",MALE,41,Graves,Graves,\\"(empty)\\",Friday,4,\\"jim@graves-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Elitelligence,Elitelligence,\\"Jun 20, 2019 @ 00:00:00.000\\",562528,\\"sold_product_562528_11997, sold_product_562528_14014\\",\\"sold_product_562528_11997, sold_product_562528_14014\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"9.172, 20.156\\",\\"16.984, 42\\",\\"11,997, 14,014\\",\\"College - Polo shirt - dark red, Weekend bag - dark brown\\",\\"College - Polo shirt - dark red, Weekend bag - dark brown\\",\\"1, 1\\",\\"ZO0522905229, ZO0608606086\\",\\"0, 0\\",\\"16.984, 42\\",\\"16.984, 42\\",\\"0, 0\\",\\"ZO0522905229, ZO0608606086\\",\\"58.969\\",\\"58.969\\",2,2,order,jim +mgMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Lewis\\",\\"Tariq Lewis\\",MALE,25,Lewis,Lewis,\\"(empty)\\",Friday,4,\\"tariq@lewis-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Oceanavigations, Low Tide Media, Elitelligence\\",\\"Oceanavigations, Low Tide Media, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",715286,\\"sold_product_715286_19758, sold_product_715286_12040, sold_product_715286_3096, sold_product_715286_13247\\",\\"sold_product_715286_19758, sold_product_715286_12040, sold_product_715286_3096, sold_product_715286_13247\\",\\"50, 24.984, 24.984, 11.992\\",\\"50, 24.984, 24.984, 11.992\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, Oceanavigations, Low Tide Media, Elitelligence\\",\\"Oceanavigations, Oceanavigations, Low Tide Media, Elitelligence\\",\\"25, 12.492, 11.25, 5.641\\",\\"50, 24.984, 24.984, 11.992\\",\\"19,758, 12,040, 3,096, 13,247\\",\\"Sweatshirt - grey multicolor, Shirt - navy, Jumper - dark blue, Pyjama bottoms - light grey multicolor\\",\\"Sweatshirt - grey multicolor, Shirt - navy, Jumper - dark blue, Pyjama bottoms - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0299802998, ZO0278702787, ZO0448104481, ZO0611906119\\",\\"0, 0, 0, 0\\",\\"50, 24.984, 24.984, 11.992\\",\\"50, 24.984, 24.984, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0299802998, ZO0278702787, ZO0448104481, ZO0611906119\\",\\"111.938\\",\\"111.938\\",4,4,order,tariq +vQMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Mckenzie\\",\\"Jackson Mckenzie\\",MALE,13,Mckenzie,Mckenzie,\\"(empty)\\",Friday,4,\\"jackson@mckenzie-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561210,\\"sold_product_561210_11019, sold_product_561210_7024\\",\\"sold_product_561210_11019, sold_product_561210_7024\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"16.813, 9\\",\\"33, 16.984\\",\\"11,019, 7,024\\",\\"Sandals - black, 3 PACK - Basic T-shirt - white/black/grey\\",\\"Sandals - black, 3 PACK - Basic T-shirt - white/black/grey\\",\\"1, 1\\",\\"ZO0407404074, ZO0473704737\\",\\"0, 0\\",\\"33, 16.984\\",\\"33, 16.984\\",\\"0, 0\\",\\"ZO0407404074, ZO0473704737\\",\\"49.969\\",\\"49.969\\",2,2,order,jackson +zwMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",EUR,Jim,Jim,\\"Jim Jensen\\",\\"Jim Jensen\\",MALE,41,Jensen,Jensen,\\"(empty)\\",Friday,4,\\"jim@jensen-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562337,\\"sold_product_562337_18692, sold_product_562337_15189\\",\\"sold_product_562337_18692, sold_product_562337_15189\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"Men's Shoes, Men's Accessories\\",\\"Men's Shoes, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"12.992, 35.75\\",\\"24.984, 65\\",\\"18,692, 15,189\\",\\"High-top trainers - green, Crossover Strap Bag\\",\\"High-top trainers - green, Crossover Strap Bag\\",\\"1, 1\\",\\"ZO0513005130, ZO0463704637\\",\\"0, 0\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"0, 0\\",\\"ZO0513005130, ZO0463704637\\",90,90,2,2,order,jim +5gMtOW0BH63Xcmy442fU,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Lamb\\",\\"Sultan Al Lamb\\",MALE,19,Lamb,Lamb,\\"(empty)\\",Friday,4,\\"sultan al@lamb-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"(empty), Elitelligence, Microlutions, Spritechnologies\\",\\"(empty), Elitelligence, Microlutions, Spritechnologies\\",\\"Jun 20, 2019 @ 00:00:00.000\\",713242,\\"sold_product_713242_12836, sold_product_713242_20514, sold_product_713242_19994, sold_product_713242_11377\\",\\"sold_product_713242_12836, sold_product_713242_20514, sold_product_713242_19994, sold_product_713242_11377\\",\\"165, 24.984, 6.988, 10.992\\",\\"165, 24.984, 6.988, 10.992\\",\\"Men's Shoes, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Shoes, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"(empty), Elitelligence, Microlutions, Spritechnologies\\",\\"(empty), Elitelligence, Microlutions, Spritechnologies\\",\\"80.875, 11.5, 3.631, 5.711\\",\\"165, 24.984, 6.988, 10.992\\",\\"12,836, 20,514, 19,994, 11,377\\",\\"Lace-ups - brown, Jumper - black, STAY TRUE 2 PACK - Socks - white/grey/black, Swimming shorts - dark red\\",\\"Lace-ups - brown, Jumper - black, STAY TRUE 2 PACK - Socks - white/grey/black, Swimming shorts - dark red\\",\\"1, 1, 1, 1\\",\\"ZO0482004820, ZO0577105771, ZO0130201302, ZO0629006290\\",\\"0, 0, 0, 0\\",\\"165, 24.984, 6.988, 10.992\\",\\"165, 24.984, 6.988, 10.992\\",\\"0, 0, 0, 0\\",\\"ZO0482004820, ZO0577105771, ZO0130201302, ZO0629006290\\",208,208,4,4,order,sultan +JQMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Palmer\\",\\"Boris Palmer\\",MALE,36,Palmer,Palmer,\\"(empty)\\",Friday,4,\\"boris@palmer-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561657,\\"sold_product_561657_13024, sold_product_561657_23055\\",\\"sold_product_561657_13024, sold_product_561657_23055\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Oceanavigations\\",\\"Microlutions, Oceanavigations\\",\\"12, 21.828\\",\\"24.984, 42\\",\\"13,024, 23,055\\",\\"Tracksuit bottoms - red, Waistcoat - black\\",\\"Tracksuit bottoms - red, Waistcoat - black\\",\\"1, 1\\",\\"ZO0111701117, ZO0288002880\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0111701117, ZO0288002880\\",67,67,2,2,order,boris +JgMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Mccarthy\\",\\"Elyssa Mccarthy\\",FEMALE,27,Mccarthy,Mccarthy,\\"(empty)\\",Friday,4,\\"elyssa@mccarthy-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561254,\\"sold_product_561254_12768, sold_product_561254_20992\\",\\"sold_product_561254_12768, sold_product_561254_20992\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"5.5, 14.211\\",\\"10.992, 28.984\\",\\"12,768, 20,992\\",\\"Snood - nude, Ankle boots - black\\",\\"Snood - nude, Ankle boots - black\\",\\"1, 1\\",\\"ZO0081400814, ZO0022500225\\",\\"0, 0\\",\\"10.992, 28.984\\",\\"10.992, 28.984\\",\\"0, 0\\",\\"ZO0081400814, ZO0022500225\\",\\"39.969\\",\\"39.969\\",2,2,order,elyssa +JwMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Sonya,Sonya,\\"Sonya Jimenez\\",\\"Sonya Jimenez\\",FEMALE,28,Jimenez,Jimenez,\\"(empty)\\",Friday,4,\\"sonya@jimenez-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Pyramidustries, Angeldale\\",\\"Pyramidustries, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561808,\\"sold_product_561808_17597, sold_product_561808_23716\\",\\"sold_product_561808_17597, sold_product_561808_23716\\",\\"13.992, 60\\",\\"13.992, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Angeldale\\",\\"Pyramidustries, Angeldale\\",\\"7.27, 29.406\\",\\"13.992, 60\\",\\"17,597, 23,716\\",\\"Print T-shirt - rose, Espadrilles - gold\\",\\"Print T-shirt - rose, Espadrilles - gold\\",\\"1, 1\\",\\"ZO0161401614, ZO0670406704\\",\\"0, 0\\",\\"13.992, 60\\",\\"13.992, 60\\",\\"0, 0\\",\\"ZO0161401614, ZO0670406704\\",74,74,2,2,order,sonya +SAMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Baker\\",\\"Abdulraheem Al Baker\\",MALE,33,Baker,Baker,\\"(empty)\\",Friday,4,\\"abdulraheem al@baker-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Microlutions, Spritechnologies\\",\\"Microlutions, Spritechnologies\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562394,\\"sold_product_562394_11570, sold_product_562394_15124\\",\\"sold_product_562394_11570, sold_product_562394_15124\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Spritechnologies\\",\\"Microlutions, Spritechnologies\\",\\"9.172, 5.5\\",\\"16.984, 10.992\\",\\"11,570, 15,124\\",\\"Print T-shirt - beige, Print T-shirt - dark denim\\",\\"Print T-shirt - beige, Print T-shirt - dark denim\\",\\"1, 1\\",\\"ZO0116701167, ZO0618106181\\",\\"0, 0\\",\\"16.984, 10.992\\",\\"16.984, 10.992\\",\\"0, 0\\",\\"ZO0116701167, ZO0618106181\\",\\"27.984\\",\\"27.984\\",2,2,order,abdulraheem +igMtOW0BH63Xcmy442jU,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Taylor\\",\\"Wilhemina St. Taylor\\",FEMALE,17,Taylor,Taylor,\\"(empty)\\",Friday,4,\\"wilhemina st.@taylor-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Angeldale, Champion Arts, Gnomehouse, Spherecords\\",\\"Angeldale, Champion Arts, Gnomehouse, Spherecords\\",\\"Jun 20, 2019 @ 00:00:00.000\\",731424,\\"sold_product_731424_18737, sold_product_731424_18573, sold_product_731424_19121, sold_product_731424_11250\\",\\"sold_product_731424_18737, sold_product_731424_18573, sold_product_731424_19121, sold_product_731424_11250\\",\\"65, 11.992, 65, 7.988\\",\\"65, 11.992, 65, 7.988\\",\\"Women's Shoes, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Champion Arts, Gnomehouse, Spherecords\\",\\"Angeldale, Champion Arts, Gnomehouse, Spherecords\\",\\"31.844, 5.52, 33.781, 3.68\\",\\"65, 11.992, 65, 7.988\\",\\"18,737, 18,573, 19,121, 11,250\\",\\"Lace-ups - black, Print T-shirt - light grey, Ankle boots - khaki, Top - light grey \\",\\"Lace-ups - black, Print T-shirt - light grey, Ankle boots - khaki, Top - light grey \\",\\"1, 1, 1, 1\\",\\"ZO0668706687, ZO0494004940, ZO0326003260, ZO0644206442\\",\\"0, 0, 0, 0\\",\\"65, 11.992, 65, 7.988\\",\\"65, 11.992, 65, 7.988\\",\\"0, 0, 0, 0\\",\\"ZO0668706687, ZO0494004940, ZO0326003260, ZO0644206442\\",150,150,4,4,order,wilhemina +pgMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Mary,Mary,\\"Mary Walters\\",\\"Mary Walters\\",FEMALE,20,Walters,Walters,\\"(empty)\\",Friday,4,\\"mary@walters-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media, Tigress Enterprises\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562425,\\"sold_product_562425_22514, sold_product_562425_21356\\",\\"sold_product_562425_22514, sold_product_562425_21356\\",\\"50, 33\\",\\"50, 33\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Tigress Enterprises\\",\\"Low Tide Media, Tigress Enterprises\\",\\"26.984, 16.5\\",\\"50, 33\\",\\"22,514, 21,356\\",\\"Ankle boots - grey, Jersey dress - peacoat\\",\\"Ankle boots - grey, Jersey dress - peacoat\\",\\"1, 1\\",\\"ZO0377603776, ZO0050500505\\",\\"0, 0\\",\\"50, 33\\",\\"50, 33\\",\\"0, 0\\",\\"ZO0377603776, ZO0050500505\\",83,83,2,2,order,mary +pwMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Robert,Robert,\\"Robert Ruiz\\",\\"Robert Ruiz\\",MALE,29,Ruiz,Ruiz,\\"(empty)\\",Friday,4,\\"robert@ruiz-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562464,\\"sold_product_562464_16779, sold_product_562464_24522\\",\\"sold_product_562464_16779, sold_product_562464_24522\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"11.539, 6\\",\\"20.984, 11.992\\",\\"16,779, 24,522\\",\\"Belt - light brown, Long sleeved top - off-white\\",\\"Belt - light brown, Long sleeved top - off-white\\",\\"1, 1\\",\\"ZO0462004620, ZO0568005680\\",\\"0, 0\\",\\"20.984, 11.992\\",\\"20.984, 11.992\\",\\"0, 0\\",\\"ZO0462004620, ZO0568005680\\",\\"32.969\\",\\"32.969\\",2,2,order,robert +qAMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Selena,Selena,\\"Selena Bryant\\",\\"Selena Bryant\\",FEMALE,42,Bryant,Bryant,\\"(empty)\\",Friday,4,\\"selena@bryant-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562516,\\"sold_product_562516_23076, sold_product_562516_13345\\",\\"sold_product_562516_23076, sold_product_562516_13345\\",\\"42, 7.988\\",\\"42, 7.988\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Tigress Enterprises\\",\\"Oceanavigations, Tigress Enterprises\\",\\"21, 3.68\\",\\"42, 7.988\\",\\"23,076, 13,345\\",\\"Jeans Skinny Fit - blue, Snood - nude/lilac\\",\\"Jeans Skinny Fit - blue, Snood - nude/lilac\\",\\"1, 1\\",\\"ZO0271102711, ZO0081300813\\",\\"0, 0\\",\\"42, 7.988\\",\\"42, 7.988\\",\\"0, 0\\",\\"ZO0271102711, ZO0081300813\\",\\"49.969\\",\\"49.969\\",2,2,order,selena +qQMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Marwan,Marwan,\\"Marwan Webb\\",\\"Marwan Webb\\",MALE,51,Webb,Webb,\\"(empty)\\",Friday,4,\\"marwan@webb-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562161,\\"sold_product_562161_11902, sold_product_562161_24125\\",\\"sold_product_562161_11902, sold_product_562161_24125\\",\\"13.992, 65\\",\\"13.992, 65\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Angeldale\\",\\"Low Tide Media, Angeldale\\",\\"7.551, 31.203\\",\\"13.992, 65\\",\\"11,902, 24,125\\",\\"3 PACK - Shorts - black, Lace-up boots - black\\",\\"3 PACK - Shorts - black, Lace-up boots - black\\",\\"1, 1\\",\\"ZO0477504775, ZO0694406944\\",\\"0, 0\\",\\"13.992, 65\\",\\"13.992, 65\\",\\"0, 0\\",\\"ZO0477504775, ZO0694406944\\",79,79,2,2,order,marwan +qgMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jim,Jim,\\"Jim Dawson\\",\\"Jim Dawson\\",MALE,41,Dawson,Dawson,\\"(empty)\\",Friday,4,\\"jim@dawson-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562211,\\"sold_product_562211_17044, sold_product_562211_19937\\",\\"sold_product_562211_17044, sold_product_562211_19937\\",\\"10.992, 7.988\\",\\"10.992, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spritechnologies, Elitelligence\\",\\"Spritechnologies, Elitelligence\\",\\"6.039, 4\\",\\"10.992, 7.988\\",\\"17,044, 19,937\\",\\"Sports shirt - bright white, Basic T-shirt - rose\\",\\"Sports shirt - bright white, Basic T-shirt - rose\\",\\"1, 1\\",\\"ZO0616806168, ZO0551805518\\",\\"0, 0\\",\\"10.992, 7.988\\",\\"10.992, 7.988\\",\\"0, 0\\",\\"ZO0616806168, ZO0551805518\\",\\"18.984\\",\\"18.984\\",2,2,order,jim +tAMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Selena,Selena,\\"Selena Graham\\",\\"Selena Graham\\",FEMALE,42,Graham,Graham,\\"(empty)\\",Friday,4,\\"selena@graham-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Pyramidustries active, Low Tide Media\\",\\"Pyramidustries active, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561831,\\"sold_product_561831_14088, sold_product_561831_20294\\",\\"sold_product_561831_14088, sold_product_561831_20294\\",\\"33, 60\\",\\"33, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries active, Low Tide Media\\",\\"Pyramidustries active, Low Tide Media\\",\\"16.813, 33\\",\\"33, 60\\",\\"14,088, 20,294\\",\\"Tights - duffle bag , Lace-ups - grey\\",\\"Tights - duffle bag , Lace-ups - grey\\",\\"1, 1\\",\\"ZO0225102251, ZO0368803688\\",\\"0, 0\\",\\"33, 60\\",\\"33, 60\\",\\"0, 0\\",\\"ZO0225102251, ZO0368803688\\",93,93,2,2,order,selena +tQMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Robbie,Robbie,\\"Robbie Potter\\",\\"Robbie Potter\\",MALE,48,Potter,Potter,\\"(empty)\\",Friday,4,\\"robbie@potter-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561864,\\"sold_product_561864_14054, sold_product_561864_20029\\",\\"sold_product_561864_14054, sold_product_561864_20029\\",\\"75, 85\\",\\"75, 85\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Angeldale\\",\\"Oceanavigations, Angeldale\\",\\"36, 43.344\\",\\"75, 85\\",\\"14,054, 20,029\\",\\"Parka - olive, Lace-up boots - Burly Wood\\",\\"Parka - olive, Lace-up boots - Burly Wood\\",\\"1, 1\\",\\"ZO0287002870, ZO0692206922\\",\\"0, 0\\",\\"75, 85\\",\\"75, 85\\",\\"0, 0\\",\\"ZO0287002870, ZO0692206922\\",160,160,2,2,order,robbie +tgMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Abigail,Abigail,\\"Abigail Austin\\",\\"Abigail Austin\\",FEMALE,46,Austin,Austin,\\"(empty)\\",Friday,4,\\"abigail@austin-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561907,\\"sold_product_561907_17540, sold_product_561907_16988\\",\\"sold_product_561907_17540, sold_product_561907_16988\\",\\"60, 60\\",\\"60, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Gnomehouse\\",\\"Tigress Enterprises, Gnomehouse\\",\\"29.406, 30.594\\",\\"60, 60\\",\\"17,540, 16,988\\",\\"Maxi dress - silver blue, Classic heels - black\\",\\"Maxi dress - silver blue, Classic heels - black\\",\\"1, 1\\",\\"ZO0042300423, ZO0321403214\\",\\"0, 0\\",\\"60, 60\\",\\"60, 60\\",\\"0, 0\\",\\"ZO0042300423, ZO0321403214\\",120,120,2,2,order,abigail +vAMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",EUR,Kamal,Kamal,\\"Kamal Boone\\",\\"Kamal Boone\\",MALE,39,Boone,Boone,\\"(empty)\\",Friday,4,\\"kamal@boone-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561245,\\"sold_product_561245_18213, sold_product_561245_17792\\",\\"sold_product_561245_18213, sold_product_561245_17792\\",\\"10.992, 34\\",\\"10.992, 34\\",\\"Men's Clothing, Men's Accessories\\",\\"Men's Clothing, Men's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"5.711, 16.313\\",\\"10.992, 34\\",\\"18,213, 17,792\\",\\"Print T-shirt - white, Briefcase - brown\\",\\"Print T-shirt - white, Briefcase - brown\\",\\"1, 1\\",\\"ZO0554305543, ZO0468204682\\",\\"0, 0\\",\\"10.992, 34\\",\\"10.992, 34\\",\\"0, 0\\",\\"ZO0554305543, ZO0468204682\\",\\"44.969\\",\\"44.969\\",2,2,order,kamal +vQMtOW0BH63Xcmy45GjD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Rowe\\",\\"Clarice Rowe\\",FEMALE,18,Rowe,Rowe,\\"(empty)\\",Friday,4,\\"clarice@rowe-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561785,\\"sold_product_561785_15024, sold_product_561785_24186\\",\\"sold_product_561785_15024, sold_product_561785_24186\\",\\"60, 33\\",\\"60, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"31.797, 17.813\\",\\"60, 33\\",\\"15,024, 24,186\\",\\"Cocktail dress / Party dress - black, Beaded Occasion Dress\\",\\"Cocktail dress / Party dress - black, Beaded Occasion Dress\\",\\"1, 1\\",\\"ZO0048600486, ZO0155201552\\",\\"0, 0\\",\\"60, 33\\",\\"60, 33\\",\\"0, 0\\",\\"ZO0048600486, ZO0155201552\\",93,93,2,2,order,clarice +YQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Betty,Betty,\\"Betty Harmon\\",\\"Betty Harmon\\",FEMALE,44,Harmon,Harmon,\\"(empty)\\",Friday,4,\\"betty@harmon-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.7)\\",\\"New York\\",Pyramidustries,Pyramidustries,\\"Jun 20, 2019 @ 00:00:00.000\\",561505,\\"sold_product_561505_21534, sold_product_561505_20521\\",\\"sold_product_561505_21534, sold_product_561505_20521\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"9.656, 10.703\\",\\"20.984, 20.984\\",\\"21,534, 20,521\\",\\"Vest - black and silver, Hoodie - dark grey multicolor\\",\\"Vest - black and silver, Hoodie - dark grey multicolor\\",\\"1, 1\\",\\"ZO0164001640, ZO0179301793\\",\\"0, 0\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"0, 0\\",\\"ZO0164001640, ZO0179301793\\",\\"41.969\\",\\"41.969\\",2,2,order,betty +agMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,Thad,Thad,\\"Thad Gregory\\",\\"Thad Gregory\\",MALE,30,Gregory,Gregory,\\"(empty)\\",Friday,4,\\"thad@gregory-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562403,\\"sold_product_562403_16259, sold_product_562403_15999\\",\\"sold_product_562403_16259, sold_product_562403_15999\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"21, 11.328\\",\\"42, 20.984\\",\\"16,259, 15,999\\",\\"Weekend bag - dark brown , Shirt - charcoal\\",\\"Weekend bag - dark brown , Shirt - charcoal\\",\\"1, 1\\",\\"ZO0471504715, ZO0524405244\\",\\"0, 0\\",\\"42, 20.984\\",\\"42, 20.984\\",\\"0, 0\\",\\"ZO0471504715, ZO0524405244\\",\\"62.969\\",\\"62.969\\",2,2,order,thad +cQMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Tariq,Tariq,\\"Tariq King\\",\\"Tariq King\\",MALE,25,King,King,\\"(empty)\\",Friday,4,\\"tariq@king-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561342,\\"sold_product_561342_16000, sold_product_561342_18188\\",\\"sold_product_561342_16000, sold_product_561342_18188\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"10.289, 17.484\\",\\"20.984, 33\\",\\"16,000, 18,188\\",\\"Shirt - Medium Slate Blue, Smart lace-ups - cognac\\",\\"Shirt - Medium Slate Blue, Smart lace-ups - cognac\\",\\"1, 1\\",\\"ZO0524505245, ZO0388003880\\",\\"0, 0\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"0, 0\\",\\"ZO0524505245, ZO0388003880\\",\\"53.969\\",\\"53.969\\",2,2,order,tariq +1gMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Pia,Pia,\\"Pia Turner\\",\\"Pia Turner\\",FEMALE,45,Turner,Turner,\\"(empty)\\",Friday,4,\\"pia@turner-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises\\",\\"Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562060,\\"sold_product_562060_15481, sold_product_562060_8432\\",\\"sold_product_562060_15481, sold_product_562060_8432\\",\\"33, 22.984\\",\\"33, 22.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Tigress Enterprises\\",\\"15.18, 11.953\\",\\"33, 22.984\\",\\"15,481, 8,432\\",\\"Blazer - creme, Vest - black\\",\\"Blazer - creme, Vest - black\\",\\"1, 1\\",\\"ZO0067300673, ZO0062100621\\",\\"0, 0\\",\\"33, 22.984\\",\\"33, 22.984\\",\\"0, 0\\",\\"ZO0067300673, ZO0062100621\\",\\"55.969\\",\\"55.969\\",2,2,order,pia +1wMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Perkins\\",\\"Abigail Perkins\\",FEMALE,46,Perkins,Perkins,\\"(empty)\\",Friday,4,\\"abigail@perkins-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562094,\\"sold_product_562094_4898, sold_product_562094_20011\\",\\"sold_product_562094_4898, sold_product_562094_20011\\",\\"90, 33\\",\\"90, 33\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Pyramidustries\\",\\"Low Tide Media, Pyramidustries\\",\\"45, 15.844\\",\\"90, 33\\",\\"4,898, 20,011\\",\\"Boots - cognac, Jumpsuit - black\\",\\"Boots - cognac, Jumpsuit - black\\",\\"1, 1\\",\\"ZO0374003740, ZO0146401464\\",\\"0, 0\\",\\"90, 33\\",\\"90, 33\\",\\"0, 0\\",\\"ZO0374003740, ZO0146401464\\",123,123,2,2,order,abigail +2AMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Jenkins\\",\\"Robbie Jenkins\\",MALE,48,Jenkins,Jenkins,\\"(empty)\\",Friday,4,\\"robbie@jenkins-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562236,\\"sold_product_562236_24934, sold_product_562236_14426\\",\\"sold_product_562236_24934, sold_product_562236_14426\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"22.5, 5.82\\",\\"50, 10.992\\",\\"24,934, 14,426\\",\\"Lace-up boots - resin coffee, Print T-shirt - grey multicolor\\",\\"Lace-up boots - resin coffee, Print T-shirt - grey multicolor\\",\\"1, 1\\",\\"ZO0403504035, ZO0438304383\\",\\"0, 0\\",\\"50, 10.992\\",\\"50, 10.992\\",\\"0, 0\\",\\"ZO0403504035, ZO0438304383\\",\\"60.969\\",\\"60.969\\",2,2,order,robbie +2QMtOW0BH63Xcmy45GnD,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Mary,Mary,\\"Mary Kim\\",\\"Mary Kim\\",FEMALE,20,Kim,Kim,\\"(empty)\\",Friday,4,\\"mary@kim-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562304,\\"sold_product_562304_5945, sold_product_562304_22770\\",\\"sold_product_562304_5945, sold_product_562304_22770\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"11.5, 19.734\\",\\"24.984, 42\\",\\"5,945, 22,770\\",\\"Ankle boots - black, Jumper - black/grey\\",\\"Ankle boots - black, Jumper - black/grey\\",\\"1, 1\\",\\"ZO0025000250, ZO0232702327\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0025000250, ZO0232702327\\",67,67,2,2,order,mary +FwMtOW0BH63Xcmy45GrD,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Thad,Thad,\\"Thad Perkins\\",\\"Thad Perkins\\",MALE,30,Perkins,Perkins,\\"(empty)\\",Friday,4,\\"thad@perkins-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Microlutions, Angeldale\\",\\"Microlutions, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562390,\\"sold_product_562390_19623, sold_product_562390_12060\\",\\"sold_product_562390_19623, sold_product_562390_12060\\",\\"33, 50\\",\\"33, 50\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Angeldale\\",\\"Microlutions, Angeldale\\",\\"15.844, 25.984\\",\\"33, 50\\",\\"19,623, 12,060\\",\\"Jumper - navy blazer, Lace-ups - black/red\\",\\"Jumper - navy blazer, Lace-ups - black/red\\",\\"1, 1\\",\\"ZO0121701217, ZO0680806808\\",\\"0, 0\\",\\"33, 50\\",\\"33, 50\\",\\"0, 0\\",\\"ZO0121701217, ZO0680806808\\",83,83,2,2,order,thad +3QMtOW0BH63Xcmy45Wq4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Tariq,Tariq,\\"Tariq Foster\\",\\"Tariq Foster\\",MALE,25,Foster,Foster,\\"(empty)\\",Friday,4,\\"tariq@foster-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Microlutions, Oceanavigations, Low Tide Media\\",\\"Microlutions, Oceanavigations, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",719041,\\"sold_product_719041_17412, sold_product_719041_17871, sold_product_719041_1720, sold_product_719041_15515\\",\\"sold_product_719041_17412, sold_product_719041_17871, sold_product_719041_1720, sold_product_719041_15515\\",\\"14.992, 14.992, 50, 50\\",\\"14.992, 14.992, 50, 50\\",\\"Men's Clothing, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Microlutions, Oceanavigations, Low Tide Media, Oceanavigations\\",\\"Microlutions, Oceanavigations, Low Tide Media, Oceanavigations\\",\\"7.5, 6.898, 24.5, 23\\",\\"14.992, 14.992, 50, 50\\",\\"17,412, 17,871, 1,720, 15,515\\",\\"Print T-shirt - black, Print T-shirt - multicolored, Lace-ups - tan, Light jacket - dark blue\\",\\"Print T-shirt - black, Print T-shirt - multicolored, Lace-ups - tan, Light jacket - dark blue\\",\\"1, 1, 1, 1\\",\\"ZO0117701177, ZO0292902929, ZO0387403874, ZO0286902869\\",\\"0, 0, 0, 0\\",\\"14.992, 14.992, 50, 50\\",\\"14.992, 14.992, 50, 50\\",\\"0, 0, 0, 0\\",\\"ZO0117701177, ZO0292902929, ZO0387403874, ZO0286902869\\",130,130,4,4,order,tariq +IAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Wagdi,Wagdi,\\"Wagdi Lawrence\\",\\"Wagdi Lawrence\\",MALE,15,Lawrence,Lawrence,\\"(empty)\\",Friday,4,\\"wagdi@lawrence-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561604,\\"sold_product_561604_24731, sold_product_561604_19673\\",\\"sold_product_561604_24731, sold_product_561604_19673\\",\\"24.984, 7.988\\",\\"24.984, 7.988\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"13.242, 4.148\\",\\"24.984, 7.988\\",\\"24,731, 19,673\\",\\"Tracksuit bottoms - mottled grey, Basic T-shirt - black\\",\\"Tracksuit bottoms - mottled grey, Basic T-shirt - black\\",\\"1, 1\\",\\"ZO0529605296, ZO0435404354\\",\\"0, 0\\",\\"24.984, 7.988\\",\\"24.984, 7.988\\",\\"0, 0\\",\\"ZO0529605296, ZO0435404354\\",\\"32.969\\",\\"32.969\\",2,2,order,wagdi +IwMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Mary,Mary,\\"Mary Fletcher\\",\\"Mary Fletcher\\",FEMALE,20,Fletcher,Fletcher,\\"(empty)\\",Friday,4,\\"mary@fletcher-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561455,\\"sold_product_561455_12855, sold_product_561455_5588\\",\\"sold_product_561455_12855, sold_product_561455_5588\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises\\",\\"14.492, 19.313\\",\\"28.984, 42\\",\\"12,855, 5,588\\",\\"Blazer - weiu00df/rosa, Ankle boots - teak\\",\\"Blazer - weiu00df/rosa, Ankle boots - teak\\",\\"1, 1\\",\\"ZO0182001820, ZO0018500185\\",\\"0, 0\\",\\"28.984, 42\\",\\"28.984, 42\\",\\"0, 0\\",\\"ZO0182001820, ZO0018500185\\",71,71,2,2,order,mary +JAMtOW0BH63Xcmy45Wu4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Robbie,Robbie,\\"Robbie Mccarthy\\",\\"Robbie Mccarthy\\",MALE,48,Mccarthy,Mccarthy,\\"(empty)\\",Friday,4,\\"robbie@mccarthy-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561509,\\"sold_product_561509_18177, sold_product_561509_2401\\",\\"sold_product_561509_18177, sold_product_561509_2401\\",\\"10.992, 65\\",\\"10.992, 65\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"5.82, 33.781\\",\\"10.992, 65\\",\\"18,177, 2,401\\",\\"Print T-shirt - navy, Boots - dark brown\\",\\"Print T-shirt - navy, Boots - dark brown\\",\\"1, 1\\",\\"ZO0438404384, ZO0405504055\\",\\"0, 0\\",\\"10.992, 65\\",\\"10.992, 65\\",\\"0, 0\\",\\"ZO0438404384, ZO0405504055\\",76,76,2,2,order,robbie +ggMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Caldwell\\",\\"Fitzgerald Caldwell\\",MALE,11,Caldwell,Caldwell,\\"(empty)\\",Friday,4,\\"fitzgerald@caldwell-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562439,\\"sold_product_562439_18548, sold_product_562439_23459\\",\\"sold_product_562439_18548, sold_product_562439_23459\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"10.492, 18.141\\",\\"20.984, 33\\",\\"18,548, 23,459\\",\\"Shorts - multicoloured, Smart lace-ups - dark brown\\",\\"Shorts - multicoloured, Smart lace-ups - dark brown\\",\\"1, 1\\",\\"ZO0533105331, ZO0384703847\\",\\"0, 0\\",\\"20.984, 33\\",\\"20.984, 33\\",\\"0, 0\\",\\"ZO0533105331, ZO0384703847\\",\\"53.969\\",\\"53.969\\",2,2,order,fuzzy +gwMtOW0BH63Xcmy45Wy4,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Schultz\\",\\"Wilhemina St. Schultz\\",FEMALE,17,Schultz,Schultz,\\"(empty)\\",Friday,4,\\"wilhemina st.@schultz-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562165,\\"sold_product_562165_12949, sold_product_562165_23197\\",\\"sold_product_562165_12949, sold_product_562165_23197\\",\\"33, 60\\",\\"33, 60\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"15.844, 28.203\\",\\"33, 60\\",\\"12,949, 23,197\\",\\"Summer jacket - dark blue, Maxi dress - eclipse\\",\\"Summer jacket - dark blue, Maxi dress - eclipse\\",\\"1, 1\\",\\"ZO0173701737, ZO0337903379\\",\\"0, 0\\",\\"33, 60\\",\\"33, 60\\",\\"0, 0\\",\\"ZO0173701737, ZO0337903379\\",93,93,2,2,order,wilhemina +2AMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Gibbs\\",\\"Jackson Gibbs\\",MALE,13,Gibbs,Gibbs,\\"(empty)\\",Friday,4,\\"jackson@gibbs-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Elitelligence, Spritechnologies, Angeldale\\",\\"Oceanavigations, Elitelligence, Spritechnologies, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",719343,\\"sold_product_719343_24169, sold_product_719343_18391, sold_product_719343_20707, sold_product_719343_21209\\",\\"sold_product_719343_24169, sold_product_719343_18391, sold_product_719343_20707, sold_product_719343_21209\\",\\"46, 24.984, 24.984, 65\\",\\"46, 24.984, 24.984, 65\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Oceanavigations, Elitelligence, Spritechnologies, Angeldale\\",\\"Oceanavigations, Elitelligence, Spritechnologies, Angeldale\\",\\"22.078, 12.492, 12.492, 31.203\\",\\"46, 24.984, 24.984, 65\\",\\"24,169, 18,391, 20,707, 21,209\\",\\"Jumper - navy, Tracksuit top - mottled grey, Tracksuit top - black, Boots - sand\\",\\"Jumper - navy, Tracksuit top - mottled grey, Tracksuit top - black, Boots - sand\\",\\"1, 1, 1, 1\\",\\"ZO0299002990, ZO0584005840, ZO0628406284, ZO0694306943\\",\\"0, 0, 0, 0\\",\\"46, 24.984, 24.984, 65\\",\\"46, 24.984, 24.984, 65\\",\\"0, 0, 0, 0\\",\\"ZO0299002990, ZO0584005840, ZO0628406284, ZO0694306943\\",161,161,4,4,order,jackson +2wMtOW0BH63Xcmy45mxS,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Abd,Abd,\\"Abd Gilbert\\",\\"Abd Gilbert\\",MALE,52,Gilbert,Gilbert,\\"(empty)\\",Friday,4,\\"abd@gilbert-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",718183,\\"sold_product_718183_23834, sold_product_718183_11105, sold_product_718183_22142, sold_product_718183_2361\\",\\"sold_product_718183_23834, sold_product_718183_11105, sold_product_718183_22142, sold_product_718183_2361\\",\\"7.988, 13.992, 24.984, 60\\",\\"7.988, 13.992, 24.984, 60\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Low Tide Media, Oceanavigations, Oceanavigations\\",\\"Low Tide Media, Low Tide Media, Oceanavigations, Oceanavigations\\",\\"4.07, 7.27, 11.5, 30\\",\\"7.988, 13.992, 24.984, 60\\",\\"23,834, 11,105, 22,142, 2,361\\",\\"3 PACK - Socks - blue/grey, 3 PACK - Shorts - black, Jeans Skinny Fit - petrol, Lace-up boots - dark brown\\",\\"3 PACK - Socks - blue/grey, 3 PACK - Shorts - black, Jeans Skinny Fit - petrol, Lace-up boots - dark brown\\",\\"1, 1, 1, 1\\",\\"ZO0481004810, ZO0476104761, ZO0284102841, ZO0256102561\\",\\"0, 0, 0, 0\\",\\"7.988, 13.992, 24.984, 60\\",\\"7.988, 13.992, 24.984, 60\\",\\"0, 0, 0, 0\\",\\"ZO0481004810, ZO0476104761, ZO0284102841, ZO0256102561\\",\\"106.938\\",\\"106.938\\",4,4,order,abd +wgMtOW0BH63Xcmy45m1S,ecommerce,\\"-\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",EUR,Pia,Pia,\\"Pia Hayes\\",\\"Pia Hayes\\",FEMALE,45,Hayes,Hayes,\\"(empty)\\",Friday,4,\\"pia@hayes-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Angeldale\\",\\"Pyramidustries, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561215,\\"sold_product_561215_11054, sold_product_561215_25101\\",\\"sold_product_561215_11054, sold_product_561215_25101\\",\\"20.984, 85\\",\\"20.984, 85\\",\\"Women's Accessories, Women's Shoes\\",\\"Women's Accessories, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Angeldale\\",\\"Pyramidustries, Angeldale\\",\\"10.703, 44.188\\",\\"20.984, 85\\",\\"11,054, 25,101\\",\\"Tote bag - cognac/blue, Ankle boots - Blue Violety\\",\\"Tote bag - cognac/blue, Ankle boots - Blue Violety\\",\\"1, 1\\",\\"ZO0196401964, ZO0673906739\\",\\"0, 0\\",\\"20.984, 85\\",\\"20.984, 85\\",\\"0, 0\\",\\"ZO0196401964, ZO0673906739\\",106,106,2,2,order,pia +\\"_QMtOW0BH63Xcmy45m1S\\",ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Yasmine,Yasmine,\\"Yasmine Gibbs\\",\\"Yasmine Gibbs\\",FEMALE,43,Gibbs,Gibbs,\\"(empty)\\",Friday,4,\\"yasmine@gibbs-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",Pyramidustries,Pyramidustries,\\"Jun 20, 2019 @ 00:00:00.000\\",561377,\\"sold_product_561377_24916, sold_product_561377_22033\\",\\"sold_product_561377_24916, sold_product_561377_22033\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Pyramidustries\\",\\"Pyramidustries, Pyramidustries\\",\\"13.742, 21.406\\",\\"24.984, 42\\",\\"24,916, 22,033\\",\\"A-line skirt - blue denim, Summer jacket - bordeaux/black\\",\\"A-line skirt - blue denim, Summer jacket - bordeaux/black\\",\\"1, 1\\",\\"ZO0147901479, ZO0185401854\\",\\"0, 0\\",\\"24.984, 42\\",\\"24.984, 42\\",\\"0, 0\\",\\"ZO0147901479, ZO0185401854\\",67,67,2,2,order,yasmine +EwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Romero\\",\\"Wilhemina St. Romero\\",FEMALE,17,Romero,Romero,\\"(empty)\\",Friday,4,\\"wilhemina st.@romero-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Pyramidustries, Tigress Enterprises, Spherecords\\",\\"Pyramidustries, Tigress Enterprises, Spherecords\\",\\"Jun 20, 2019 @ 00:00:00.000\\",726377,\\"sold_product_726377_16552, sold_product_726377_8806, sold_product_726377_14193, sold_product_726377_22412\\",\\"sold_product_726377_16552, sold_product_726377_8806, sold_product_726377_14193, sold_product_726377_22412\\",\\"14.992, 42, 20.984, 33\\",\\"14.992, 42, 20.984, 33\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Pyramidustries, Tigress Enterprises, Spherecords, Tigress Enterprises\\",\\"Pyramidustries, Tigress Enterprises, Spherecords, Tigress Enterprises\\",\\"6.898, 20.578, 11.117, 17.156\\",\\"14.992, 42, 20.984, 33\\",\\"16,552, 8,806, 14,193, 22,412\\",\\"Print T-shirt - black, Jumper - peacoat, Shift dress - dark blue, Jumper dress - black/grey\\",\\"Print T-shirt - black, Jumper - peacoat, Shift dress - dark blue, Jumper dress - black/grey\\",\\"1, 1, 1, 1\\",\\"ZO0167001670, ZO0070900709, ZO0636006360, ZO0051900519\\",\\"0, 0, 0, 0\\",\\"14.992, 42, 20.984, 33\\",\\"14.992, 42, 20.984, 33\\",\\"0, 0, 0, 0\\",\\"ZO0167001670, ZO0070900709, ZO0636006360, ZO0051900519\\",\\"110.938\\",\\"110.938\\",4,4,order,wilhemina +GgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes, Women's Accessories\\",\\"Women's Clothing, Women's Shoes, Women's Accessories\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Gomez\\",\\"Rabbia Al Gomez\\",FEMALE,5,Gomez,Gomez,\\"(empty)\\",Friday,4,\\"rabbia al@gomez-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",730333,\\"sold_product_730333_18676, sold_product_730333_12860, sold_product_730333_15759, sold_product_730333_24348\\",\\"sold_product_730333_18676, sold_product_730333_12860, sold_product_730333_15759, sold_product_730333_24348\\",\\"28.984, 50, 30.984, 50\\",\\"28.984, 50, 30.984, 50\\",\\"Women's Clothing, Women's Shoes, Women's Accessories, Women's Clothing\\",\\"Women's Clothing, Women's Shoes, Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Oceanavigations, Tigress Enterprises, Oceanavigations\\",\\"Tigress Enterprises, Oceanavigations, Tigress Enterprises, Oceanavigations\\",\\"13.633, 23, 15.492, 26.484\\",\\"28.984, 50, 30.984, 50\\",\\"18,676, 12,860, 15,759, 24,348\\",\\"Blouse - peach whip, Wedge sandals - gold, Rucksack - black, Summer dress - dark blue\\",\\"Blouse - peach whip, Wedge sandals - gold, Rucksack - black, Summer dress - dark blue\\",\\"1, 1, 1, 1\\",\\"ZO0065000650, ZO0241802418, ZO0098400984, ZO0262102621\\",\\"0, 0, 0, 0\\",\\"28.984, 50, 30.984, 50\\",\\"28.984, 50, 30.984, 50\\",\\"0, 0, 0, 0\\",\\"ZO0065000650, ZO0241802418, ZO0098400984, ZO0262102621\\",160,160,4,4,order,rabbia +agMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al Harvey\\",\\"Ahmed Al Harvey\\",MALE,4,Harvey,Harvey,\\"(empty)\\",Friday,4,\\"ahmed al@harvey-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",Microlutions,Microlutions,\\"Jun 20, 2019 @ 00:00:00.000\\",561542,\\"sold_product_561542_6512, sold_product_561542_17698\\",\\"sold_product_561542_6512, sold_product_561542_17698\\",\\"33, 75\\",\\"33, 75\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Microlutions\\",\\"Microlutions, Microlutions\\",\\"16.5, 37.5\\",\\"33, 75\\",\\"6,512, 17,698\\",\\"Jeans Tapered Fit - black denim, Faux leather jacket - black\\",\\"Jeans Tapered Fit - black denim, Faux leather jacket - black\\",\\"1, 1\\",\\"ZO0113701137, ZO0114201142\\",\\"0, 0\\",\\"33, 75\\",\\"33, 75\\",\\"0, 0\\",\\"ZO0113701137, ZO0114201142\\",108,108,2,2,order,ahmed +awMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Jackson,Jackson,\\"Jackson Pratt\\",\\"Jackson Pratt\\",MALE,13,Pratt,Pratt,\\"(empty)\\",Friday,4,\\"jackson@pratt-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561586,\\"sold_product_561586_13927, sold_product_561586_1557\\",\\"sold_product_561586_13927, sold_product_561586_1557\\",\\"42, 60\\",\\"42, 60\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Low Tide Media\\",\\"Elitelligence, Low Tide Media\\",\\"21.406, 31.188\\",\\"42, 60\\",\\"13,927, 1,557\\",\\"Bomber Jacket - khaki, Lace-up boots - brown\\",\\"Bomber Jacket - khaki, Lace-up boots - brown\\",\\"1, 1\\",\\"ZO0540605406, ZO0401104011\\",\\"0, 0\\",\\"42, 60\\",\\"42, 60\\",\\"0, 0\\",\\"ZO0540605406, ZO0401104011\\",102,102,2,2,order,jackson +bgMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Gwen,Gwen,\\"Gwen Mcdonald\\",\\"Gwen Mcdonald\\",FEMALE,26,Mcdonald,Mcdonald,\\"(empty)\\",Friday,4,\\"gwen@mcdonald-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561442,\\"sold_product_561442_7232, sold_product_561442_10893\\",\\"sold_product_561442_7232, sold_product_561442_10893\\",\\"33, 9.992\\",\\"33, 9.992\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"15.508, 4.699\\",\\"33, 9.992\\",\\"7,232, 10,893\\",\\"Winter boots - black, 2 PACK - Leggings - black\\",\\"Winter boots - black, 2 PACK - Leggings - black\\",\\"1, 1\\",\\"ZO0030900309, ZO0212302123\\",\\"0, 0\\",\\"33, 9.992\\",\\"33, 9.992\\",\\"0, 0\\",\\"ZO0030900309, ZO0212302123\\",\\"42.969\\",\\"42.969\\",2,2,order,gwen +bwMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Ahmed Al\\",\\"Ahmed Al\\",\\"Ahmed Al Hampton\\",\\"Ahmed Al Hampton\\",MALE,4,Hampton,Hampton,\\"(empty)\\",Friday,4,\\"ahmed al@hampton-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561484,\\"sold_product_561484_24353, sold_product_561484_18666\\",\\"sold_product_561484_24353, sold_product_561484_18666\\",\\"75, 14.992\\",\\"75, 14.992\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Elitelligence\\",\\"Low Tide Media, Elitelligence\\",\\"34.5, 7.199\\",\\"75, 14.992\\",\\"24,353, 18,666\\",\\"Lace-up boots - black/brown, Long sleeved top - white\\",\\"Lace-up boots - black/brown, Long sleeved top - white\\",\\"1, 1\\",\\"ZO0400304003, ZO0559405594\\",\\"0, 0\\",\\"75, 14.992\\",\\"75, 14.992\\",\\"0, 0\\",\\"ZO0400304003, ZO0559405594\\",90,90,2,2,order,ahmed +cAMtOW0BH63Xcmy45m5S,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Clarice,Clarice,\\"Clarice Smith\\",\\"Clarice Smith\\",FEMALE,18,Smith,Smith,\\"(empty)\\",Friday,4,\\"clarice@smith-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Gnomehouse mom, Pyramidustries\\",\\"Gnomehouse mom, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561325,\\"sold_product_561325_21224, sold_product_561325_11110\\",\\"sold_product_561325_21224, sold_product_561325_11110\\",\\"28.984, 28.984\\",\\"28.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse mom, Pyramidustries\\",\\"Gnomehouse mom, Pyramidustries\\",\\"14.781, 15.359\\",\\"28.984, 28.984\\",\\"21,224, 11,110\\",\\"Blouse - red, Tracksuit top - black\\",\\"Blouse - red, Tracksuit top - black\\",\\"1, 1\\",\\"ZO0234802348, ZO0178001780\\",\\"0, 0\\",\\"28.984, 28.984\\",\\"28.984, 28.984\\",\\"0, 0\\",\\"ZO0234802348, ZO0178001780\\",\\"57.969\\",\\"57.969\\",2,2,order,clarice +jgMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Abigail,Abigail,\\"Abigail Cross\\",\\"Abigail Cross\\",FEMALE,46,Cross,Cross,\\"(empty)\\",Friday,4,\\"abigail@cross-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Angeldale, Gnomehouse\\",\\"Angeldale, Gnomehouse\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562463,\\"sold_product_562463_16341, sold_product_562463_25127\\",\\"sold_product_562463_16341, sold_product_562463_25127\\",\\"65, 50\\",\\"65, 50\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Gnomehouse\\",\\"Angeldale, Gnomehouse\\",\\"29.906, 27.484\\",\\"65, 50\\",\\"16,341, 25,127\\",\\"Handbag - black, Maxi dress - red ochre\\",\\"Handbag - black, Maxi dress - red ochre\\",\\"1, 1\\",\\"ZO0700107001, ZO0341303413\\",\\"0, 0\\",\\"65, 50\\",\\"65, 50\\",\\"0, 0\\",\\"ZO0700107001, ZO0341303413\\",115,115,2,2,order,abigail +jwMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Selena,Selena,\\"Selena Hansen\\",\\"Selena Hansen\\",FEMALE,42,Hansen,Hansen,\\"(empty)\\",Friday,4,\\"selena@hansen-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",Spherecords,Spherecords,\\"Jun 20, 2019 @ 00:00:00.000\\",562513,\\"sold_product_562513_8078, sold_product_562513_9431\\",\\"sold_product_562513_8078, sold_product_562513_9431\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Spherecords\\",\\"Spherecords, Spherecords\\",\\"5.82, 12\\",\\"10.992, 24.984\\",\\"8,078, 9,431\\",\\"Long sleeved top - white, Pyjama set - grey/pink\\",\\"Long sleeved top - white, Pyjama set - grey/pink\\",\\"1, 1\\",\\"ZO0640906409, ZO0660206602\\",\\"0, 0\\",\\"10.992, 24.984\\",\\"10.992, 24.984\\",\\"0, 0\\",\\"ZO0640906409, ZO0660206602\\",\\"35.969\\",\\"35.969\\",2,2,order,selena +kAMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Estrada\\",\\"Abd Estrada\\",MALE,52,Estrada,Estrada,\\"(empty)\\",Friday,4,\\"abd@estrada-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562166,\\"sold_product_562166_16566, sold_product_562166_16701\\",\\"sold_product_562166_16566, sold_product_562166_16701\\",\\"75, 16.984\\",\\"75, 16.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"39, 7.988\\",\\"75, 16.984\\",\\"16,566, 16,701\\",\\"Boots - grey, 3 PACK - Basic T-shirt - white\\",\\"Boots - grey, 3 PACK - Basic T-shirt - white\\",\\"1, 1\\",\\"ZO0692406924, ZO0473504735\\",\\"0, 0\\",\\"75, 16.984\\",\\"75, 16.984\\",\\"0, 0\\",\\"ZO0692406924, ZO0473504735\\",92,92,2,2,order,abd +mgMtOW0BH63Xcmy4524Z,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Eddie,Eddie,\\"Eddie King\\",\\"Eddie King\\",MALE,38,King,King,\\"(empty)\\",Friday,4,\\"eddie@king-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Spherecords, Elitelligence, Oceanavigations\\",\\"Low Tide Media, Spherecords, Elitelligence, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",714021,\\"sold_product_714021_21164, sold_product_714021_13240, sold_product_714021_1704, sold_product_714021_15243\\",\\"sold_product_714021_21164, sold_product_714021_13240, sold_product_714021_1704, sold_product_714021_15243\\",\\"10.992, 7.988, 33, 65\\",\\"10.992, 7.988, 33, 65\\",\\"Men's Clothing, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Spherecords, Elitelligence, Oceanavigations\\",\\"Low Tide Media, Spherecords, Elitelligence, Oceanavigations\\",\\"5.93, 3.84, 15.508, 31.203\\",\\"10.992, 7.988, 33, 65\\",\\"21,164, 13,240, 1,704, 15,243\\",\\"Long sleeved top - dark blue, 5 PACK - Socks - black, High-top trainers - black, Trousers - bordeaux multicolor\\",\\"Long sleeved top - dark blue, 5 PACK - Socks - black, High-top trainers - black, Trousers - bordeaux multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0436904369, ZO0664106641, ZO0514805148, ZO0283302833\\",\\"0, 0, 0, 0\\",\\"10.992, 7.988, 33, 65\\",\\"10.992, 7.988, 33, 65\\",\\"0, 0, 0, 0\\",\\"ZO0436904369, ZO0664106641, ZO0514805148, ZO0283302833\\",\\"116.938\\",\\"116.938\\",4,4,order,eddie +FgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Accessories, Men's Shoes\\",\\"Women's Accessories, Men's Shoes\\",EUR,Frances,Frances,\\"Frances Butler\\",\\"Frances Butler\\",FEMALE,49,Butler,Butler,\\"(empty)\\",Friday,4,\\"frances@butler-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",Oceanavigations,Oceanavigations,\\"Jun 20, 2019 @ 00:00:00.000\\",562041,\\"sold_product_562041_17117, sold_product_562041_2398\\",\\"sold_product_562041_17117, sold_product_562041_2398\\",\\"110, 60\\",\\"110, 60\\",\\"Women's Accessories, Men's Shoes\\",\\"Women's Accessories, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"52.813, 29.406\\",\\"110, 60\\",\\"17,117, 2,398\\",\\"Weekend bag - cognac, Lace-ups - Midnight Blue\\",\\"Weekend bag - cognac, Lace-ups - Midnight Blue\\",\\"1, 1\\",\\"ZO0320303203, ZO0252802528\\",\\"0, 0\\",\\"110, 60\\",\\"110, 60\\",\\"0, 0\\",\\"ZO0320303203, ZO0252802528\\",170,170,2,2,order,frances +FwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Shoes\\",\\"Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Stewart\\",\\"Rabbia Al Stewart\\",FEMALE,5,Stewart,Stewart,\\"(empty)\\",Friday,4,\\"rabbia al@stewart-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562116,\\"sold_product_562116_5339, sold_product_562116_17619\\",\\"sold_product_562116_5339, sold_product_562116_17619\\",\\"75, 60\\",\\"75, 60\\",\\"Women's Shoes, Women's Shoes\\",\\"Women's Shoes, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Gnomehouse\\",\\"Oceanavigations, Gnomehouse\\",\\"38.25, 29.406\\",\\"75, 60\\",\\"5,339, 17,619\\",\\"Ankle boots - black, Lace-ups - silver\\",\\"Ankle boots - black, Lace-ups - silver\\",\\"1, 1\\",\\"ZO0247002470, ZO0322703227\\",\\"0, 0\\",\\"75, 60\\",\\"75, 60\\",\\"0, 0\\",\\"ZO0247002470, ZO0322703227\\",135,135,2,2,order,rabbia +GAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Shoes, Women's Accessories\\",\\"Men's Shoes, Women's Accessories\\",EUR,Robert,Robert,\\"Robert Hart\\",\\"Robert Hart\\",MALE,29,Hart,Hart,\\"(empty)\\",Friday,4,\\"robert@hart-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562281,\\"sold_product_562281_17836, sold_product_562281_15582\\",\\"sold_product_562281_17836, sold_product_562281_15582\\",\\"85, 13.992\\",\\"85, 13.992\\",\\"Men's Shoes, Women's Accessories\\",\\"Men's Shoes, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"42.5, 7.691\\",\\"85, 13.992\\",\\"17,836, 15,582\\",\\"Casual lace-ups - black, Belt - dark brown \\",\\"Casual lace-ups - black, Belt - dark brown \\",\\"1, 1\\",\\"ZO0683106831, ZO0317803178\\",\\"0, 0\\",\\"85, 13.992\\",\\"85, 13.992\\",\\"0, 0\\",\\"ZO0683106831, ZO0317803178\\",99,99,2,2,order,robert +IwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",EUR,George,George,\\"George King\\",\\"George King\\",MALE,32,King,King,\\"(empty)\\",Friday,4,\\"george@king-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562442,\\"sold_product_562442_24776, sold_product_562442_20891\\",\\"sold_product_562442_24776, sold_product_562442_20891\\",\\"33, 7.988\\",\\"33, 7.988\\",\\"Men's Accessories, Men's Clothing\\",\\"Men's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Elitelligence\\",\\"Microlutions, Elitelligence\\",\\"15.844, 4\\",\\"33, 7.988\\",\\"24,776, 20,891\\",\\"Watch - black, Basic T-shirt - khaki\\",\\"Watch - black, Basic T-shirt - khaki\\",\\"1, 1\\",\\"ZO0126901269, ZO0563705637\\",\\"0, 0\\",\\"33, 7.988\\",\\"33, 7.988\\",\\"0, 0\\",\\"ZO0126901269, ZO0563705637\\",\\"40.969\\",\\"40.969\\",2,2,order,george +JAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Fitzgerald,Fitzgerald,\\"Fitzgerald Brady\\",\\"Fitzgerald Brady\\",MALE,11,Brady,Brady,\\"(empty)\\",Friday,4,\\"fitzgerald@brady-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562149,\\"sold_product_562149_16955, sold_product_562149_6827\\",\\"sold_product_562149_16955, sold_product_562149_6827\\",\\"200, 33\\",\\"200, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"92, 17.156\\",\\"200, 33\\",\\"16,955, 6,827\\",\\"Classic coat - navy, Denim jacket - black denim\\",\\"Classic coat - navy, Denim jacket - black denim\\",\\"1, 1\\",\\"ZO0291402914, ZO0539305393\\",\\"0, 0\\",\\"200, 33\\",\\"200, 33\\",\\"0, 0\\",\\"ZO0291402914, ZO0539305393\\",233,233,2,2,order,fuzzy +JgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,George,George,\\"George Haynes\\",\\"George Haynes\\",MALE,32,Haynes,Haynes,\\"(empty)\\",Friday,4,\\"george@haynes-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,Elitelligence,Elitelligence,\\"Jun 20, 2019 @ 00:00:00.000\\",562553,\\"sold_product_562553_15384, sold_product_562553_11950\\",\\"sold_product_562553_15384, sold_product_562553_11950\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"17.156, 5.391\\",\\"33, 10.992\\",\\"15,384, 11,950\\",\\"Denim jacket - grey, Seratonin - Long sleeved top - dark blue\\",\\"Denim jacket - grey, Seratonin - Long sleeved top - dark blue\\",\\"1, 1\\",\\"ZO0525005250, ZO0547205472\\",\\"0, 0\\",\\"33, 10.992\\",\\"33, 10.992\\",\\"0, 0\\",\\"ZO0525005250, ZO0547205472\\",\\"43.969\\",\\"43.969\\",2,2,order,george +bAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Bradley\\",\\"Hicham Bradley\\",MALE,8,Bradley,Bradley,\\"(empty)\\",Friday,4,\\"hicham@bradley-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561677,\\"sold_product_561677_13662, sold_product_561677_20832\\",\\"sold_product_561677_13662, sold_product_561677_20832\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"9.656, 14.781\\",\\"20.984, 28.984\\",\\"13,662, 20,832\\",\\"Tracksuit bottoms - dark blue, Sweatshirt - black\\",\\"Tracksuit bottoms - dark blue, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0525605256, ZO0126001260\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0525605256, ZO0126001260\\",\\"49.969\\",\\"49.969\\",2,2,order,hicham +bQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Ramsey\\",\\"Abd Ramsey\\",MALE,52,Ramsey,Ramsey,\\"(empty)\\",Friday,4,\\"abd@ramsey-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561217,\\"sold_product_561217_17853, sold_product_561217_20690\\",\\"sold_product_561217_17853, sold_product_561217_20690\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Microlutions\\",\\"Low Tide Media, Microlutions\\",\\"11.25, 18.141\\",\\"24.984, 33\\",\\"17,853, 20,690\\",\\"Shirt - white blue, Sweatshirt - black\\",\\"Shirt - white blue, Sweatshirt - black\\",\\"1, 1\\",\\"ZO0417904179, ZO0125501255\\",\\"0, 0\\",\\"24.984, 33\\",\\"24.984, 33\\",\\"0, 0\\",\\"ZO0417904179, ZO0125501255\\",\\"57.969\\",\\"57.969\\",2,2,order,abd +bgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Tyler\\",\\"Rabbia Al Tyler\\",FEMALE,5,Tyler,Tyler,\\"(empty)\\",Friday,4,\\"rabbia al@tyler-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561251,\\"sold_product_561251_23966, sold_product_561251_18479\\",\\"sold_product_561251_23966, sold_product_561251_18479\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Champion Arts, Oceanavigations\\",\\"Champion Arts, Oceanavigations\\",\\"13.492, 29.906\\",\\"24.984, 65\\",\\"23,966, 18,479\\",\\"Sweatshirt - grey/off-white, Ankle boots - black\\",\\"Sweatshirt - grey/off-white, Ankle boots - black\\",\\"1, 1\\",\\"ZO0502905029, ZO0249102491\\",\\"0, 0\\",\\"24.984, 65\\",\\"24.984, 65\\",\\"0, 0\\",\\"ZO0502905029, ZO0249102491\\",90,90,2,2,order,rabbia +bwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Muniz,Muniz,\\"Muniz Pope\\",\\"Muniz Pope\\",MALE,37,Pope,Pope,\\"(empty)\\",Friday,4,\\"muniz@pope-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561291,\\"sold_product_561291_11706, sold_product_561291_1176\\",\\"sold_product_561291_11706, sold_product_561291_1176\\",\\"100, 42\\",\\"100, 42\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Low Tide Media\\",\\"Angeldale, Low Tide Media\\",\\"49, 21.828\\",\\"100, 42\\",\\"11,706, 1,176\\",\\"Weekend bag - dark brown, Trainers - black\\",\\"Weekend bag - dark brown, Trainers - black\\",\\"1, 1\\",\\"ZO0701907019, ZO0395203952\\",\\"0, 0\\",\\"100, 42\\",\\"100, 42\\",\\"0, 0\\",\\"ZO0701907019, ZO0395203952\\",142,142,2,2,order,muniz +cAMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Morris\\",\\"Boris Morris\\",MALE,36,Morris,Morris,\\"(empty)\\",Friday,4,\\"boris@morris-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561316,\\"sold_product_561316_18944, sold_product_561316_6709\\",\\"sold_product_561316_18944, sold_product_561316_6709\\",\\"24.984, 90\\",\\"24.984, 90\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"11.5, 45\\",\\"24.984, 90\\",\\"18,944, 6,709\\",\\"Shirt - white, Classic coat - navy\\",\\"Shirt - white, Classic coat - navy\\",\\"1, 1\\",\\"ZO0524305243, ZO0290702907\\",\\"0, 0\\",\\"24.984, 90\\",\\"24.984, 90\\",\\"0, 0\\",\\"ZO0524305243, ZO0290702907\\",115,115,2,2,order,boris +cQMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Lewis\\",\\"Wilhemina St. Lewis\\",FEMALE,17,Lewis,Lewis,\\"(empty)\\",Friday,4,\\"wilhemina st.@lewis-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561769,\\"sold_product_561769_18758, sold_product_561769_12114\\",\\"sold_product_561769_18758, sold_product_561769_12114\\",\\"33, 29.984\\",\\"33, 29.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"Tigress Enterprises Curvy, Tigress Enterprises\\",\\"14.852, 16.188\\",\\"33, 29.984\\",\\"18,758, 12,114\\",\\"Cardigan - sand multicolor/black, Jersey dress - black/white\\",\\"Cardigan - sand multicolor/black, Jersey dress - black/white\\",\\"1, 1\\",\\"ZO0106601066, ZO0038300383\\",\\"0, 0\\",\\"33, 29.984\\",\\"33, 29.984\\",\\"0, 0\\",\\"ZO0106601066, ZO0038300383\\",\\"62.969\\",\\"62.969\\",2,2,order,wilhemina +cgMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Clarice,Clarice,\\"Clarice Adams\\",\\"Clarice Adams\\",FEMALE,18,Adams,Adams,\\"(empty)\\",Friday,4,\\"clarice@adams-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561784,\\"sold_product_561784_19114, sold_product_561784_21141\\",\\"sold_product_561784_19114, sold_product_561784_21141\\",\\"7.988, 21.984\\",\\"7.988, 21.984\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Pyramidustries\\",\\"Spherecords, Pyramidustries\\",\\"4.309, 11.867\\",\\"7.988, 21.984\\",\\"19,114, 21,141\\",\\"Top - black/white, Xanadu - Across body bag - black\\",\\"Top - black/white, Xanadu - Across body bag - black\\",\\"1, 1\\",\\"ZO0644306443, ZO0205102051\\",\\"0, 0\\",\\"7.988, 21.984\\",\\"7.988, 21.984\\",\\"0, 0\\",\\"ZO0644306443, ZO0205102051\\",\\"29.984\\",\\"29.984\\",2,2,order,clarice +cwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Carr\\",\\"Elyssa Carr\\",FEMALE,27,Carr,Carr,\\"(empty)\\",Friday,4,\\"elyssa@carr-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561815,\\"sold_product_561815_20116, sold_product_561815_24086\\",\\"sold_product_561815_20116, sold_product_561815_24086\\",\\"33, 21.984\\",\\"33, 21.984\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"Tigress Enterprises, Tigress Enterprises MAMA\\",\\"15.844, 11.43\\",\\"33, 21.984\\",\\"20,116, 24,086\\",\\"Handbag - Blue Violety, Long sleeved top - peacoat\\",\\"Handbag - Blue Violety, Long sleeved top - peacoat\\",\\"1, 1\\",\\"ZO0091100911, ZO0231102311\\",\\"0, 0\\",\\"33, 21.984\\",\\"33, 21.984\\",\\"0, 0\\",\\"ZO0091100911, ZO0231102311\\",\\"54.969\\",\\"54.969\\",2,2,order,elyssa +ngMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Mclaughlin\\",\\"Rabbia Al Mclaughlin\\",FEMALE,5,Mclaughlin,Mclaughlin,\\"(empty)\\",Friday,4,\\"rabbia al@mclaughlin-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords, Oceanavigations, Tigress Enterprises, Champion Arts\\",\\"Spherecords, Oceanavigations, Tigress Enterprises, Champion Arts\\",\\"Jun 20, 2019 @ 00:00:00.000\\",724573,\\"sold_product_724573_12483, sold_product_724573_21459, sold_product_724573_9400, sold_product_724573_16900\\",\\"sold_product_724573_12483, sold_product_724573_21459, sold_product_724573_9400, sold_product_724573_16900\\",\\"24.984, 42, 24.984, 24.984\\",\\"24.984, 42, 24.984, 24.984\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spherecords, Oceanavigations, Tigress Enterprises, Champion Arts\\",\\"Spherecords, Oceanavigations, Tigress Enterprises, Champion Arts\\",\\"12.742, 21.828, 12.992, 13.742\\",\\"24.984, 42, 24.984, 24.984\\",\\"12,483, 21,459, 9,400, 16,900\\",\\"Jumper - beige multicolor, Summer dress - black, Jersey dress - navy, Jersey dress - black/white\\",\\"Jumper - beige multicolor, Summer dress - black, Jersey dress - navy, Jersey dress - black/white\\",\\"1, 1, 1, 1\\",\\"ZO0653306533, ZO0261702617, ZO0036800368, ZO0490704907\\",\\"0, 0, 0, 0\\",\\"24.984, 42, 24.984, 24.984\\",\\"24.984, 42, 24.984, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0653306533, ZO0261702617, ZO0036800368, ZO0490704907\\",\\"116.938\\",\\"116.938\\",4,4,order,rabbia +zwMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Hernandez\\",\\"Wilhemina St. Hernandez\\",FEMALE,17,Hernandez,Hernandez,\\"(empty)\\",Friday,4,\\"wilhemina st.@hernandez-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561937,\\"sold_product_561937_23134, sold_product_561937_14750\\",\\"sold_product_561937_23134, sold_product_561937_14750\\",\\"7.988, 50\\",\\"7.988, 50\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Low Tide Media\\",\\"Spherecords, Low Tide Media\\",\\"3.68, 26.984\\",\\"7.988, 50\\",\\"23,134, 14,750\\",\\"Basic T-shirt - dark grey multicolor, High heeled sandals - pink\\",\\"Basic T-shirt - dark grey multicolor, High heeled sandals - pink\\",\\"1, 1\\",\\"ZO0638606386, ZO0371503715\\",\\"0, 0\\",\\"7.988, 50\\",\\"7.988, 50\\",\\"0, 0\\",\\"ZO0638606386, ZO0371503715\\",\\"57.969\\",\\"57.969\\",2,2,order,wilhemina +0AMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Youssef,Youssef,\\"Youssef Bryan\\",\\"Youssef Bryan\\",MALE,31,Bryan,Bryan,\\"(empty)\\",Friday,4,\\"youssef@bryan-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561966,\\"sold_product_561966_23691, sold_product_561966_20112\\",\\"sold_product_561966_23691, sold_product_561966_20112\\",\\"28.984, 25.984\\",\\"28.984, 25.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Microlutions, Low Tide Media\\",\\"Microlutions, Low Tide Media\\",\\"13.922, 12.477\\",\\"28.984, 25.984\\",\\"23,691, 20,112\\",\\"Sweatshirt - black, Shirt - blue\\",\\"Sweatshirt - black, Shirt - blue\\",\\"1, 1\\",\\"ZO0124201242, ZO0413604136\\",\\"0, 0\\",\\"28.984, 25.984\\",\\"28.984, 25.984\\",\\"0, 0\\",\\"ZO0124201242, ZO0413604136\\",\\"54.969\\",\\"54.969\\",2,2,order,youssef +0QMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Stephanie,Stephanie,\\"Stephanie Cortez\\",\\"Stephanie Cortez\\",FEMALE,6,Cortez,Cortez,\\"(empty)\\",Friday,4,\\"stephanie@cortez-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561522,\\"sold_product_561522_15509, sold_product_561522_16044\\",\\"sold_product_561522_15509, sold_product_561522_16044\\",\\"11.992, 50\\",\\"11.992, 50\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Pyramidustries, Gnomehouse\\",\\"Pyramidustries, Gnomehouse\\",\\"6.469, 25\\",\\"11.992, 50\\",\\"15,509, 16,044\\",\\"Scarf - grey, Summer dress - navy blazer\\",\\"Scarf - grey, Summer dress - navy blazer\\",\\"1, 1\\",\\"ZO0194601946, ZO0340403404\\",\\"0, 0\\",\\"11.992, 50\\",\\"11.992, 50\\",\\"0, 0\\",\\"ZO0194601946, ZO0340403404\\",\\"61.969\\",\\"61.969\\",2,2,order,stephanie +7wMtOW0BH63Xcmy4528Z,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,Abd,Abd,\\"Abd Gregory\\",\\"Abd Gregory\\",MALE,52,Gregory,Gregory,\\"(empty)\\",Friday,4,\\"abd@gregory-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561330,\\"sold_product_561330_18701, sold_product_561330_11884\\",\\"sold_product_561330_18701, sold_product_561330_11884\\",\\"65, 22.984\\",\\"65, 22.984\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Angeldale, Oceanavigations\\",\\"Angeldale, Oceanavigations\\",\\"34.438, 10.578\\",\\"65, 22.984\\",\\"18,701, 11,884\\",\\"Lace-up boots - taupe, Jumper - navy\\",\\"Lace-up boots - taupe, Jumper - navy\\",\\"1, 1\\",\\"ZO0691106911, ZO0295902959\\",\\"0, 0\\",\\"65, 22.984\\",\\"65, 22.984\\",\\"0, 0\\",\\"ZO0691106911, ZO0295902959\\",88,88,2,2,order,abd +gwMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing, Women's Accessories\\",\\"Women's Shoes, Women's Clothing, Women's Accessories\\",EUR,\\"Wilhemina St.\\",\\"Wilhemina St.\\",\\"Wilhemina St. Jimenez\\",\\"Wilhemina St. Jimenez\\",FEMALE,17,Jimenez,Jimenez,\\"(empty)\\",Friday,4,\\"wilhemina st.@jimenez-family.zzz\\",\\"Monte Carlo\\",Europe,MC,\\"POINT (7.4 43.7)\\",\\"-\\",\\"Tigress Enterprises, Spherecords\\",\\"Tigress Enterprises, Spherecords\\",\\"Jun 20, 2019 @ 00:00:00.000\\",726879,\\"sold_product_726879_7151, sold_product_726879_13075, sold_product_726879_13564, sold_product_726879_15989\\",\\"sold_product_726879_7151, sold_product_726879_13075, sold_product_726879_13564, sold_product_726879_15989\\",\\"42, 10.992, 16.984, 28.984\\",\\"42, 10.992, 16.984, 28.984\\",\\"Women's Shoes, Women's Clothing, Women's Accessories, Women's Clothing\\",\\"Women's Shoes, Women's Clothing, Women's Accessories, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Spherecords, Tigress Enterprises, Tigress Enterprises\\",\\"Tigress Enterprises, Spherecords, Tigress Enterprises, Tigress Enterprises\\",\\"22.25, 5.82, 9.344, 13.633\\",\\"42, 10.992, 16.984, 28.984\\",\\"7,151, 13,075, 13,564, 15,989\\",\\"Ankle boots - black, Body - black, Clutch - black, A-line skirt - blue\\",\\"Ankle boots - black, Body - black, Clutch - black, A-line skirt - blue\\",\\"1, 1, 1, 1\\",\\"ZO0020100201, ZO0659406594, ZO0087900879, ZO0032700327\\",\\"0, 0, 0, 0\\",\\"42, 10.992, 16.984, 28.984\\",\\"42, 10.992, 16.984, 28.984\\",\\"0, 0, 0, 0\\",\\"ZO0020100201, ZO0659406594, ZO0087900879, ZO0032700327\\",\\"98.938\\",\\"98.938\\",4,4,order,wilhemina +hAMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Accessories, Women's Clothing\\",\\"Women's Accessories, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Abbott\\",\\"Elyssa Abbott\\",FEMALE,27,Abbott,Abbott,\\"(empty)\\",Friday,4,\\"elyssa@abbott-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Tigress Enterprises, Oceanavigations, Champion Arts\\",\\"Tigress Enterprises, Oceanavigations, Champion Arts\\",\\"Jun 20, 2019 @ 00:00:00.000\\",725944,\\"sold_product_725944_16292, sold_product_725944_18842, sold_product_725944_25188, sold_product_725944_15449\\",\\"sold_product_725944_16292, sold_product_725944_18842, sold_product_725944_25188, sold_product_725944_15449\\",\\"24.984, 16.984, 28.984, 10.992\\",\\"24.984, 16.984, 28.984, 10.992\\",\\"Women's Accessories, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Women's Accessories, Women's Clothing, Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Tigress Enterprises, Oceanavigations, Tigress Enterprises, Champion Arts\\",\\"Tigress Enterprises, Oceanavigations, Tigress Enterprises, Champion Arts\\",\\"11.25, 8.156, 15.648, 5.281\\",\\"24.984, 16.984, 28.984, 10.992\\",\\"16,292, 18,842, 25,188, 15,449\\",\\"Watch - rose gold-coloured, Print T-shirt - black, Blouse - peacoat, Print T-shirt - coral\\",\\"Watch - rose gold-coloured, Print T-shirt - black, Blouse - peacoat, Print T-shirt - coral\\",\\"1, 1, 1, 1\\",\\"ZO0079200792, ZO0263902639, ZO0065900659, ZO0492304923\\",\\"0, 0, 0, 0\\",\\"24.984, 16.984, 28.984, 10.992\\",\\"24.984, 16.984, 28.984, 10.992\\",\\"0, 0, 0, 0\\",\\"ZO0079200792, ZO0263902639, ZO0065900659, ZO0492304923\\",\\"81.938\\",\\"81.938\\",4,4,order,elyssa +jAMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Elyssa,Elyssa,\\"Elyssa Dennis\\",\\"Elyssa Dennis\\",FEMALE,27,Dennis,Dennis,\\"(empty)\\",Friday,4,\\"elyssa@dennis-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Spherecords, Oceanavigations\\",\\"Spherecords, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562572,\\"sold_product_562572_13412, sold_product_562572_19097\\",\\"sold_product_562572_13412, sold_product_562572_19097\\",\\"13.992, 60\\",\\"13.992, 60\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Oceanavigations\\",\\"Spherecords, Oceanavigations\\",\\"7.551, 29.406\\",\\"13.992, 60\\",\\"13,412, 19,097\\",\\"Blouse - off white, Ankle boots - camel\\",\\"Blouse - off white, Ankle boots - camel\\",\\"1, 1\\",\\"ZO0649706497, ZO0249202492\\",\\"0, 0\\",\\"13.992, 60\\",\\"13.992, 60\\",\\"0, 0\\",\\"ZO0649706497, ZO0249202492\\",74,74,2,2,order,elyssa +nAMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",EUR,Stephanie,Stephanie,\\"Stephanie Marshall\\",\\"Stephanie Marshall\\",FEMALE,6,Marshall,Marshall,\\"(empty)\\",Friday,4,\\"stephanie@marshall-family.zzz\\",Cannes,Europe,FR,\\"POINT (7 43.6)\\",\\"Alpes-Maritimes\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562035,\\"sold_product_562035_9471, sold_product_562035_21453\\",\\"sold_product_562035_9471, sold_product_562035_21453\\",\\"42, 13.992\\",\\"42, 13.992\\",\\"Women's Clothing, Women's Accessories\\",\\"Women's Clothing, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Gnomehouse, Pyramidustries\\",\\"Gnomehouse, Pyramidustries\\",\\"22.672, 7\\",\\"42, 13.992\\",\\"9,471, 21,453\\",\\"Summer dress - black/june bug, Handbag - black\\",\\"Summer dress - black/june bug, Handbag - black\\",\\"1, 1\\",\\"ZO0334403344, ZO0205002050\\",\\"0, 0\\",\\"42, 13.992\\",\\"42, 13.992\\",\\"0, 0\\",\\"ZO0334403344, ZO0205002050\\",\\"55.969\\",\\"55.969\\",2,2,order,stephanie +nQMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robbie,Robbie,\\"Robbie Hodges\\",\\"Robbie Hodges\\",MALE,48,Hodges,Hodges,\\"(empty)\\",Friday,4,\\"robbie@hodges-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,Elitelligence,Elitelligence,\\"Jun 20, 2019 @ 00:00:00.000\\",562112,\\"sold_product_562112_6789, sold_product_562112_20433\\",\\"sold_product_562112_6789, sold_product_562112_20433\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Elitelligence\\",\\"Elitelligence, Elitelligence\\",\\"10.703, 5.82\\",\\"20.984, 10.992\\",\\"6,789, 20,433\\",\\"Chinos - blue, Long sleeved top - black/white\\",\\"Chinos - blue, Long sleeved top - black/white\\",\\"1, 1\\",\\"ZO0527405274, ZO0547005470\\",\\"0, 0\\",\\"20.984, 10.992\\",\\"20.984, 10.992\\",\\"0, 0\\",\\"ZO0527405274, ZO0547005470\\",\\"31.984\\",\\"31.984\\",2,2,order,robbie +ngMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,Clarice,Clarice,\\"Clarice Ball\\",\\"Clarice Ball\\",FEMALE,18,Ball,Ball,\\"(empty)\\",Friday,4,\\"clarice@ball-family.zzz\\",Birmingham,Europe,GB,\\"POINT (-1.9 52.5)\\",Birmingham,\\"Tigress Enterprises Curvy, Karmanite\\",\\"Tigress Enterprises Curvy, Karmanite\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562275,\\"sold_product_562275_19153, sold_product_562275_12720\\",\\"sold_product_562275_19153, sold_product_562275_12720\\",\\"29.984, 70\\",\\"29.984, 70\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises Curvy, Karmanite\\",\\"Tigress Enterprises Curvy, Karmanite\\",\\"14.992, 37.094\\",\\"29.984, 70\\",\\"19,153, 12,720\\",\\"Cardigan - jade, Sandals - black\\",\\"Cardigan - jade, Sandals - black\\",\\"1, 1\\",\\"ZO0106301063, ZO0703507035\\",\\"0, 0\\",\\"29.984, 70\\",\\"29.984, 70\\",\\"0, 0\\",\\"ZO0106301063, ZO0703507035\\",100,100,2,2,order,clarice +nwMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Mostafa,Mostafa,\\"Mostafa Greer\\",\\"Mostafa Greer\\",MALE,9,Greer,Greer,\\"(empty)\\",Friday,4,\\"mostafa@greer-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562287,\\"sold_product_562287_3022, sold_product_562287_23056\\",\\"sold_product_562287_3022, sold_product_562287_23056\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"9.172, 28.797\\",\\"16.984, 60\\",\\"3,022, 23,056\\",\\"3 PACK - Basic T-shirt - white, Suit jacket - grey multicolor\\",\\"3 PACK - Basic T-shirt - white, Suit jacket - grey multicolor\\",\\"1, 1\\",\\"ZO0473104731, ZO0274302743\\",\\"0, 0\\",\\"16.984, 60\\",\\"16.984, 60\\",\\"0, 0\\",\\"ZO0473104731, ZO0274302743\\",77,77,2,2,order,mostafa +rgMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Tariq,Tariq,\\"Tariq Schultz\\",\\"Tariq Schultz\\",MALE,25,Schultz,Schultz,\\"(empty)\\",Friday,4,\\"tariq@schultz-family.zzz\\",Istanbul,Asia,TR,\\"POINT (29 41)\\",Istanbul,\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562404,\\"sold_product_562404_19679, sold_product_562404_22477\\",\\"sold_product_562404_19679, sold_product_562404_22477\\",\\"28.984, 22.984\\",\\"28.984, 22.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Oceanavigations\\",\\"Elitelligence, Oceanavigations\\",\\"15.648, 12.18\\",\\"28.984, 22.984\\",\\"19,679, 22,477\\",\\"Hoodie - black/dark blue/white, Jumper - khaki\\",\\"Hoodie - black/dark blue/white, Jumper - khaki\\",\\"1, 1\\",\\"ZO0584205842, ZO0299102991\\",\\"0, 0\\",\\"28.984, 22.984\\",\\"28.984, 22.984\\",\\"0, 0\\",\\"ZO0584205842, ZO0299102991\\",\\"51.969\\",\\"51.969\\",2,2,order,tariq +1QMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",EUR,Hicham,Hicham,\\"Hicham Abbott\\",\\"Hicham Abbott\\",MALE,8,Abbott,Abbott,\\"(empty)\\",Friday,4,\\"hicham@abbott-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562099,\\"sold_product_562099_18906, sold_product_562099_21672\\",\\"sold_product_562099_18906, sold_product_562099_21672\\",\\"13.992, 16.984\\",\\"13.992, 16.984\\",\\"Women's Accessories, Men's Clothing\\",\\"Women's Accessories, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Low Tide Media\\",\\"Oceanavigations, Low Tide Media\\",\\"6.578, 9\\",\\"13.992, 16.984\\",\\"18,906, 21,672\\",\\"Belt - black, Polo shirt - black multicolor\\",\\"Belt - black, Polo shirt - black multicolor\\",\\"1, 1\\",\\"ZO0317903179, ZO0443904439\\",\\"0, 0\\",\\"13.992, 16.984\\",\\"13.992, 16.984\\",\\"0, 0\\",\\"ZO0317903179, ZO0443904439\\",\\"30.984\\",\\"30.984\\",2,2,order,hicham +1gMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Boris,Boris,\\"Boris Morrison\\",\\"Boris Morrison\\",MALE,36,Morrison,Morrison,\\"(empty)\\",Friday,4,\\"boris@morrison-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562298,\\"sold_product_562298_22860, sold_product_562298_11728\\",\\"sold_product_562298_22860, sold_product_562298_11728\\",\\"24.984, 18.984\\",\\"24.984, 18.984\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"11.5, 8.547\\",\\"24.984, 18.984\\",\\"22,860, 11,728\\",\\"Shirt - offwhite, Sweatshirt - red\\",\\"Shirt - offwhite, Sweatshirt - red\\",\\"1, 1\\",\\"ZO0280002800, ZO0583105831\\",\\"0, 0\\",\\"24.984, 18.984\\",\\"24.984, 18.984\\",\\"0, 0\\",\\"ZO0280002800, ZO0583105831\\",\\"43.969\\",\\"43.969\\",2,2,order,boris +3QMtOW0BH63Xcmy453D9,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Oliver,Oliver,\\"Oliver Rios\\",\\"Oliver Rios\\",MALE,7,Rios,Rios,\\"(empty)\\",Friday,4,\\"oliver@rios-family.zzz\\",\\"-\\",Europe,GB,\\"POINT (-0.1 51.5)\\",\\"-\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",562025,\\"sold_product_562025_18322, sold_product_562025_1687\\",\\"sold_product_562025_18322, sold_product_562025_1687\\",\\"14.992, 80\\",\\"14.992, 80\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Elitelligence, Angeldale\\",\\"Elitelligence, Angeldale\\",\\"7.352, 43.188\\",\\"14.992, 80\\",\\"18,322, 1,687\\",\\"Print T-shirt - grey, Lace-ups - whisky\\",\\"Print T-shirt - grey, Lace-ups - whisky\\",\\"1, 1\\",\\"ZO0558205582, ZO0682406824\\",\\"0, 0\\",\\"14.992, 80\\",\\"14.992, 80\\",\\"0, 0\\",\\"ZO0558205582, ZO0682406824\\",95,95,2,2,order,oliver +hAMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing, Women's Shoes\\",\\"Women's Clothing, Women's Shoes\\",EUR,\\"Rabbia Al\\",\\"Rabbia Al\\",\\"Rabbia Al Palmer\\",\\"Rabbia Al Palmer\\",FEMALE,5,Palmer,Palmer,\\"(empty)\\",Friday,4,\\"rabbia al@palmer-family.zzz\\",Dubai,Asia,AE,\\"POINT (55.3 25.3)\\",Dubai,\\"Spherecords, Pyramidustries, Tigress Enterprises\\",\\"Spherecords, Pyramidustries, Tigress Enterprises\\",\\"Jun 20, 2019 @ 00:00:00.000\\",732071,\\"sold_product_732071_23772, sold_product_732071_22922, sold_product_732071_24589, sold_product_732071_24761\\",\\"sold_product_732071_23772, sold_product_732071_22922, sold_product_732071_24589, sold_product_732071_24761\\",\\"18.984, 33, 24.984, 20.984\\",\\"18.984, 33, 24.984, 20.984\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Women's Clothing, Women's Clothing, Women's Shoes, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Spherecords, Pyramidustries, Tigress Enterprises, Tigress Enterprises\\",\\"Spherecords, Pyramidustries, Tigress Enterprises, Tigress Enterprises\\",\\"10.25, 15.508, 13.492, 10.289\\",\\"18.984, 33, 24.984, 20.984\\",\\"23,772, 22,922, 24,589, 24,761\\",\\"Jumper - turquoise, Jersey dress - dark red, Boots - black, Vest - black\\",\\"Jumper - turquoise, Jersey dress - dark red, Boots - black, Vest - black\\",\\"1, 1, 1, 1\\",\\"ZO0655406554, ZO0154001540, ZO0030300303, ZO0061100611\\",\\"0, 0, 0, 0\\",\\"18.984, 33, 24.984, 20.984\\",\\"18.984, 33, 24.984, 20.984\\",\\"0, 0, 0, 0\\",\\"ZO0655406554, ZO0154001540, ZO0030300303, ZO0061100611\\",\\"97.938\\",\\"97.938\\",4,4,order,rabbia +kQMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",EUR,Yahya,Yahya,\\"Yahya King\\",\\"Yahya King\\",MALE,23,King,King,\\"(empty)\\",Friday,4,\\"yahya@king-family.zzz\\",Marrakesh,Africa,MA,\\"POINT (-8 31.6)\\",\\"Marrakech-Tensift-Al Haouz\\",\\"Low Tide Media, (empty)\\",\\"Low Tide Media, (empty)\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561383,\\"sold_product_561383_15806, sold_product_561383_12605\\",\\"sold_product_561383_15806, sold_product_561383_12605\\",\\"13.992, 155\\",\\"13.992, 155\\",\\"Men's Accessories, Men's Shoes\\",\\"Men's Accessories, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, (empty)\\",\\"Low Tide Media, (empty)\\",\\"7.27, 82.125\\",\\"13.992, 155\\",\\"15,806, 12,605\\",\\"Belt - dark brown, Lace-ups - taupe\\",\\"Belt - dark brown, Lace-ups - taupe\\",\\"1, 1\\",\\"ZO0461804618, ZO0481404814\\",\\"0, 0\\",\\"13.992, 155\\",\\"13.992, 155\\",\\"0, 0\\",\\"ZO0461804618, ZO0481404814\\",169,169,2,2,order,yahya +kgMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Sonya,Sonya,\\"Sonya Strickland\\",\\"Sonya Strickland\\",FEMALE,28,Strickland,Strickland,\\"(empty)\\",Friday,4,\\"sonya@strickland-family.zzz\\",Bogotu00e1,\\"South America\\",CO,\\"POINT (-74.1 4.6)\\",\\"Bogota D.C.\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561825,\\"sold_product_561825_23332, sold_product_561825_8218\\",\\"sold_product_561825_23332, sold_product_561825_8218\\",\\"18.984, 17.984\\",\\"18.984, 17.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"9.117, 9.531\\",\\"18.984, 17.984\\",\\"23,332, 8,218\\",\\"Vest - black/dark green, Sweatshirt - rose\\",\\"Vest - black/dark green, Sweatshirt - rose\\",\\"1, 1\\",\\"ZO0062500625, ZO0179801798\\",\\"0, 0\\",\\"18.984, 17.984\\",\\"18.984, 17.984\\",\\"0, 0\\",\\"ZO0062500625, ZO0179801798\\",\\"36.969\\",\\"36.969\\",2,2,order,sonya +kwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Meyer\\",\\"Abd Meyer\\",MALE,52,Meyer,Meyer,\\"(empty)\\",Friday,4,\\"abd@meyer-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561870,\\"sold_product_561870_18909, sold_product_561870_18272\\",\\"sold_product_561870_18909, sold_product_561870_18272\\",\\"65, 12.992\\",\\"65, 12.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Spritechnologies\\",\\"Low Tide Media, Spritechnologies\\",\\"33.125, 6.109\\",\\"65, 12.992\\",\\"18,909, 18,272\\",\\"Cardigan - grey multicolor, Sports shirt - dark grey multicolor\\",\\"Cardigan - grey multicolor, Sports shirt - dark grey multicolor\\",\\"1, 1\\",\\"ZO0450904509, ZO0615906159\\",\\"0, 0\\",\\"65, 12.992\\",\\"65, 12.992\\",\\"0, 0\\",\\"ZO0450904509, ZO0615906159\\",78,78,2,2,order,abd +wwMtOW0BH63Xcmy453H9,ecommerce,\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Salazar\\",\\"Elyssa Salazar\\",FEMALE,27,Salazar,Salazar,\\"(empty)\\",Friday,4,\\"elyssa@salazar-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",Oceanavigations,Oceanavigations,\\"Jun 20, 2019 @ 00:00:00.000\\",561569,\\"sold_product_561569_22788, sold_product_561569_20475\\",\\"sold_product_561569_22788, sold_product_561569_20475\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Oceanavigations\\",\\"Oceanavigations, Oceanavigations\\",\\"9.867, 15.359\\",\\"20.984, 28.984\\",\\"22,788, 20,475\\",\\"Print T-shirt - white/black, Blouse - red\\",\\"Print T-shirt - white/black, Blouse - red\\",\\"1, 1\\",\\"ZO0264602646, ZO0265202652\\",\\"0, 0\\",\\"20.984, 28.984\\",\\"20.984, 28.984\\",\\"0, 0\\",\\"ZO0264602646, ZO0265202652\\",\\"49.969\\",\\"49.969\\",2,2,order,elyssa +hAMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Robert,Robert,\\"Robert Brock\\",\\"Robert Brock\\",MALE,29,Brock,Brock,\\"(empty)\\",Friday,4,\\"robert@brock-family.zzz\\",\\"-\\",Asia,SA,\\"POINT (45 25)\\",\\"-\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561935,\\"sold_product_561935_20811, sold_product_561935_19107\\",\\"sold_product_561935_20811, sold_product_561935_19107\\",\\"37, 50\\",\\"37, 50\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Oceanavigations\\",\\"Low Tide Media, Oceanavigations\\",\\"17.391, 26.984\\",\\"37, 50\\",\\"20,811, 19,107\\",\\"Shirt - white/red, Suit jacket - navy\\",\\"Shirt - white/red, Suit jacket - navy\\",\\"1, 1\\",\\"ZO0417404174, ZO0275702757\\",\\"0, 0\\",\\"37, 50\\",\\"37, 50\\",\\"0, 0\\",\\"ZO0417404174, ZO0275702757\\",87,87,2,2,order,robert +hQMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",EUR,\\"Abdulraheem Al\\",\\"Abdulraheem Al\\",\\"Abdulraheem Al Graves\\",\\"Abdulraheem Al Graves\\",MALE,33,Graves,Graves,\\"(empty)\\",Friday,4,\\"abdulraheem al@graves-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Low Tide Media\\",\\"Low Tide Media\\",\\"Jun 20, 2019 @ 00:00:00.000\\",561976,\\"sold_product_561976_16395, sold_product_561976_2982\\",\\"sold_product_561976_16395, sold_product_561976_2982\\",\\"42, 33\\",\\"42, 33\\",\\"Men's Shoes, Men's Clothing\\",\\"Men's Shoes, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Low Tide Media, Low Tide Media\\",\\"Low Tide Media, Low Tide Media\\",\\"19.313, 17.484\\",\\"42, 33\\",\\"16,395, 2,982\\",\\"Lace-ups - black, Jumper - multicoloured\\",\\"Lace-ups - black, Jumper - multicoloured\\",\\"1, 1\\",\\"ZO0392703927, ZO0452004520\\",\\"0, 0\\",\\"42, 33\\",\\"42, 33\\",\\"0, 0\\",\\"ZO0392703927, ZO0452004520\\",75,75,2,2,order,abdulraheem +swMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Accessories, Men's Accessories, Men's Shoes\\",\\"Women's Accessories, Men's Accessories, Men's Shoes\\",EUR,\\"Sultan Al\\",\\"Sultan Al\\",\\"Sultan Al Goodman\\",\\"Sultan Al Goodman\\",MALE,19,Goodman,Goodman,\\"(empty)\\",Friday,4,\\"sultan al@goodman-family.zzz\\",\\"Abu Dhabi\\",Asia,AE,\\"POINT (54.4 24.5)\\",\\"Abu Dhabi\\",\\"Elitelligence, Oceanavigations, Angeldale\\",\\"Elitelligence, Oceanavigations, Angeldale\\",\\"Jun 20, 2019 @ 00:00:00.000\\",717426,\\"sold_product_717426_20776, sold_product_717426_13026, sold_product_717426_11738, sold_product_717426_15588\\",\\"sold_product_717426_20776, sold_product_717426_13026, sold_product_717426_11738, sold_product_717426_15588\\",\\"24.984, 100, 14.992, 20.984\\",\\"24.984, 100, 14.992, 20.984\\",\\"Women's Accessories, Men's Accessories, Men's Shoes, Women's Accessories\\",\\"Women's Accessories, Men's Accessories, Men's Shoes, Women's Accessories\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Oceanavigations, Elitelligence, Angeldale\\",\\"Elitelligence, Oceanavigations, Elitelligence, Angeldale\\",\\"12, 48, 7.5, 11.539\\",\\"24.984, 100, 14.992, 20.984\\",\\"20,776, 13,026, 11,738, 15,588\\",\\"Sports bag - navy/cognac, Weekend bag - dark brown, Espadrilles - navy, Wallet - cognac\\",\\"Sports bag - navy/cognac, Weekend bag - dark brown, Espadrilles - navy, Wallet - cognac\\",\\"1, 1, 1, 1\\",\\"ZO0606006060, ZO0314703147, ZO0518005180, ZO0702907029\\",\\"0, 0, 0, 0\\",\\"24.984, 100, 14.992, 20.984\\",\\"24.984, 100, 14.992, 20.984\\",\\"0, 0, 0, 0\\",\\"ZO0606006060, ZO0314703147, ZO0518005180, ZO0702907029\\",161,161,4,4,order,sultan +ywMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing, Men's Shoes\\",\\"Men's Clothing, Men's Shoes\\",EUR,Abd,Abd,\\"Abd Jacobs\\",\\"Abd Jacobs\\",MALE,52,Jacobs,Jacobs,\\"(empty)\\",Friday,4,\\"abd@jacobs-family.zzz\\",Cairo,Africa,EG,\\"POINT (31.3 30.1)\\",\\"Cairo Governorate\\",\\"Elitelligence, Microlutions\\",\\"Elitelligence, Microlutions\\",\\"Jun 20, 2019 @ 00:00:00.000\\",719082,\\"sold_product_719082_23782, sold_product_719082_12684, sold_product_719082_19741, sold_product_719082_19989\\",\\"sold_product_719082_23782, sold_product_719082_12684, sold_product_719082_19741, sold_product_719082_19989\\",\\"28.984, 14.992, 16.984, 28.984\\",\\"28.984, 14.992, 16.984, 28.984\\",\\"Men's Clothing, Men's Clothing, Men's Shoes, Men's Shoes\\",\\"Men's Clothing, Men's Clothing, Men's Shoes, Men's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Microlutions, Elitelligence, Elitelligence\\",\\"Elitelligence, Microlutions, Elitelligence, Elitelligence\\",\\"15.07, 7.5, 7.988, 15.648\\",\\"28.984, 14.992, 16.984, 28.984\\",\\"23,782, 12,684, 19,741, 19,989\\",\\"Tracksuit top - black, Print T-shirt - navy blazer, Trainers - black, Trainers - grey\\",\\"Tracksuit top - black, Print T-shirt - navy blazer, Trainers - black, Trainers - grey\\",\\"1, 1, 1, 1\\",\\"ZO0591005910, ZO0116501165, ZO0507505075, ZO0514305143\\",\\"0, 0, 0, 0\\",\\"28.984, 14.992, 16.984, 28.984\\",\\"28.984, 14.992, 16.984, 28.984\\",\\"0, 0, 0, 0\\",\\"ZO0591005910, ZO0116501165, ZO0507505075, ZO0514305143\\",\\"89.938\\",\\"89.938\\",4,4,order,abd +0wMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Jackson,Jackson,\\"Jackson Pope\\",\\"Jackson Pope\\",MALE,13,Pope,Pope,\\"(empty)\\",Friday,4,\\"jackson@pope-family.zzz\\",\\"Los Angeles\\",\\"North America\\",US,\\"POINT (-118.2 34.1)\\",California,\\"Elitelligence, Microlutions, Oceanavigations\\",\\"Elitelligence, Microlutions, Oceanavigations\\",\\"Jun 20, 2019 @ 00:00:00.000\\",715688,\\"sold_product_715688_19518, sold_product_715688_21048, sold_product_715688_12333, sold_product_715688_21005\\",\\"sold_product_715688_19518, sold_product_715688_21048, sold_product_715688_12333, sold_product_715688_21005\\",\\"33, 14.992, 16.984, 20.984\\",\\"33, 14.992, 16.984, 20.984\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing, Men's Clothing, Men's Clothing\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Elitelligence, Microlutions, Elitelligence, Oceanavigations\\",\\"Elitelligence, Microlutions, Elitelligence, Oceanavigations\\",\\"16.813, 6.75, 7.648, 9.656\\",\\"33, 14.992, 16.984, 20.984\\",\\"19,518, 21,048, 12,333, 21,005\\",\\"Sweatshirt - mottled grey, Print T-shirt - bright white, Tracksuit top - black, Formal shirt - white\\",\\"Sweatshirt - mottled grey, Print T-shirt - bright white, Tracksuit top - black, Formal shirt - white\\",\\"1, 1, 1, 1\\",\\"ZO0585505855, ZO0121001210, ZO0583005830, ZO0279402794\\",\\"0, 0, 0, 0\\",\\"33, 14.992, 16.984, 20.984\\",\\"33, 14.992, 16.984, 20.984\\",\\"0, 0, 0, 0\\",\\"ZO0585505855, ZO0121001210, ZO0583005830, ZO0279402794\\",\\"85.938\\",\\"85.938\\",4,4,order,jackson +1QMtOW0BH63Xcmy46HLV,ecommerce,\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Elyssa,Elyssa,\\"Elyssa Bryan\\",\\"Elyssa Bryan\\",FEMALE,27,Bryan,Bryan,\\"(empty)\\",Friday,4,\\"elyssa@bryan-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"POINT (-74 40.8)\\",\\"New York\\",\\"Low Tide Media, Pyramidustries, Pyramidustries active\\",\\"Low Tide Media, Pyramidustries, Pyramidustries active\\",\\"Jun 20, 2019 @ 00:00:00.000\\",729671,\\"sold_product_729671_5140, sold_product_729671_12381, sold_product_729671_16267, sold_product_729671_20230\\",\\"sold_product_729671_5140, sold_product_729671_12381, sold_product_729671_16267, sold_product_729671_20230\\",\\"60, 16.984, 24.984, 24.984\\",\\"60, 16.984, 24.984, 24.984\\",\\"Women's Shoes, Women's Clothing, Women's Clothing, Women's Shoes\\",\\"Women's Shoes, Women's Clothing, Women's Clothing, Women's Shoes\\",\\"Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000, Dec 9, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Low Tide Media, Pyramidustries, Pyramidustries active, Pyramidustries\\",\\"Low Tide Media, Pyramidustries, Pyramidustries active, Pyramidustries\\",\\"30, 7.648, 12.492, 12\\",\\"60, 16.984, 24.984, 24.984\\",\\"5,140, 12,381, 16,267, 20,230\\",\\"Ankle boots - onix, Sweatshirt - rose, Tights - black, Sandals - silver\\",\\"Ankle boots - onix, Sweatshirt - rose, Tights - black, Sandals - silver\\",\\"1, 1, 1, 1\\",\\"ZO0375303753, ZO0178301783, ZO0226002260, ZO0137601376\\",\\"0, 0, 0, 0\\",\\"60, 16.984, 24.984, 24.984\\",\\"60, 16.984, 24.984, 24.984\\",\\"0, 0, 0, 0\\",\\"ZO0375303753, ZO0178301783, ZO0226002260, ZO0137601376\\",\\"126.938\\",\\"126.938\\",4,4,order,elyssa +" +`; + +exports[`discover Discover CSV Export Generate CSV: sparse data handles field formatting for a field that doesn't exist initially 1`] = ` +"timestamp,name,\\"updated_at\\" +\\"Aug 13, 2006 @ 00:00:00.000\\",\\"test-510\\",\\"-\\" +\\"Aug 12, 2006 @ 00:00:00.000\\",\\"test-509\\",\\"-\\" +\\"Aug 11, 2006 @ 00:00:00.000\\",\\"test-508\\",\\"-\\" +\\"Aug 10, 2006 @ 00:00:00.000\\",\\"test-507\\",\\"-\\" +\\"Aug 9, 2006 @ 00:00:00.000\\",\\"test-506\\",\\"-\\" +\\"Aug 8, 2006 @ 00:00:00.000\\",\\"test-505\\",\\"-\\" +\\"Aug 7, 2006 @ 00:00:00.000\\",\\"test-504\\",\\"-\\" +\\"Aug 6, 2006 @ 00:00:00.000\\",\\"test-503\\",\\"-\\" +\\"Aug 5, 2006 @ 00:00:00.000\\",\\"test-502\\",\\"-\\" +\\"Aug 4, 2006 @ 00:00:00.000\\",\\"test-501\\",\\"-\\" +\\"Aug 3, 2006 @ 00:00:00.000\\",\\"test-500\\",\\"-\\" +\\"Aug 2, 2006 @ 00:00:00.000\\",\\"test-499\\",\\"-\\" +\\"Aug 1, 2006 @ 00:00:00.000\\",\\"test-498\\",\\"-\\" +\\"Jul 31, 2006 @ 00:00:00.000\\",\\"test-497\\",\\"-\\" +\\"Jul 30, 2006 @ 00:00:00.000\\",\\"test-496\\",\\"-\\" +\\"Jul 29, 2006 @ 00:00:00.000\\",\\"test-495\\",\\"-\\" +\\"Jul 28, 2006 @ 00:00:00.000\\",\\"test-494\\",\\"-\\" +\\"Jul 27, 2006 @ 00:00:00.000\\",\\"test-493\\",\\"-\\" +\\"Jul 26, 2006 @ 00:00:00.000\\",\\"test-492\\",\\"-\\" +\\"Jul 25, 2006 @ 00:00:00.000\\",\\"test-491\\",\\"-\\" +\\"Jul 24, 2006 @ 00:00:00.000\\",\\"test-490\\",\\"-\\" +\\"Jul 23, 2006 @ 00:00:00.000\\",\\"test-489\\",\\"-\\" +\\"Jul 22, 2006 @ 00:00:00.000\\",\\"test-488\\",\\"-\\" +\\"Jul 21, 2006 @ 00:00:00.000\\",\\"test-487\\",\\"-\\" +\\"Jul 20, 2006 @ 00:00:00.000\\",\\"test-486\\",\\"-\\" +\\"Jul 19, 2006 @ 00:00:00.000\\",\\"test-485\\",\\"-\\" +\\"Jul 18, 2006 @ 00:00:00.000\\",\\"test-484\\",\\"-\\" +\\"Jul 17, 2006 @ 00:00:00.000\\",\\"test-483\\",\\"-\\" +\\"Jul 16, 2006 @ 00:00:00.000\\",\\"test-482\\",\\"-\\" +\\"Jul 15, 2006 @ 00:00:00.000\\",\\"test-481\\",\\"-\\" +\\"Jul 14, 2006 @ 00:00:00.000\\",\\"test-480\\",\\"-\\" +\\"Jul 13, 2006 @ 00:00:00.000\\",\\"test-479\\",\\"-\\" +\\"Jul 12, 2006 @ 00:00:00.000\\",\\"test-478\\",\\"-\\" +\\"Jul 11, 2006 @ 00:00:00.000\\",\\"test-477\\",\\"-\\" +\\"Jul 10, 2006 @ 00:00:00.000\\",\\"test-476\\",\\"-\\" +\\"Jul 9, 2006 @ 00:00:00.000\\",\\"test-475\\",\\"-\\" +\\"Jul 8, 2006 @ 00:00:00.000\\",\\"test-474\\",\\"-\\" +\\"Jul 7, 2006 @ 00:00:00.000\\",\\"test-473\\",\\"-\\" +\\"Jul 6, 2006 @ 00:00:00.000\\",\\"test-472\\",\\"-\\" +\\"Jul 5, 2006 @ 00:00:00.000\\",\\"test-471\\",\\"-\\" +\\"Jul 4, 2006 @ 00:00:00.000\\",\\"test-470\\",\\"-\\" +\\"Jul 3, 2006 @ 00:00:00.000\\",\\"test-469\\",\\"-\\" +\\"Jul 2, 2006 @ 00:00:00.000\\",\\"test-468\\",\\"-\\" +\\"Jul 1, 2006 @ 00:00:00.000\\",\\"test-467\\",\\"-\\" +\\"Jun 30, 2006 @ 00:00:00.000\\",\\"test-466\\",\\"-\\" +\\"Jun 29, 2006 @ 00:00:00.000\\",\\"test-465\\",\\"-\\" +\\"Jun 28, 2006 @ 00:00:00.000\\",\\"test-464\\",\\"-\\" +\\"Jun 27, 2006 @ 00:00:00.000\\",\\"test-463\\",\\"-\\" +\\"Jun 26, 2006 @ 00:00:00.000\\",\\"test-462\\",\\"-\\" +\\"Jun 25, 2006 @ 00:00:00.000\\",\\"test-461\\",\\"-\\" +\\"Jun 24, 2006 @ 00:00:00.000\\",\\"test-460\\",\\"-\\" +\\"Jun 23, 2006 @ 00:00:00.000\\",\\"test-459\\",\\"-\\" +\\"Jun 22, 2006 @ 00:00:00.000\\",\\"test-458\\",\\"-\\" +\\"Jun 21, 2006 @ 00:00:00.000\\",\\"test-457\\",\\"-\\" +\\"Jun 20, 2006 @ 00:00:00.000\\",\\"test-456\\",\\"-\\" +\\"Jun 19, 2006 @ 00:00:00.000\\",\\"test-455\\",\\"-\\" +\\"Jun 18, 2006 @ 00:00:00.000\\",\\"test-454\\",\\"-\\" +\\"Jun 17, 2006 @ 00:00:00.000\\",\\"test-453\\",\\"-\\" +\\"Jun 16, 2006 @ 00:00:00.000\\",\\"test-452\\",\\"-\\" +\\"Jun 15, 2006 @ 00:00:00.000\\",\\"test-451\\",\\"-\\" +\\"Jun 14, 2006 @ 00:00:00.000\\",\\"test-450\\",\\"-\\" +\\"Jun 13, 2006 @ 00:00:00.000\\",\\"test-449\\",\\"-\\" +\\"Jun 12, 2006 @ 00:00:00.000\\",\\"test-448\\",\\"-\\" +\\"Jun 11, 2006 @ 00:00:00.000\\",\\"test-447\\",\\"-\\" +\\"Jun 10, 2006 @ 00:00:00.000\\",\\"test-446\\",\\"-\\" +\\"Jun 9, 2006 @ 00:00:00.000\\",\\"test-445\\",\\"-\\" +\\"Jun 8, 2006 @ 00:00:00.000\\",\\"test-444\\",\\"-\\" +\\"Jun 7, 2006 @ 00:00:00.000\\",\\"test-443\\",\\"-\\" +\\"Jun 6, 2006 @ 00:00:00.000\\",\\"test-442\\",\\"-\\" +\\"Jun 5, 2006 @ 00:00:00.000\\",\\"test-441\\",\\"-\\" +\\"Jun 4, 2006 @ 00:00:00.000\\",\\"test-440\\",\\"-\\" +\\"Jun 3, 2006 @ 00:00:00.000\\",\\"test-439\\",\\"-\\" +\\"Jun 2, 2006 @ 00:00:00.000\\",\\"test-438\\",\\"-\\" +\\"Jun 1, 2006 @ 00:00:00.000\\",\\"test-437\\",\\"-\\" +\\"May 31, 2006 @ 00:00:00.000\\",\\"test-436\\",\\"-\\" +\\"May 30, 2006 @ 00:00:00.000\\",\\"test-435\\",\\"-\\" +\\"May 29, 2006 @ 00:00:00.000\\",\\"test-434\\",\\"-\\" +\\"May 28, 2006 @ 00:00:00.000\\",\\"test-433\\",\\"-\\" +\\"May 27, 2006 @ 00:00:00.000\\",\\"test-432\\",\\"-\\" +\\"May 26, 2006 @ 00:00:00.000\\",\\"test-431\\",\\"-\\" +\\"May 25, 2006 @ 00:00:00.000\\",\\"test-430\\",\\"-\\" +\\"May 24, 2006 @ 00:00:00.000\\",\\"test-429\\",\\"-\\" +\\"May 23, 2006 @ 00:00:00.000\\",\\"test-428\\",\\"-\\" +\\"May 22, 2006 @ 00:00:00.000\\",\\"test-427\\",\\"-\\" +\\"May 21, 2006 @ 00:00:00.000\\",\\"test-426\\",\\"-\\" +\\"May 20, 2006 @ 00:00:00.000\\",\\"test-425\\",\\"-\\" +\\"May 19, 2006 @ 00:00:00.000\\",\\"test-424\\",\\"-\\" +\\"May 18, 2006 @ 00:00:00.000\\",\\"test-423\\",\\"-\\" +\\"May 17, 2006 @ 00:00:00.000\\",\\"test-422\\",\\"-\\" +\\"May 16, 2006 @ 00:00:00.000\\",\\"test-421\\",\\"-\\" +\\"May 15, 2006 @ 00:00:00.000\\",\\"test-420\\",\\"-\\" +\\"May 14, 2006 @ 00:00:00.000\\",\\"test-419\\",\\"-\\" +\\"May 13, 2006 @ 00:00:00.000\\",\\"test-418\\",\\"-\\" +\\"May 12, 2006 @ 00:00:00.000\\",\\"test-417\\",\\"-\\" +\\"May 11, 2006 @ 00:00:00.000\\",\\"test-416\\",\\"-\\" +\\"May 10, 2006 @ 00:00:00.000\\",\\"test-415\\",\\"-\\" +\\"May 9, 2006 @ 00:00:00.000\\",\\"test-414\\",\\"-\\" +\\"May 8, 2006 @ 00:00:00.000\\",\\"test-413\\",\\"-\\" +\\"May 7, 2006 @ 00:00:00.000\\",\\"test-412\\",\\"-\\" +\\"May 6, 2006 @ 00:00:00.000\\",\\"test-411\\",\\"-\\" +\\"May 5, 2006 @ 00:00:00.000\\",\\"test-410\\",\\"-\\" +\\"May 4, 2006 @ 00:00:00.000\\",\\"test-409\\",\\"-\\" +\\"May 3, 2006 @ 00:00:00.000\\",\\"test-408\\",\\"-\\" +\\"May 2, 2006 @ 00:00:00.000\\",\\"test-407\\",\\"-\\" +\\"May 1, 2006 @ 00:00:00.000\\",\\"test-406\\",\\"-\\" +\\"Apr 30, 2006 @ 00:00:00.000\\",\\"test-405\\",\\"-\\" +\\"Apr 29, 2006 @ 00:00:00.000\\",\\"test-404\\",\\"-\\" +\\"Apr 28, 2006 @ 00:00:00.000\\",\\"test-403\\",\\"-\\" +\\"Apr 27, 2006 @ 00:00:00.000\\",\\"test-402\\",\\"-\\" +\\"Apr 26, 2006 @ 00:00:00.000\\",\\"test-401\\",\\"-\\" +\\"Apr 25, 2006 @ 00:00:00.000\\",\\"test-400\\",\\"-\\" +\\"Apr 24, 2006 @ 00:00:00.000\\",\\"test-399\\",\\"-\\" +\\"Apr 23, 2006 @ 00:00:00.000\\",\\"test-398\\",\\"-\\" +\\"Apr 22, 2006 @ 00:00:00.000\\",\\"test-397\\",\\"-\\" +\\"Apr 21, 2006 @ 00:00:00.000\\",\\"test-396\\",\\"-\\" +\\"Apr 20, 2006 @ 00:00:00.000\\",\\"test-395\\",\\"-\\" +\\"Apr 19, 2006 @ 00:00:00.000\\",\\"test-394\\",\\"-\\" +\\"Apr 18, 2006 @ 00:00:00.000\\",\\"test-393\\",\\"-\\" +\\"Apr 17, 2006 @ 00:00:00.000\\",\\"test-392\\",\\"-\\" +\\"Apr 16, 2006 @ 00:00:00.000\\",\\"test-391\\",\\"-\\" +\\"Apr 15, 2006 @ 00:00:00.000\\",\\"test-390\\",\\"-\\" +\\"Apr 14, 2006 @ 00:00:00.000\\",\\"test-389\\",\\"-\\" +\\"Apr 13, 2006 @ 00:00:00.000\\",\\"test-388\\",\\"-\\" +\\"Apr 12, 2006 @ 00:00:00.000\\",\\"test-387\\",\\"-\\" +\\"Apr 11, 2006 @ 00:00:00.000\\",\\"test-386\\",\\"-\\" +\\"Apr 10, 2006 @ 00:00:00.000\\",\\"test-385\\",\\"-\\" +\\"Apr 9, 2006 @ 00:00:00.000\\",\\"test-384\\",\\"-\\" +\\"Apr 8, 2006 @ 00:00:00.000\\",\\"test-383\\",\\"-\\" +\\"Apr 7, 2006 @ 00:00:00.000\\",\\"test-382\\",\\"-\\" +\\"Apr 6, 2006 @ 00:00:00.000\\",\\"test-381\\",\\"-\\" +\\"Apr 5, 2006 @ 00:00:00.000\\",\\"test-380\\",\\"-\\" +\\"Apr 4, 2006 @ 00:00:00.000\\",\\"test-379\\",\\"-\\" +\\"Apr 3, 2006 @ 00:00:00.000\\",\\"test-378\\",\\"-\\" +\\"Apr 2, 2006 @ 00:00:00.000\\",\\"test-377\\",\\"-\\" +\\"Apr 1, 2006 @ 00:00:00.000\\",\\"test-376\\",\\"-\\" +\\"Mar 31, 2006 @ 00:00:00.000\\",\\"test-375\\",\\"-\\" +\\"Mar 30, 2006 @ 00:00:00.000\\",\\"test-374\\",\\"-\\" +\\"Mar 29, 2006 @ 00:00:00.000\\",\\"test-373\\",\\"-\\" +\\"Mar 28, 2006 @ 00:00:00.000\\",\\"test-372\\",\\"-\\" +\\"Mar 27, 2006 @ 00:00:00.000\\",\\"test-371\\",\\"-\\" +\\"Mar 26, 2006 @ 00:00:00.000\\",\\"test-370\\",\\"-\\" +\\"Mar 25, 2006 @ 00:00:00.000\\",\\"test-369\\",\\"-\\" +\\"Mar 24, 2006 @ 00:00:00.000\\",\\"test-368\\",\\"-\\" +\\"Mar 23, 2006 @ 00:00:00.000\\",\\"test-367\\",\\"-\\" +\\"Mar 22, 2006 @ 00:00:00.000\\",\\"test-366\\",\\"-\\" +\\"Mar 21, 2006 @ 00:00:00.000\\",\\"test-365\\",\\"-\\" +\\"Mar 20, 2006 @ 00:00:00.000\\",\\"test-364\\",\\"-\\" +\\"Mar 19, 2006 @ 00:00:00.000\\",\\"test-363\\",\\"-\\" +\\"Mar 18, 2006 @ 00:00:00.000\\",\\"test-362\\",\\"-\\" +\\"Mar 17, 2006 @ 00:00:00.000\\",\\"test-361\\",\\"-\\" +\\"Mar 16, 2006 @ 00:00:00.000\\",\\"test-360\\",\\"-\\" +\\"Mar 15, 2006 @ 00:00:00.000\\",\\"test-359\\",\\"-\\" +\\"Mar 14, 2006 @ 00:00:00.000\\",\\"test-358\\",\\"-\\" +\\"Mar 13, 2006 @ 00:00:00.000\\",\\"test-357\\",\\"-\\" +\\"Mar 12, 2006 @ 00:00:00.000\\",\\"test-356\\",\\"-\\" +\\"Mar 11, 2006 @ 00:00:00.000\\",\\"test-355\\",\\"-\\" +\\"Mar 10, 2006 @ 00:00:00.000\\",\\"test-354\\",\\"-\\" +\\"Mar 9, 2006 @ 00:00:00.000\\",\\"test-353\\",\\"-\\" +\\"Mar 8, 2006 @ 00:00:00.000\\",\\"test-352\\",\\"-\\" +\\"Mar 7, 2006 @ 00:00:00.000\\",\\"test-351\\",\\"-\\" +\\"Mar 6, 2006 @ 00:00:00.000\\",\\"test-350\\",\\"-\\" +\\"Mar 5, 2006 @ 00:00:00.000\\",\\"test-349\\",\\"-\\" +\\"Mar 4, 2006 @ 00:00:00.000\\",\\"test-348\\",\\"-\\" +\\"Mar 3, 2006 @ 00:00:00.000\\",\\"test-347\\",\\"-\\" +\\"Mar 2, 2006 @ 00:00:00.000\\",\\"test-346\\",\\"-\\" +\\"Mar 1, 2006 @ 00:00:00.000\\",\\"test-345\\",\\"-\\" +\\"Feb 28, 2006 @ 00:00:00.000\\",\\"test-344\\",\\"-\\" +\\"Feb 27, 2006 @ 00:00:00.000\\",\\"test-343\\",\\"-\\" +\\"Feb 26, 2006 @ 00:00:00.000\\",\\"test-342\\",\\"-\\" +\\"Feb 25, 2006 @ 00:00:00.000\\",\\"test-341\\",\\"-\\" +\\"Feb 24, 2006 @ 00:00:00.000\\",\\"test-340\\",\\"-\\" +\\"Feb 23, 2006 @ 00:00:00.000\\",\\"test-339\\",\\"-\\" +\\"Feb 22, 2006 @ 00:00:00.000\\",\\"test-338\\",\\"-\\" +\\"Feb 21, 2006 @ 00:00:00.000\\",\\"test-337\\",\\"-\\" +\\"Feb 20, 2006 @ 00:00:00.000\\",\\"test-336\\",\\"-\\" +\\"Feb 19, 2006 @ 00:00:00.000\\",\\"test-335\\",\\"-\\" +\\"Feb 18, 2006 @ 00:00:00.000\\",\\"test-334\\",\\"-\\" +\\"Feb 17, 2006 @ 00:00:00.000\\",\\"test-333\\",\\"-\\" +\\"Feb 16, 2006 @ 00:00:00.000\\",\\"test-332\\",\\"-\\" +\\"Feb 15, 2006 @ 00:00:00.000\\",\\"test-331\\",\\"-\\" +\\"Feb 14, 2006 @ 00:00:00.000\\",\\"test-330\\",\\"-\\" +\\"Feb 13, 2006 @ 00:00:00.000\\",\\"test-329\\",\\"-\\" +\\"Feb 12, 2006 @ 00:00:00.000\\",\\"test-328\\",\\"-\\" +\\"Feb 11, 2006 @ 00:00:00.000\\",\\"test-327\\",\\"-\\" +\\"Feb 10, 2006 @ 00:00:00.000\\",\\"test-326\\",\\"-\\" +\\"Feb 9, 2006 @ 00:00:00.000\\",\\"test-325\\",\\"-\\" +\\"Feb 8, 2006 @ 00:00:00.000\\",\\"test-324\\",\\"-\\" +\\"Feb 7, 2006 @ 00:00:00.000\\",\\"test-323\\",\\"-\\" +\\"Feb 6, 2006 @ 00:00:00.000\\",\\"test-322\\",\\"-\\" +\\"Feb 5, 2006 @ 00:00:00.000\\",\\"test-321\\",\\"-\\" +\\"Feb 4, 2006 @ 00:00:00.000\\",\\"test-320\\",\\"-\\" +\\"Feb 3, 2006 @ 00:00:00.000\\",\\"test-319\\",\\"-\\" +\\"Feb 2, 2006 @ 00:00:00.000\\",\\"test-318\\",\\"-\\" +\\"Feb 1, 2006 @ 00:00:00.000\\",\\"test-317\\",\\"-\\" +\\"Jan 31, 2006 @ 00:00:00.000\\",\\"test-316\\",\\"-\\" +\\"Jan 30, 2006 @ 00:00:00.000\\",\\"test-315\\",\\"-\\" +\\"Jan 29, 2006 @ 00:00:00.000\\",\\"test-314\\",\\"-\\" +\\"Jan 28, 2006 @ 00:00:00.000\\",\\"test-313\\",\\"-\\" +\\"Jan 27, 2006 @ 00:00:00.000\\",\\"test-312\\",\\"-\\" +\\"Jan 26, 2006 @ 00:00:00.000\\",\\"test-311\\",\\"-\\" +\\"Jan 25, 2006 @ 00:00:00.000\\",\\"test-310\\",\\"-\\" +\\"Jan 24, 2006 @ 00:00:00.000\\",\\"test-309\\",\\"-\\" +\\"Jan 23, 2006 @ 00:00:00.000\\",\\"test-308\\",\\"-\\" +\\"Jan 22, 2006 @ 00:00:00.000\\",\\"test-307\\",\\"-\\" +\\"Jan 21, 2006 @ 00:00:00.000\\",\\"test-306\\",\\"-\\" +\\"Jan 20, 2006 @ 00:00:00.000\\",\\"test-305\\",\\"-\\" +\\"Jan 19, 2006 @ 00:00:00.000\\",\\"test-304\\",\\"-\\" +\\"Jan 18, 2006 @ 00:00:00.000\\",\\"test-303\\",\\"-\\" +\\"Jan 17, 2006 @ 00:00:00.000\\",\\"test-302\\",\\"-\\" +\\"Jan 16, 2006 @ 00:00:00.000\\",\\"test-301\\",\\"-\\" +\\"Jan 15, 2006 @ 00:00:00.000\\",\\"test-300\\",\\"-\\" +\\"Jan 14, 2006 @ 00:00:00.000\\",\\"test-299\\",\\"-\\" +\\"Jan 13, 2006 @ 00:00:00.000\\",\\"test-298\\",\\"-\\" +\\"Jan 12, 2006 @ 00:00:00.000\\",\\"test-297\\",\\"-\\" +\\"Jan 11, 2006 @ 00:00:00.000\\",\\"test-296\\",\\"-\\" +\\"Jan 10, 2006 @ 00:00:00.000\\",\\"test-295\\",\\"-\\" +\\"Jan 9, 2006 @ 00:00:00.000\\",\\"test-294\\",\\"-\\" +\\"Jan 8, 2006 @ 00:00:00.000\\",\\"test-293\\",\\"-\\" +\\"Jan 7, 2006 @ 00:00:00.000\\",\\"test-292\\",\\"-\\" +\\"Jan 6, 2006 @ 00:00:00.000\\",\\"test-291\\",\\"-\\" +\\"Jan 5, 2006 @ 00:00:00.000\\",\\"test-290\\",\\"-\\" +\\"Jan 4, 2006 @ 00:00:00.000\\",\\"test-289\\",\\"-\\" +\\"Jan 3, 2006 @ 00:00:00.000\\",\\"test-288\\",\\"-\\" +\\"Jan 2, 2006 @ 00:00:00.000\\",\\"test-287\\",\\"-\\" +\\"Jan 1, 2006 @ 00:00:00.000\\",\\"test-286\\",\\"-\\" +\\"Dec 31, 2005 @ 00:00:00.000\\",\\"test-285\\",\\"-\\" +\\"Dec 30, 2005 @ 00:00:00.000\\",\\"test-284\\",\\"-\\" +\\"Dec 29, 2005 @ 00:00:00.000\\",\\"test-283\\",\\"-\\" +\\"Dec 28, 2005 @ 00:00:00.000\\",\\"test-282\\",\\"-\\" +\\"Dec 27, 2005 @ 00:00:00.000\\",\\"test-281\\",\\"-\\" +\\"Dec 26, 2005 @ 00:00:00.000\\",\\"test-280\\",\\"-\\" +\\"Dec 25, 2005 @ 00:00:00.000\\",\\"test-279\\",\\"-\\" +\\"Dec 24, 2005 @ 00:00:00.000\\",\\"test-278\\",\\"-\\" +\\"Dec 23, 2005 @ 00:00:00.000\\",\\"test-277\\",\\"-\\" +\\"Dec 22, 2005 @ 00:00:00.000\\",\\"test-276\\",\\"-\\" +\\"Dec 21, 2005 @ 00:00:00.000\\",\\"test-275\\",\\"-\\" +\\"Dec 20, 2005 @ 00:00:00.000\\",\\"test-274\\",\\"-\\" +\\"Dec 19, 2005 @ 00:00:00.000\\",\\"test-273\\",\\"-\\" +\\"Dec 18, 2005 @ 00:00:00.000\\",\\"test-272\\",\\"-\\" +\\"Dec 17, 2005 @ 00:00:00.000\\",\\"test-271\\",\\"-\\" +\\"Dec 16, 2005 @ 00:00:00.000\\",\\"test-270\\",\\"-\\" +\\"Dec 15, 2005 @ 00:00:00.000\\",\\"test-269\\",\\"-\\" +\\"Dec 14, 2005 @ 00:00:00.000\\",\\"test-268\\",\\"-\\" +\\"Dec 13, 2005 @ 00:00:00.000\\",\\"test-267\\",\\"-\\" +\\"Dec 12, 2005 @ 00:00:00.000\\",\\"test-266\\",\\"-\\" +\\"Dec 11, 2005 @ 00:00:00.000\\",\\"test-265\\",\\"-\\" +\\"Dec 10, 2005 @ 00:00:00.000\\",\\"test-264\\",\\"-\\" +\\"Dec 9, 2005 @ 00:00:00.000\\",\\"test-263\\",\\"-\\" +\\"Dec 8, 2005 @ 00:00:00.000\\",\\"test-262\\",\\"-\\" +\\"Dec 7, 2005 @ 00:00:00.000\\",\\"test-261\\",\\"-\\" +\\"Dec 6, 2005 @ 00:00:00.000\\",\\"test-260\\",\\"-\\" +\\"Dec 5, 2005 @ 00:00:00.000\\",\\"test-259\\",\\"-\\" +\\"Dec 4, 2005 @ 00:00:00.000\\",\\"test-258\\",\\"-\\" +\\"Dec 3, 2005 @ 00:00:00.000\\",\\"test-257\\",\\"-\\" +\\"Dec 2, 2005 @ 00:00:00.000\\",\\"test-256\\",\\"-\\" +\\"Dec 1, 2005 @ 00:00:00.000\\",\\"test-255\\",\\"-\\" +\\"Nov 30, 2005 @ 00:00:00.000\\",\\"test-254\\",\\"-\\" +\\"Nov 29, 2005 @ 00:00:00.000\\",\\"test-253\\",\\"-\\" +\\"Nov 28, 2005 @ 00:00:00.000\\",\\"test-252\\",\\"-\\" +\\"Nov 27, 2005 @ 00:00:00.000\\",\\"test-251\\",\\"-\\" +\\"Nov 26, 2005 @ 00:00:00.000\\",\\"test-250\\",\\"-\\" +\\"Nov 25, 2005 @ 00:00:00.000\\",\\"test-249\\",\\"-\\" +\\"Nov 24, 2005 @ 00:00:00.000\\",\\"test-248\\",\\"-\\" +\\"Nov 23, 2005 @ 00:00:00.000\\",\\"test-247\\",\\"-\\" +\\"Nov 22, 2005 @ 00:00:00.000\\",\\"test-246\\",\\"-\\" +\\"Nov 21, 2005 @ 00:00:00.000\\",\\"test-245\\",\\"-\\" +\\"Nov 20, 2005 @ 00:00:00.000\\",\\"test-244\\",\\"-\\" +\\"Nov 19, 2005 @ 00:00:00.000\\",\\"test-243\\",\\"-\\" +\\"Nov 18, 2005 @ 00:00:00.000\\",\\"test-242\\",\\"-\\" +\\"Nov 17, 2005 @ 00:00:00.000\\",\\"test-241\\",\\"-\\" +\\"Nov 16, 2005 @ 00:00:00.000\\",\\"test-240\\",\\"-\\" +\\"Nov 15, 2005 @ 00:00:00.000\\",\\"test-239\\",\\"-\\" +\\"Nov 14, 2005 @ 00:00:00.000\\",\\"test-238\\",\\"-\\" +\\"Nov 13, 2005 @ 00:00:00.000\\",\\"test-237\\",\\"-\\" +\\"Nov 12, 2005 @ 00:00:00.000\\",\\"test-236\\",\\"-\\" +\\"Nov 11, 2005 @ 00:00:00.000\\",\\"test-235\\",\\"-\\" +\\"Nov 10, 2005 @ 00:00:00.000\\",\\"test-234\\",\\"-\\" +\\"Nov 9, 2005 @ 00:00:00.000\\",\\"test-233\\",\\"-\\" +\\"Nov 8, 2005 @ 00:00:00.000\\",\\"test-232\\",\\"-\\" +\\"Nov 7, 2005 @ 00:00:00.000\\",\\"test-231\\",\\"-\\" +\\"Nov 6, 2005 @ 00:00:00.000\\",\\"test-230\\",\\"-\\" +\\"Nov 5, 2005 @ 00:00:00.000\\",\\"test-229\\",\\"-\\" +\\"Nov 4, 2005 @ 00:00:00.000\\",\\"test-228\\",\\"-\\" +\\"Nov 3, 2005 @ 00:00:00.000\\",\\"test-227\\",\\"-\\" +\\"Nov 2, 2005 @ 00:00:00.000\\",\\"test-226\\",\\"-\\" +\\"Nov 1, 2005 @ 00:00:00.000\\",\\"test-225\\",\\"-\\" +\\"Oct 31, 2005 @ 00:00:00.000\\",\\"test-224\\",\\"-\\" +\\"Oct 30, 2005 @ 00:00:00.000\\",\\"test-223\\",\\"-\\" +\\"Oct 29, 2005 @ 00:00:00.000\\",\\"test-222\\",\\"-\\" +\\"Oct 28, 2005 @ 00:00:00.000\\",\\"test-221\\",\\"-\\" +\\"Oct 27, 2005 @ 00:00:00.000\\",\\"test-220\\",\\"-\\" +\\"Oct 26, 2005 @ 00:00:00.000\\",\\"test-219\\",\\"-\\" +\\"Oct 25, 2005 @ 00:00:00.000\\",\\"test-218\\",\\"-\\" +\\"Oct 24, 2005 @ 00:00:00.000\\",\\"test-217\\",\\"-\\" +\\"Oct 23, 2005 @ 00:00:00.000\\",\\"test-216\\",\\"-\\" +\\"Oct 22, 2005 @ 00:00:00.000\\",\\"test-215\\",\\"-\\" +\\"Oct 21, 2005 @ 00:00:00.000\\",\\"test-214\\",\\"-\\" +\\"Oct 20, 2005 @ 00:00:00.000\\",\\"test-213\\",\\"-\\" +\\"Oct 19, 2005 @ 00:00:00.000\\",\\"test-212\\",\\"-\\" +\\"Oct 18, 2005 @ 00:00:00.000\\",\\"test-211\\",\\"-\\" +\\"Oct 17, 2005 @ 00:00:00.000\\",\\"test-210\\",\\"-\\" +\\"Oct 16, 2005 @ 00:00:00.000\\",\\"test-209\\",\\"-\\" +\\"Oct 15, 2005 @ 00:00:00.000\\",\\"test-208\\",\\"-\\" +\\"Oct 14, 2005 @ 00:00:00.000\\",\\"test-207\\",\\"-\\" +\\"Oct 13, 2005 @ 00:00:00.000\\",\\"test-206\\",\\"-\\" +\\"Oct 12, 2005 @ 00:00:00.000\\",\\"test-205\\",\\"-\\" +\\"Oct 11, 2005 @ 00:00:00.000\\",\\"test-204\\",\\"-\\" +\\"Oct 10, 2005 @ 00:00:00.000\\",\\"test-203\\",\\"-\\" +\\"Oct 9, 2005 @ 00:00:00.000\\",\\"test-202\\",\\"-\\" +\\"Oct 8, 2005 @ 00:00:00.000\\",\\"test-201\\",\\"-\\" +\\"Oct 7, 2005 @ 00:00:00.000\\",\\"test-200\\",\\"-\\" +\\"Oct 6, 2005 @ 00:00:00.000\\",\\"test-199\\",\\"-\\" +\\"Oct 5, 2005 @ 00:00:00.000\\",\\"test-198\\",\\"-\\" +\\"Oct 4, 2005 @ 00:00:00.000\\",\\"test-197\\",\\"-\\" +\\"Oct 3, 2005 @ 00:00:00.000\\",\\"test-196\\",\\"-\\" +\\"Oct 2, 2005 @ 00:00:00.000\\",\\"test-195\\",\\"-\\" +\\"Oct 1, 2005 @ 00:00:00.000\\",\\"test-194\\",\\"-\\" +\\"Sep 30, 2005 @ 00:00:00.000\\",\\"test-193\\",\\"-\\" +\\"Sep 29, 2005 @ 00:00:00.000\\",\\"test-192\\",\\"-\\" +\\"Sep 28, 2005 @ 00:00:00.000\\",\\"test-191\\",\\"-\\" +\\"Sep 27, 2005 @ 00:00:00.000\\",\\"test-190\\",\\"-\\" +\\"Sep 26, 2005 @ 00:00:00.000\\",\\"test-189\\",\\"-\\" +\\"Sep 25, 2005 @ 00:00:00.000\\",\\"test-188\\",\\"-\\" +\\"Sep 24, 2005 @ 00:00:00.000\\",\\"test-187\\",\\"-\\" +\\"Sep 23, 2005 @ 00:00:00.000\\",\\"test-186\\",\\"-\\" +\\"Sep 22, 2005 @ 00:00:00.000\\",\\"test-185\\",\\"-\\" +\\"Sep 21, 2005 @ 00:00:00.000\\",\\"test-184\\",\\"-\\" +\\"Sep 20, 2005 @ 00:00:00.000\\",\\"test-183\\",\\"-\\" +\\"Sep 19, 2005 @ 00:00:00.000\\",\\"test-182\\",\\"-\\" +\\"Sep 18, 2005 @ 00:00:00.000\\",\\"test-181\\",\\"-\\" +\\"Sep 17, 2005 @ 00:00:00.000\\",\\"test-180\\",\\"-\\" +\\"Sep 16, 2005 @ 00:00:00.000\\",\\"test-179\\",\\"-\\" +\\"Sep 15, 2005 @ 00:00:00.000\\",\\"test-178\\",\\"-\\" +\\"Sep 14, 2005 @ 00:00:00.000\\",\\"test-177\\",\\"-\\" +\\"Sep 13, 2005 @ 00:00:00.000\\",\\"test-176\\",\\"-\\" +\\"Sep 12, 2005 @ 00:00:00.000\\",\\"test-175\\",\\"-\\" +\\"Sep 11, 2005 @ 00:00:00.000\\",\\"test-174\\",\\"-\\" +\\"Sep 10, 2005 @ 00:00:00.000\\",\\"test-173\\",\\"-\\" +\\"Sep 9, 2005 @ 00:00:00.000\\",\\"test-172\\",\\"-\\" +\\"Sep 8, 2005 @ 00:00:00.000\\",\\"test-171\\",\\"-\\" +\\"Sep 7, 2005 @ 00:00:00.000\\",\\"test-170\\",\\"-\\" +\\"Sep 6, 2005 @ 00:00:00.000\\",\\"test-169\\",\\"-\\" +\\"Sep 5, 2005 @ 00:00:00.000\\",\\"test-168\\",\\"-\\" +\\"Sep 4, 2005 @ 00:00:00.000\\",\\"test-167\\",\\"-\\" +\\"Sep 3, 2005 @ 00:00:00.000\\",\\"test-166\\",\\"-\\" +\\"Sep 2, 2005 @ 00:00:00.000\\",\\"test-165\\",\\"-\\" +\\"Sep 1, 2005 @ 00:00:00.000\\",\\"test-164\\",\\"-\\" +\\"Aug 31, 2005 @ 00:00:00.000\\",\\"test-163\\",\\"-\\" +\\"Aug 30, 2005 @ 00:00:00.000\\",\\"test-162\\",\\"-\\" +\\"Aug 29, 2005 @ 00:00:00.000\\",\\"test-161\\",\\"-\\" +\\"Aug 28, 2005 @ 00:00:00.000\\",\\"test-160\\",\\"-\\" +\\"Aug 27, 2005 @ 00:00:00.000\\",\\"test-159\\",\\"-\\" +\\"Aug 26, 2005 @ 00:00:00.000\\",\\"test-158\\",\\"-\\" +\\"Aug 25, 2005 @ 00:00:00.000\\",\\"test-157\\",\\"-\\" +\\"Aug 24, 2005 @ 00:00:00.000\\",\\"test-156\\",\\"-\\" +\\"Aug 23, 2005 @ 00:00:00.000\\",\\"test-155\\",\\"-\\" +\\"Aug 22, 2005 @ 00:00:00.000\\",\\"test-154\\",\\"-\\" +\\"Aug 21, 2005 @ 00:00:00.000\\",\\"test-153\\",\\"-\\" +\\"Aug 20, 2005 @ 00:00:00.000\\",\\"test-152\\",\\"-\\" +\\"Aug 19, 2005 @ 00:00:00.000\\",\\"test-151\\",\\"-\\" +\\"Aug 18, 2005 @ 00:00:00.000\\",\\"test-150\\",\\"-\\" +\\"Aug 17, 2005 @ 00:00:00.000\\",\\"test-149\\",\\"-\\" +\\"Aug 16, 2005 @ 00:00:00.000\\",\\"test-148\\",\\"-\\" +\\"Aug 15, 2005 @ 00:00:00.000\\",\\"test-147\\",\\"-\\" +\\"Aug 14, 2005 @ 00:00:00.000\\",\\"test-146\\",\\"-\\" +\\"Aug 13, 2005 @ 00:00:00.000\\",\\"test-145\\",\\"-\\" +\\"Aug 12, 2005 @ 00:00:00.000\\",\\"test-144\\",\\"-\\" +\\"Aug 11, 2005 @ 00:00:00.000\\",\\"test-143\\",\\"-\\" +\\"Aug 10, 2005 @ 00:00:00.000\\",\\"test-142\\",\\"-\\" +\\"Aug 9, 2005 @ 00:00:00.000\\",\\"test-141\\",\\"-\\" +\\"Aug 8, 2005 @ 00:00:00.000\\",\\"test-140\\",\\"-\\" +\\"Aug 7, 2005 @ 00:00:00.000\\",\\"test-139\\",\\"-\\" +\\"Aug 6, 2005 @ 00:00:00.000\\",\\"test-138\\",\\"-\\" +\\"Aug 5, 2005 @ 00:00:00.000\\",\\"test-137\\",\\"-\\" +\\"Aug 4, 2005 @ 00:00:00.000\\",\\"test-136\\",\\"-\\" +\\"Aug 3, 2005 @ 00:00:00.000\\",\\"test-135\\",\\"-\\" +\\"Aug 2, 2005 @ 00:00:00.000\\",\\"test-134\\",\\"-\\" +\\"Aug 1, 2005 @ 00:00:00.000\\",\\"test-133\\",\\"-\\" +\\"Jul 31, 2005 @ 00:00:00.000\\",\\"test-132\\",\\"-\\" +\\"Jul 30, 2005 @ 00:00:00.000\\",\\"test-131\\",\\"-\\" +\\"Jul 29, 2005 @ 00:00:00.000\\",\\"test-130\\",\\"-\\" +\\"Jul 28, 2005 @ 00:00:00.000\\",\\"test-129\\",\\"-\\" +\\"Jul 27, 2005 @ 00:00:00.000\\",\\"test-128\\",\\"-\\" +\\"Jul 26, 2005 @ 00:00:00.000\\",\\"test-127\\",\\"-\\" +\\"Jul 25, 2005 @ 00:00:00.000\\",\\"test-126\\",\\"-\\" +\\"Jul 24, 2005 @ 00:00:00.000\\",\\"test-125\\",\\"-\\" +\\"Jul 23, 2005 @ 00:00:00.000\\",\\"test-124\\",\\"-\\" +\\"Jul 22, 2005 @ 00:00:00.000\\",\\"test-123\\",\\"-\\" +\\"Jul 21, 2005 @ 00:00:00.000\\",\\"test-122\\",\\"-\\" +\\"Jul 20, 2005 @ 00:00:00.000\\",\\"test-121\\",\\"-\\" +\\"Jul 19, 2005 @ 00:00:00.000\\",\\"test-120\\",\\"-\\" +\\"Jul 18, 2005 @ 00:00:00.000\\",\\"test-119\\",\\"-\\" +\\"Jul 17, 2005 @ 00:00:00.000\\",\\"test-118\\",\\"-\\" +\\"Jul 16, 2005 @ 00:00:00.000\\",\\"test-117\\",\\"-\\" +\\"Jul 15, 2005 @ 00:00:00.000\\",\\"test-116\\",\\"-\\" +\\"Jul 14, 2005 @ 00:00:00.000\\",\\"test-115\\",\\"-\\" +\\"Jul 13, 2005 @ 00:00:00.000\\",\\"test-114\\",\\"-\\" +\\"Jul 12, 2005 @ 00:00:00.000\\",\\"test-113\\",\\"-\\" +\\"Jul 11, 2005 @ 00:00:00.000\\",\\"test-112\\",\\"-\\" +\\"Jul 10, 2005 @ 00:00:00.000\\",\\"test-111\\",\\"-\\" +\\"Jul 9, 2005 @ 00:00:00.000\\",\\"test-110\\",\\"-\\" +\\"Jul 8, 2005 @ 00:00:00.000\\",\\"test-109\\",\\"-\\" +\\"Jul 7, 2005 @ 00:00:00.000\\",\\"test-108\\",\\"-\\" +\\"Jul 6, 2005 @ 00:00:00.000\\",\\"test-107\\",\\"-\\" +\\"Jul 5, 2005 @ 00:00:00.000\\",\\"test-106\\",\\"-\\" +\\"Jul 4, 2005 @ 00:00:00.000\\",\\"test-105\\",\\"-\\" +\\"Jul 3, 2005 @ 00:00:00.000\\",\\"test-104\\",\\"-\\" +\\"Jul 2, 2005 @ 00:00:00.000\\",\\"test-103\\",\\"-\\" +\\"Jul 1, 2005 @ 00:00:00.000\\",\\"test-102\\",\\"-\\" +\\"Jun 30, 2005 @ 00:00:00.000\\",\\"test-101\\",\\"-\\" +\\"Jun 29, 2005 @ 00:00:00.000\\",\\"test-100\\",\\"-\\" +\\"Jun 28, 2005 @ 00:00:00.000\\",\\"test-99\\",\\"-\\" +\\"Jun 27, 2005 @ 00:00:00.000\\",\\"test-98\\",\\"-\\" +\\"Jun 26, 2005 @ 00:00:00.000\\",\\"test-97\\",\\"-\\" +\\"Jun 25, 2005 @ 00:00:00.000\\",\\"test-96\\",\\"-\\" +\\"Jun 24, 2005 @ 00:00:00.000\\",\\"test-95\\",\\"-\\" +\\"Jun 23, 2005 @ 00:00:00.000\\",\\"test-94\\",\\"-\\" +\\"Jun 22, 2005 @ 00:00:00.000\\",\\"test-93\\",\\"-\\" +\\"Jun 21, 2005 @ 00:00:00.000\\",\\"test-92\\",\\"-\\" +\\"Jun 20, 2005 @ 00:00:00.000\\",\\"test-91\\",\\"-\\" +\\"Jun 19, 2005 @ 00:00:00.000\\",\\"test-90\\",\\"-\\" +\\"Jun 18, 2005 @ 00:00:00.000\\",\\"test-89\\",\\"-\\" +\\"Jun 17, 2005 @ 00:00:00.000\\",\\"test-88\\",\\"-\\" +\\"Jun 16, 2005 @ 00:00:00.000\\",\\"test-87\\",\\"-\\" +\\"Jun 15, 2005 @ 00:00:00.000\\",\\"test-86\\",\\"-\\" +\\"Jun 14, 2005 @ 00:00:00.000\\",\\"test-85\\",\\"-\\" +\\"Jun 13, 2005 @ 00:00:00.000\\",\\"test-84\\",\\"-\\" +\\"Jun 12, 2005 @ 00:00:00.000\\",\\"test-83\\",\\"-\\" +\\"Jun 11, 2005 @ 00:00:00.000\\",\\"test-82\\",\\"-\\" +\\"Jun 10, 2005 @ 00:00:00.000\\",\\"test-81\\",\\"-\\" +\\"Jun 9, 2005 @ 00:00:00.000\\",\\"test-80\\",\\"-\\" +\\"Jun 8, 2005 @ 00:00:00.000\\",\\"test-79\\",\\"-\\" +\\"Jun 7, 2005 @ 00:00:00.000\\",\\"test-78\\",\\"-\\" +\\"Jun 6, 2005 @ 00:00:00.000\\",\\"test-77\\",\\"-\\" +\\"Jun 5, 2005 @ 00:00:00.000\\",\\"test-76\\",\\"-\\" +\\"Jun 4, 2005 @ 00:00:00.000\\",\\"test-75\\",\\"-\\" +\\"Jun 3, 2005 @ 00:00:00.000\\",\\"test-74\\",\\"-\\" +\\"Jun 2, 2005 @ 00:00:00.000\\",\\"test-73\\",\\"-\\" +\\"Jun 1, 2005 @ 00:00:00.000\\",\\"test-72\\",\\"-\\" +\\"May 31, 2005 @ 00:00:00.000\\",\\"test-71\\",\\"-\\" +\\"May 30, 2005 @ 00:00:00.000\\",\\"test-70\\",\\"-\\" +\\"May 29, 2005 @ 00:00:00.000\\",\\"test-69\\",\\"-\\" +\\"May 28, 2005 @ 00:00:00.000\\",\\"test-68\\",\\"-\\" +\\"May 27, 2005 @ 00:00:00.000\\",\\"test-67\\",\\"-\\" +\\"May 26, 2005 @ 00:00:00.000\\",\\"test-66\\",\\"-\\" +\\"May 25, 2005 @ 00:00:00.000\\",\\"test-65\\",\\"-\\" +\\"May 24, 2005 @ 00:00:00.000\\",\\"test-64\\",\\"-\\" +\\"May 23, 2005 @ 00:00:00.000\\",\\"test-63\\",\\"-\\" +\\"May 22, 2005 @ 00:00:00.000\\",\\"test-62\\",\\"-\\" +\\"May 21, 2005 @ 00:00:00.000\\",\\"test-61\\",\\"-\\" +\\"May 20, 2005 @ 00:00:00.000\\",\\"test-60\\",\\"-\\" +\\"May 19, 2005 @ 00:00:00.000\\",\\"test-59\\",\\"-\\" +\\"May 18, 2005 @ 00:00:00.000\\",\\"test-58\\",\\"-\\" +\\"May 17, 2005 @ 00:00:00.000\\",\\"test-57\\",\\"-\\" +\\"May 16, 2005 @ 00:00:00.000\\",\\"test-56\\",\\"-\\" +\\"May 15, 2005 @ 00:00:00.000\\",\\"test-55\\",\\"-\\" +\\"May 14, 2005 @ 00:00:00.000\\",\\"test-54\\",\\"-\\" +\\"May 13, 2005 @ 00:00:00.000\\",\\"test-53\\",\\"-\\" +\\"May 12, 2005 @ 00:00:00.000\\",\\"test-52\\",\\"-\\" +\\"May 11, 2005 @ 00:00:00.000\\",\\"test-51\\",\\"-\\" +\\"May 10, 2005 @ 00:00:00.000\\",\\"test-50\\",\\"-\\" +\\"May 9, 2005 @ 00:00:00.000\\",\\"test-49\\",\\"-\\" +\\"May 8, 2005 @ 00:00:00.000\\",\\"test-48\\",\\"-\\" +\\"May 7, 2005 @ 00:00:00.000\\",\\"test-47\\",\\"-\\" +\\"May 6, 2005 @ 00:00:00.000\\",\\"test-46\\",\\"-\\" +\\"May 5, 2005 @ 00:00:00.000\\",\\"test-45\\",\\"-\\" +\\"May 4, 2005 @ 00:00:00.000\\",\\"test-44\\",\\"-\\" +\\"May 3, 2005 @ 00:00:00.000\\",\\"test-43\\",\\"-\\" +\\"May 2, 2005 @ 00:00:00.000\\",\\"test-42\\",\\"-\\" +\\"May 1, 2005 @ 00:00:00.000\\",\\"test-41\\",\\"-\\" +\\"Apr 30, 2005 @ 00:00:00.000\\",\\"test-40\\",\\"-\\" +\\"Apr 29, 2005 @ 00:00:00.000\\",\\"test-39\\",\\"-\\" +\\"Apr 28, 2005 @ 00:00:00.000\\",\\"test-38\\",\\"-\\" +\\"Apr 27, 2005 @ 00:00:00.000\\",\\"test-37\\",\\"-\\" +\\"Apr 26, 2005 @ 00:00:00.000\\",\\"test-36\\",\\"-\\" +\\"Apr 25, 2005 @ 00:00:00.000\\",\\"test-35\\",\\"-\\" +\\"Apr 24, 2005 @ 00:00:00.000\\",\\"test-34\\",\\"-\\" +\\"Apr 23, 2005 @ 00:00:00.000\\",\\"test-33\\",\\"-\\" +\\"Apr 22, 2005 @ 00:00:00.000\\",\\"test-32\\",\\"-\\" +\\"Apr 21, 2005 @ 00:00:00.000\\",\\"test-31\\",\\"-\\" +\\"Apr 20, 2005 @ 00:00:00.000\\",\\"test-30\\",\\"-\\" +\\"Apr 19, 2005 @ 00:00:00.000\\",\\"test-29\\",\\"-\\" +\\"Apr 18, 2005 @ 00:00:00.000\\",\\"test-28\\",\\"-\\" +\\"Apr 17, 2005 @ 00:00:00.000\\",\\"test-27\\",\\"-\\" +\\"Apr 16, 2005 @ 00:00:00.000\\",\\"test-26\\",\\"-\\" +\\"Apr 15, 2005 @ 00:00:00.000\\",\\"test-25\\",\\"-\\" +\\"Apr 14, 2005 @ 00:00:00.000\\",\\"test-24\\",\\"-\\" +\\"Apr 13, 2005 @ 00:00:00.000\\",\\"test-23\\",\\"-\\" +\\"Apr 12, 2005 @ 00:00:00.000\\",\\"test-22\\",\\"-\\" +\\"Apr 11, 2005 @ 00:00:00.000\\",\\"test-21\\",\\"-\\" +\\"Apr 10, 2005 @ 00:00:00.000\\",\\"test-20\\",\\"-\\" +\\"Apr 9, 2005 @ 00:00:00.000\\",\\"test-19\\",\\"-\\" +\\"Apr 8, 2005 @ 00:00:00.000\\",\\"test-18\\",\\"-\\" +\\"Apr 7, 2005 @ 00:00:00.000\\",\\"test-17\\",\\"-\\" +\\"Apr 6, 2005 @ 00:00:00.000\\",\\"test-16\\",\\"-\\" +\\"Apr 5, 2005 @ 00:00:00.000\\",\\"test-15\\",\\"-\\" +\\"Apr 4, 2005 @ 00:00:00.000\\",\\"test-14\\",\\"-\\" +\\"Apr 3, 2005 @ 00:00:00.000\\",\\"test-13\\",\\"-\\" +\\"Apr 2, 2005 @ 00:00:00.000\\",\\"test-12\\",\\"-\\" +\\"Apr 1, 2005 @ 00:00:00.000\\",\\"test-11\\",\\"-\\" +\\"Mar 31, 2005 @ 00:00:00.000\\",\\"test-10\\",\\"-\\" +\\"Mar 30, 2005 @ 00:00:00.000\\",\\"test-9\\",\\"-\\" +\\"Mar 29, 2005 @ 00:00:00.000\\",\\"test-8\\",\\"-\\" +\\"Mar 28, 2005 @ 00:00:00.000\\",\\"test-7\\",\\"-\\" +\\"Mar 27, 2005 @ 00:00:00.000\\",\\"test-6\\",\\"-\\" +\\"Mar 26, 2005 @ 00:00:00.000\\",\\"test-5\\",\\"-\\" +\\"Mar 25, 2005 @ 00:00:00.000\\",\\"test-4\\",\\"-\\" +\\"Mar 24, 2005 @ 00:00:00.000\\",\\"test-3\\",\\"-\\" +\\"Mar 23, 2005 @ 00:00:00.000\\",\\"test-2\\",\\"-\\" +\\"Mar 22, 2005 @ 00:00:00.000\\",\\"test-1\\",\\"Aug 14, 2006 @ 00:00:00.000\\" +" +`; diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/index.ts new file mode 100644 index 0000000000000..96fad2c47d099 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/index.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ loadTestFile, getPageObject }: FtrProviderContext) { + const svlCommonPage = getPageObject('svlCommonPage'); + + describe('discover', function () { + before(async function () { + // TODO: Serverless tests require login first + await svlCommonPage.login(); + }); + + loadTestFile(require.resolve('./reporting')); + loadTestFile(require.resolve('./visualize_field')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts new file mode 100644 index 0000000000000..e2a491de828d9 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts @@ -0,0 +1,372 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { Key } from 'selenium-webdriver'; +import moment from 'moment'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const reportingAPI = getService('reporting'); + const log = getService('log'); + const es = getService('es'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const browser = getService('browser'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['reporting', 'common', 'discover', 'timePicker', 'share']); + const filterBar = getService('filterBar'); + const find = getService('find'); + const testSubjects = getService('testSubjects'); + + const setFieldsFromSource = async (setValue: boolean) => { + await kibanaServer.uiSettings.update({ 'discover:searchFieldsFromSource': setValue }); + await browser.refresh(); + }; + + const getReport = async () => { + // close any open notification toasts + await PageObjects.reporting.clearToastNotifications(); + + await PageObjects.reporting.openCsvReportingPanel(); + await PageObjects.reporting.clickGenerateReportButton(); + + const url = await PageObjects.reporting.getReportURL(60000); + // TODO: Fetch CSV client side in Serverless since `PageObjects.reporting.getResponse()` + // doesn't work because it relies on `SecurityService.testUserSupertest` + const res: { status: number; contentType: string | null; text: string } = + await browser.executeAsync(async (downloadUrl, resolve) => { + const response = await fetch(downloadUrl); + resolve({ + status: response.status, + contentType: response.headers.get('content-type'), + text: await response.text(), + }); + }, url); + + expect(res.status).to.equal(200); + expect(res.contentType).to.equal('text/csv; charset=utf-8'); + return res; + }; + + describe('Discover CSV Export', () => { + describe('Check Available', () => { + before(async () => { + // TODO: emptyKibanaIndex fails in Serverless with + // "index_not_found_exception: no such index [.kibana_ingest]", + // so it was switched to `savedObjects.cleanStandardList()` + await kibanaServer.savedObjects.cleanStandardList(); + await reportingAPI.initEcommerce(); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.selectIndexPattern('ecommerce'); + }); + + after(async () => { + await reportingAPI.teardownEcommerce(); + // TODO: emptyKibanaIndex fails in Serverless with + // "index_not_found_exception: no such index [.kibana_ingest]", + // so it was switched to `savedObjects.cleanStandardList()` + await kibanaServer.savedObjects.cleanStandardList(); + }); + + it('is available if new', async () => { + await PageObjects.reporting.openCsvReportingPanel(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); + }); + + it('becomes available when saved', async () => { + await PageObjects.discover.saveSearch('my search - expectEnabledGenerateReportButton'); + await PageObjects.reporting.openCsvReportingPanel(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); + }); + }); + + describe('Generate CSV: new search', () => { + before(async () => { + await reportingAPI.initEcommerce(); + }); + + after(async () => { + await reportingAPI.teardownEcommerce(); + // TODO: emptyKibanaIndex fails in Serverless with + // "index_not_found_exception: no such index [.kibana_ingest]", + // so it was switched to `savedObjects.cleanStandardList()` + await kibanaServer.savedObjects.cleanStandardList(); + }); + + beforeEach(async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.selectIndexPattern('ecommerce'); + }); + + it('generates a report with single timefilter', async () => { + await PageObjects.discover.clickNewSearchButton(); + await PageObjects.timePicker.setCommonlyUsedTime('Last_24 hours'); + await PageObjects.discover.saveSearch('single-timefilter-search'); + + // get shared URL value + const sharedURL = await browser.getCurrentUrl(); + + // click 'Copy POST URL' + await PageObjects.share.clickShareTopNavButton(); + await PageObjects.reporting.openCsvReportingPanel(); + const advOpt = await find.byXPath(`//button[descendant::*[text()='Advanced options']]`); + await advOpt.click(); + const postUrl = await find.byXPath(`//button[descendant::*[text()='Copy POST URL']]`); + await postUrl.click(); + + // get clipboard value using field search input, since + // 'browser.getClipboardValue()' doesn't work, due to permissions + const textInput = await testSubjects.find('fieldListFiltersFieldSearch'); + await textInput.click(); + await browser + .getActions() + // TODO: Add Mac support since this wouldn't run locally before + .keyDown(Key[process.platform === 'darwin' ? 'COMMAND' : 'CONTROL']) + .perform(); + await browser.getActions().keyDown('v').perform(); + + const reportURL = decodeURIComponent(await textInput.getAttribute('value')); + + // get number of filters in URLs + const timeFiltersNumberInReportURL = + reportURL.split('query:(range:(order_date:(format:strict_date_optional_time').length - 1; + const timeFiltersNumberInSharedURL = sharedURL.split('time:').length - 1; + + expect(timeFiltersNumberInSharedURL).to.be(1); + expect(sharedURL.includes('time:(from:now-24h%2Fh,to:now))')).to.be(true); + + expect(timeFiltersNumberInReportURL).to.be(1); + expect( + reportURL.includes( + 'query:(range:(order_date:(format:strict_date_optional_time,gte:now-24h/h,lte:now))))' + ) + ).to.be(true); + + // return keyboard state + await browser + .getActions() + // TODO: Add Mac support since this wouldn't run locally before + .keyUp(Key[process.platform === 'darwin' ? 'COMMAND' : 'CONTROL']) + .perform(); + await browser.getActions().keyUp('v').perform(); + + // return field search input state + await textInput.clearValue(); + }); + + it('generates a report from a new search with data: default', async () => { + await PageObjects.discover.clickNewSearchButton(); + await PageObjects.reporting.setTimepickerInEcommerceDataRange(); + + await PageObjects.discover.saveSearch('my search - with data - expectReportCanBeCreated'); + + const res = await getReport(); + expect(res.status).to.equal(200); + expect(res.contentType).to.equal('text/csv; charset=utf-8'); + + const csvFile = res.text; + expectSnapshot(csvFile).toMatch(); + }); + + it('generates a report with no data', async () => { + await PageObjects.reporting.setTimepickerInEcommerceNoDataRange(); + await PageObjects.discover.saveSearch('my search - no data - expectReportCanBeCreated'); + + const res = await getReport(); + expect(res.text).to.be(`\n`); + }); + + it('generates a large export', async () => { + const fromTime = 'Apr 27, 2019 @ 23:56:51.374'; + const toTime = 'Aug 23, 2019 @ 16:18:51.821'; + await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); + await PageObjects.discover.clickNewSearchButton(); + await retry.try(async () => { + expect(await PageObjects.discover.getHitCount()).to.equal('4,675'); + }); + await PageObjects.discover.saveSearch('large export'); + + // match file length, the beginning and the end of the csv file contents + const { text: csvFile } = await getReport(); + expect(csvFile.length).to.be(4826973); + expectSnapshot(csvFile.slice(0, 5000)).toMatch(); + expectSnapshot(csvFile.slice(-5000)).toMatch(); + }); + }); + + describe('Generate CSV: sparse data', () => { + const TEST_INDEX_NAME = 'sparse_data'; + const TEST_DOC_COUNT = 510; + + const reset = async () => { + try { + await es.indices.delete({ index: TEST_INDEX_NAME }); + } catch (err) { + // ignore 404 error + } + }; + + const createDocs = async () => { + interface TestDoc { + timestamp: string; + name: string; + updated_at?: string; + } + + const docs = Array(TEST_DOC_COUNT); + + for (let i = 0; i <= docs.length - 1; i++) { + const name = `test-${i + 1}`; + const timestamp = moment + .utc('2006-08-14T00:00:00') + .subtract(TEST_DOC_COUNT - i, 'days') + .format(); + + if (i === 0) { + // only the oldest document has a value for updated_at + docs[i] = { + timestamp, + name, + updated_at: moment.utc('2006-08-14T00:00:00').format(), + }; + } else { + // updated_at field does not exist in first 500 documents + docs[i] = { timestamp, name }; + } + } + + const res = await es.bulk({ + index: TEST_INDEX_NAME, + body: docs.map((d) => `{"index": {}}\n${JSON.stringify(d)}\n`), + }); + + log.info(`Indexed ${res.items.length} test data docs.`); + }; + + before(async () => { + await reset(); + await createDocs(); + // TODO: Manually loading logs archive and logs SOs in Serverless + // instead of using `reportingAPI.initLogs()` since the original + // logs SOs include a canvas SO which is not supported in Serverless + await esArchiver.load('x-pack/test/functional/es_archives/logstash_functional'); + await kibanaServer.importExport.load( + 'x-pack/test_serverless/functional/fixtures/kbn_archiver/reporting/logs' + ); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.loadSavedSearch('Sparse Columns'); + }); + + after(async () => { + // TODO: Manually unloading logs archive and logs SOs in Serverless + // instead of using `reportingAPI.teardownLogs()` since the original + // logs SOs include a canvas SO which is not supported in Serverless + await kibanaServer.importExport.unload( + 'x-pack/test_serverless/functional/fixtures/kbn_archiver/reporting/logs' + ); + await esArchiver.unload('x-pack/test/functional/es_archives/logstash_functional'); + await reset(); + }); + + beforeEach(async () => { + const fromTime = 'Jan 10, 2005 @ 00:00:00.000'; + const toTime = 'Dec 23, 2006 @ 00:00:00.000'; + await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); + await retry.try(async () => { + expect(await PageObjects.discover.getHitCount()).to.equal(TEST_DOC_COUNT.toString()); + }); + }); + + it(`handles field formatting for a field that doesn't exist initially`, async () => { + const res = await getReport(); + expect(res.status).to.equal(200); + expect(res.contentType).to.equal('text/csv; charset=utf-8'); + + const csvFile = res.text; + expectSnapshot(csvFile).toMatch(); + }); + }); + + describe('Generate CSV: archived search', () => { + const setupPage = async () => { + const fromTime = 'Jun 22, 2019 @ 00:00:00.000'; + const toTime = 'Jun 26, 2019 @ 23:30:00.000'; + await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); + }; + + before(async () => { + await reportingAPI.initEcommerce(); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.selectIndexPattern('ecommerce'); + }); + + after(async () => { + await reportingAPI.teardownEcommerce(); + }); + + beforeEach(async () => { + await setupPage(); + }); + + // TODO: Allow skipping the toast check if we know + // there will be none since it will wait for 90s + let checkForReportingToasts = true; + + afterEach(async () => { + if (checkForReportingToasts) { + await PageObjects.reporting.checkForReportingToasts(); + } + checkForReportingToasts = true; + }); + + it('generates a report with data', async () => { + await PageObjects.discover.loadSavedSearch('Ecommerce Data'); + await retry.try(async () => { + expect(await PageObjects.discover.getHitCount()).to.equal('740'); + }); + + const { text: csvFile } = await getReport(); + expectSnapshot(csvFile).toMatch(); + }); + + it('generates a report with filtered data', async () => { + await PageObjects.discover.loadSavedSearch('Ecommerce Data'); + await retry.try(async () => { + expect(await PageObjects.discover.getHitCount()).to.equal('740'); + }); + + // filter + await filterBar.addFilter({ field: 'category', operation: 'is', value: `Men's Shoes` }); + await retry.try(async () => { + expect(await PageObjects.discover.getHitCount()).to.equal('154'); + }); + + const { text: csvFile } = await getReport(); + expectSnapshot(csvFile).toMatch(); + }); + + it('generates a report with discover:searchFieldsFromSource = true', async () => { + await PageObjects.discover.loadSavedSearch('Ecommerce Data'); + + await retry.try(async () => { + expect(await PageObjects.discover.getHitCount()).to.equal('740'); + }); + + await setFieldsFromSource(true); + + const { text: csvFile } = await getReport(); + expectSnapshot(csvFile).toMatch(); + + await setFieldsFromSource(false); + // TODO: We refreshed the page in `setFieldsFromSource`, + // so no toast will be shown + checkForReportingToasts = false; + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/visualize_field.ts b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/visualize_field.ts new file mode 100644 index 0000000000000..ab1ad279b886b --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/visualize_field.ts @@ -0,0 +1,130 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 type { WebElementWrapper } from '../../../../../../../test/functional/services/lib/web_element_wrapper'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const filterBar = getService('filterBar'); + const queryBar = getService('queryBar'); + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects([ + 'common', + 'error', + 'discover', + 'timePicker', + 'unifiedSearch', + 'lens', + 'security', + 'spaceSelector', + 'header', + 'unifiedFieldList', + ]); + + // TODO: ES|QL setting removed since ES|QL isn't supported in Serverless + + async function setDiscoverTimeRange() { + await PageObjects.timePicker.setDefaultAbsoluteRange(); + } + + describe('discover field visualize button', () => { + beforeEach(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json' + ); + await PageObjects.common.navigateToApp('discover'); + await setDiscoverTimeRange(); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/logstash_functional'); + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json' + ); + }); + + it('shows "visualize" field button', async () => { + await PageObjects.unifiedFieldList.clickFieldListItem('bytes'); + await PageObjects.unifiedFieldList.expectFieldListItemVisualize('bytes'); + }); + + it('visualizes field to Lens and loads fields to the dimesion editor', async () => { + await PageObjects.unifiedFieldList.findFieldByName('bytes'); + await PageObjects.unifiedFieldList.clickFieldListItemVisualize('bytes'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await retry.try(async () => { + const dimensions = await testSubjects.findAll('lns-dimensionTrigger'); + expect(dimensions).to.have.length(2); + expect(await dimensions[1].getVisibleText()).to.be('Median of bytes'); + }); + }); + + it('should preserve app filters in lens', async () => { + await filterBar.addFilter({ + field: 'bytes', + operation: 'is between', + value: { from: '3500', to: '4000' }, + }); + await PageObjects.unifiedFieldList.findFieldByName('geo.src'); + await PageObjects.unifiedFieldList.clickFieldListItemVisualize('geo.src'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await filterBar.hasFilter('bytes', '3,500 to 4,000')).to.be(true); + }); + + it('should preserve query in lens', async () => { + await queryBar.setQuery('machine.os : ios'); + await queryBar.submitQuery(); + await PageObjects.unifiedFieldList.findFieldByName('geo.dest'); + await PageObjects.unifiedFieldList.clickFieldListItemVisualize('geo.dest'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await queryBar.getQueryString()).to.equal('machine.os : ios'); + }); + + it('should visualize correctly using breakdown field', async () => { + await PageObjects.discover.chooseBreakdownField('extension.raw'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('unifiedHistogramEditVisualization'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await retry.try(async () => { + const breakdownLabel = await testSubjects.find( + 'lnsDragDrop_draggable-Top 3 values of extension.raw' + ); + + const lnsWorkspace = await testSubjects.find('lnsWorkspace'); + const list = await lnsWorkspace.findAllByClassName('echLegendItem__label'); + const values = await Promise.all( + list.map((elem: WebElementWrapper) => elem.getVisibleText()) + ); + + expect(await breakdownLabel.getVisibleText()).to.eql('Top 3 values of extension.raw'); + expect(values).to.eql(['jpg', 'css', 'png', 'Other']); + }); + }); + + it('should visualize correctly using adhoc data view', async () => { + await PageObjects.discover.createAdHocDataView('logst', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.click('unifiedHistogramEditVisualization'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.try(async () => { + const selectedPattern = await PageObjects.lens.getDataPanelIndexPattern(); + expect(selectedPattern).to.eql('logst*'); + }); + }); + + // TODO: ES|QL tests removed since ES|QL isn't supported in Serverless + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/index.ts new file mode 100644 index 0000000000000..253effe65b460 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default ({ loadTestFile, getPageObject }: FtrProviderContext) => { + const svlCommonPage = getPageObject('svlCommonPage'); + + describe('Discover alerting', function () { + before(async function () { + // TODO: Serverless tests require login first + await svlCommonPage.login(); + }); + + loadTestFile(require.resolve('./search_source_alert')); + }); +}; diff --git a/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/search_source_alert.ts b/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/search_source_alert.ts new file mode 100644 index 0000000000000..f683e02237996 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover_ml_uptime/discover/search_source_alert.ts @@ -0,0 +1,646 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license 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 { INGEST_SAVED_OBJECT_INDEX } from '@kbn/fleet-plugin/common/constants'; +import { asyncForEach } from '@kbn/std'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const log = getService('log'); + const es = getService('es'); + const monacoEditor = getService('monacoEditor'); + const PageObjects = getPageObjects([ + 'settings', + 'common', + 'header', + 'discover', + 'timePicker', + 'dashboard', + ]); + const deployment = getService('deployment'); + const dataGrid = getService('dataGrid'); + const browser = getService('browser'); + const retry = getService('retry'); + const testSubjects = getService('testSubjects'); + const supertest = getService('supertest'); + const queryBar = getService('queryBar'); + const security = getService('security'); + const filterBar = getService('filterBar'); + const find = getService('find'); + const toasts = getService('toasts'); + const kibanaServer = getService('kibanaServer'); + const comboBox = getService('comboBox'); + + const SOURCE_DATA_VIEW = 'search-source-alert'; + const OUTPUT_DATA_VIEW = 'search-source-alert-output'; + const ACTION_TYPE_ID = '.index'; + const RULE_NAME = 'test-search-source-alert'; + const ADHOC_RULE_NAME = 'test-adhoc-alert'; + let sourceDataViewId: string; + let outputDataViewId: string; + let connectorId: string; + + const createSourceIndex = () => + es.index({ + index: SOURCE_DATA_VIEW, + body: { + settings: { number_of_shards: 1 }, + mappings: { + properties: { + '@timestamp': { type: 'date' }, + message: { type: 'keyword' }, + }, + }, + }, + }); + + const generateNewDocs = async (docsNumber: number) => { + const mockMessages = Array.from({ length: docsNumber }, (_, i) => `msg-${i}`); + const dateNow = new Date(); + const dateToSet = new Date(dateNow); + dateToSet.setMinutes(dateNow.getMinutes() - 10); + for await (const message of mockMessages) { + es.transport.request({ + path: `/${SOURCE_DATA_VIEW}/_doc`, + method: 'POST', + body: { + '@timestamp': dateToSet.toISOString(), + message, + }, + }); + } + }; + + const createOutputDataIndex = () => + es.index({ + index: OUTPUT_DATA_VIEW, + body: { + settings: { + number_of_shards: 1, + }, + mappings: { + properties: { + rule_id: { type: 'text' }, + rule_name: { type: 'text' }, + alert_id: { type: 'text' }, + context_link: { type: 'text' }, + }, + }, + }, + }); + + const deleteAlerts = (alertIds: string[]) => + asyncForEach(alertIds, async (alertId: string) => { + await supertest + .delete(`/api/alerting/rule/${alertId}`) + // TODO: API requests in Serverless require internal request headers + .set({ + 'kbn-xsrf': 'some-xsrf-token', + 'x-elastic-internal-origin': 'kibana', + }) + .set('x-elastic-internal-origin', 'kibana') + .expect(204, ''); + }); + + const getAlertsByName = async (name: string) => { + const { + body: { data: alerts }, + } = await supertest + .get(`/api/alerting/rules/_find?search=${name}&search_fields=name`) + // TODO: API requests in Serverless require internal request headers + .set({ + 'kbn-xsrf': 'some-xsrf-token', + 'x-elastic-internal-origin': 'kibana', + }) + .expect(200); + + return alerts; + }; + + const createDataView = async (dataView: string) => { + log.debug(`create data view ${dataView}`); + return await supertest + .post(`/api/data_views/data_view`) + // TODO: API requests in Serverless require internal request headers + .set({ + 'kbn-xsrf': 'some-xsrf-token', + 'x-elastic-internal-origin': 'kibana', + }) + .send({ data_view: { title: dataView, timeFieldName: '@timestamp' } }) + .expect(200); + }; + + const deleteDataView = async (dataViewId: string) => { + return await supertest + .delete(`/api/data_views/data_view/${dataViewId}`) + // TODO: API requests in Serverless require internal request headers + .set({ + 'kbn-xsrf': 'some-xsrf-token', + 'x-elastic-internal-origin': 'kibana', + }) + .expect(200); + }; + + const deleteIndexes = (indexes: string[]) => { + indexes.forEach((current) => { + es.transport.request({ + path: `/${current}`, + method: 'DELETE', + }); + }); + }; + + const createConnector = async (): Promise => { + const { body: createdAction } = await supertest + .post(`/api/actions/connector`) + // TODO: API requests in Serverless require internal request headers + .set({ + 'kbn-xsrf': 'some-xsrf-token', + 'x-elastic-internal-origin': 'kibana', + }) + .send({ + name: 'search-source-alert-test-connector', + connector_type_id: ACTION_TYPE_ID, + config: { index: OUTPUT_DATA_VIEW }, + secrets: {}, + }) + .expect(200); + + return createdAction.id; + }; + + const deleteConnector = (id: string) => + supertest + .delete(`/api/actions/connector/${id}`) + // TODO: API requests in Serverless require internal request headers + .set({ + 'kbn-xsrf': 'some-xsrf-token', + 'x-elastic-internal-origin': 'kibana', + }) + .expect(204, ''); + + const defineSearchSourceAlert = async (alertName: string) => { + await retry.waitFor('rule name value is correct', async () => { + await testSubjects.setValue('ruleNameInput', alertName); + const ruleName = await testSubjects.getAttribute('ruleNameInput', 'value'); + return ruleName === alertName; + }); + await testSubjects.click('thresholdPopover'); + await testSubjects.setValue('alertThresholdInput', '1'); + + await testSubjects.click('forLastExpression'); + await testSubjects.setValue('timeWindowSizeNumber', '30'); + + await retry.waitFor('actions accordion to exist', async () => { + await testSubjects.click('.index-alerting-ActionTypeSelectOption'); + return await testSubjects.exists('alertActionAccordion-0'); + }); + + await monacoEditor.setCodeEditorValue(`{ + "rule_id": "{{rule.id}}", + "rule_name": "{{rule.name}}", + "alert_id": "{{alert.id}}", + "context_link": "{{context.link}}" + }`); + }; + + const openDiscoverAlertFlyout = async () => { + await testSubjects.click('discoverAlertsButton'); + await testSubjects.click('discoverCreateAlertButton'); + }; + + const openManagementAlertFlyout = async () => { + await PageObjects.common.navigateToApp('management'); + await PageObjects.header.waitUntilLoadingHasFinished(); + // TODO: Navigation to Rule Management is different in Serverless + await PageObjects.common.navigateToApp('triggersActions'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('createFirstRuleButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('.es-query-SelectOption'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('queryFormType_searchSource'); + await PageObjects.header.waitUntilLoadingHasFinished(); + }; + + const getResultsLink = async () => { + // getting the link + await dataGrid.clickRowToggle(); + const contextMessageElement = await testSubjects.find('tableDocViewRow-context_link-value'); + const contextMessage = await contextMessageElement.getVisibleText(); + + return contextMessage; + }; + + const openAlertResults = async (value: string, type: 'id' | 'name' = 'name') => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.clickNewSearchButton(); // reset params + + await PageObjects.discover.selectIndexPattern(OUTPUT_DATA_VIEW); + + let ruleId: string; + if (type === 'name') { + const [{ id }] = await getAlertsByName(value); + ruleId = id; + } else { + ruleId = value; + } + + await filterBar.addFilter({ field: 'rule_id', operation: 'is', value: ruleId }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + const link = await getResultsLink(); + await filterBar.removeFilter('rule_id'); // clear filter bar + + // follow url provided by alert to see documents triggered the alert + const baseUrl = deployment.getHostPort(); + // TODO: In Serverless `link` is a full URL instead of just a path as in stateful + const fullLink = link.startsWith(baseUrl) ? link : baseUrl + link; + await browser.navigateTo(fullLink); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }; + + const openAlertRuleInManagement = async (ruleName: string) => { + await PageObjects.common.navigateToApp('management'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // TODO: Navigation to Rule Management is different in Serverless + await PageObjects.common.navigateToApp('triggersActions'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const rulesList = await testSubjects.find('rulesList'); + const alertRule = await rulesList.findByCssSelector(`[title="${ruleName}"]`); + await alertRule.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + }; + + const clickViewInApp = async (ruleName: string) => { + // navigate to discover using view in app link + await openAlertRuleInManagement(ruleName); + await testSubjects.click('ruleDetails-viewInApp'); + await PageObjects.header.waitUntilLoadingHasFinished(); + }; + + const checkInitialRuleParamsState = async (dataView: string, isViewInApp = false) => { + if (isViewInApp) { + expect(await toasts.getToastCount()).to.be(0); + } else { + expect(await toasts.getToastCount()).to.be(1); + expect((await toasts.getToastContent(1)).startsWith('Displayed documents may vary')).to.be( + true + ); + } + expect(await filterBar.getFilterCount()).to.be(0); + expect(await queryBar.getQueryString()).to.equal(''); + const selectedDataView = await PageObjects.discover.getCurrentlySelectedDataView(); + const { valid } = await PageObjects.discover.validateDataViewReffsEquality(); + expect(valid).to.equal(true); + expect(selectedDataView).to.be.equal(dataView); + expect(await dataGrid.getDocCount()).to.be(5); + }; + + const checkUpdatedRuleParamsState = async () => { + expect(await toasts.getToastCount()).to.be(0); + const queryString = await queryBar.getQueryString(); + const hasFilter = await filterBar.hasFilter('message.keyword', 'msg-1'); + expect(queryString).to.be.equal('message:msg-1'); + expect(hasFilter).to.be.equal(true); + expect(await dataGrid.getDocCount()).to.be(1); + }; + + const checkInitialDataViewState = async (dataView: string) => { + // validate prev field filter + await testSubjects.existOrFail(`field-message-showDetails`); // still exists + + // validate prev title + await PageObjects.discover.clickIndexPatternActions(); + await testSubjects.click('indexPattern-manage-field'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const titleElem = await testSubjects.find('createIndexPatternTitleInput'); + expect(await titleElem.getAttribute('value')).to.equal(dataView); + }; + + const checkUpdatedDataViewState = async (dataView: string) => { + // validate updated field filter + await testSubjects.missingOrFail(`field-message-showDetails`); + + // validate updated title + await PageObjects.discover.clickIndexPatternActions(); + await testSubjects.click('indexPattern-manage-field'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const titleElem = await testSubjects.find('createIndexPatternTitleInput'); + expect(await titleElem.getAttribute('value')).to.equal(dataView); + }; + + describe('Search source Alert', () => { + before(async () => { + await security.testUser.setRoles(['discover_alert']); + + log.debug('create source indices'); + await createSourceIndex(); + + log.debug('generate documents'); + await generateNewDocs(5); + + log.debug('create output index'); + await createOutputDataIndex(); + + log.debug('create connector'); + connectorId = await createConnector(); + + // TODO: fetching connectors fails server side in Serverless with + // "index_not_found_exception: no such index [.kibana_ingest]" + if (!(await es.indices.exists({ index: INGEST_SAVED_OBJECT_INDEX }))) { + await es.indices.create({ index: INGEST_SAVED_OBJECT_INDEX }); + } + }); + + after(async () => { + deleteIndexes([OUTPUT_DATA_VIEW, SOURCE_DATA_VIEW]); + const [{ id: adhocRuleId }] = await getAlertsByName(ADHOC_RULE_NAME); + await deleteAlerts([adhocRuleId]); + await deleteDataView(outputDataViewId); + await deleteConnector(connectorId); + await security.testUser.restoreDefaults(); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + it('should create an alert when there is no data view', async () => { + await openManagementAlertFlyout(); + + // should not have data view selected by default + const dataViewSelector = await testSubjects.find('selectDataViewExpression'); + // TODO: Serverless Security has an existing data view by default + const dataViewSelectorText = await dataViewSelector.getVisibleText(); + if (!dataViewSelectorText.includes('.alerts-security')) { + expect(await dataViewSelector.getVisibleText()).to.eql('DATA VIEW\nSelect a data view'); + } + + log.debug('create data views'); + const sourceDataViewResponse = await createDataView(SOURCE_DATA_VIEW); + const outputDataViewResponse = await createDataView(OUTPUT_DATA_VIEW); + + sourceDataViewId = sourceDataViewResponse.body.data_view.id; + outputDataViewId = outputDataViewResponse.body.data_view.id; + }); + + it('should show time field validation error', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.selectIndexPattern(SOURCE_DATA_VIEW); + await PageObjects.timePicker.setCommonlyUsedTime('Last_15 minutes'); + + await openDiscoverAlertFlyout(); + await defineSearchSourceAlert(RULE_NAME); + await testSubjects.click('selectDataViewExpression'); + + await testSubjects.click('indexPattern-switcher--input'); + const input = await find.activeElement(); + // search-source-alert-output index does not have time field + await input.type('search-source-alert-o*'); + await testSubjects.click('explore-matching-indices-button'); + + await retry.waitFor('selection to happen', async () => { + const dataViewSelector = await testSubjects.find('selectDataViewExpression'); + return (await dataViewSelector.getVisibleText()) === 'DATA VIEW\nsearch-source-alert-o*'; + }); + + await testSubjects.click('saveRuleButton'); + + const errorElem = await testSubjects.find('esQueryAlertExpressionError'); + const errorText = await errorElem.getVisibleText(); + expect(errorText).to.eql('Data view should have a time field.'); + }); + + it('should navigate to alert results via view in app link', async () => { + await testSubjects.click('selectDataViewExpression'); + await testSubjects.click('indexPattern-switcher--input'); + if (await testSubjects.exists('clearSearchButton')) { + await testSubjects.click('clearSearchButton'); + } + const dataViewsElem = await testSubjects.find('euiSelectableList'); + const sourceDataViewOption = await dataViewsElem.findByCssSelector( + `[title="${SOURCE_DATA_VIEW}"]` + ); + await sourceDataViewOption.click(); + + await testSubjects.click('saveRuleButton'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + + await openAlertRuleInManagement(RULE_NAME); + await testSubjects.click('ruleDetails-viewInApp'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await checkInitialRuleParamsState(SOURCE_DATA_VIEW, true); + }); + + it('should navigate to alert results via link provided in notification', async () => { + await openAlertResults(RULE_NAME); + await checkInitialRuleParamsState(SOURCE_DATA_VIEW); + }); + + it('should display prev rule state after params update on clicking prev generated link', async () => { + await openAlertRuleInManagement(RULE_NAME); + + // change rule configuration + await testSubjects.click('openEditRuleFlyoutButton'); + await queryBar.setQuery('message:msg-1'); + await filterBar.addFilter({ field: 'message.keyword', operation: 'is', value: 'msg-1' }); + + await testSubjects.click('thresholdPopover'); + await testSubjects.setValue('alertThresholdInput', '1'); + await testSubjects.click('saveEditedRuleButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await openAlertResults(RULE_NAME); + await checkInitialRuleParamsState(SOURCE_DATA_VIEW); + }); + + it('should display actual state after rule params update on clicking viewInApp link', async () => { + await clickViewInApp(RULE_NAME); + + const selectedDataView = await PageObjects.discover.getCurrentlySelectedDataView(); + expect(selectedDataView).to.be.equal(SOURCE_DATA_VIEW); + + await checkUpdatedRuleParamsState(); + }); + + it('should display prev data view state after update on clicking prev generated link', async () => { + await PageObjects.common.navigateToUrlWithBrowserHistory( + 'management', + `/kibana/dataViews/dataView/${sourceDataViewId}`, + undefined + ); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // add source filter + await testSubjects.click('tab-sourceFilters'); + await testSubjects.click('fieldFilterInput'); + const filtersInput = await find.activeElement(); + await filtersInput.type('message'); + await testSubjects.click('addFieldFilterButton'); + + // change title + await testSubjects.click('editIndexPatternButton'); + await testSubjects.setValue('createIndexPatternTitleInput', 'search-s', { + clearWithKeyboard: true, + typeCharByChar: true, + }); + await testSubjects.click('saveIndexPatternButton'); + await testSubjects.click('confirmModalConfirmButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await openAlertResults(RULE_NAME); + + await checkInitialRuleParamsState(SOURCE_DATA_VIEW); + await checkInitialDataViewState(SOURCE_DATA_VIEW); + }); + + it('should display actual data view state after update on clicking viewInApp link', async () => { + await clickViewInApp(RULE_NAME); + await checkUpdatedRuleParamsState(); + await checkUpdatedDataViewState('search-s*'); + }); + + it('should navigate to alert results via link provided in notification using adhoc data view', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.createAdHocDataView('search-source-', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.timePicker.setCommonlyUsedTime('Last_15 minutes'); + await PageObjects.discover.addRuntimeField('runtime-message-field', `emit('mock-message')`); + + // create an alert + await openDiscoverAlertFlyout(); + await defineSearchSourceAlert('test-adhoc-alert'); + await testSubjects.click('saveRuleButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await openAlertResults(ADHOC_RULE_NAME); + + const selectedDataView = await PageObjects.discover.getCurrentlySelectedDataView(); + expect(selectedDataView).to.be.equal('search-source-*'); + + const documentCell = await dataGrid.getCellElement(0, 3); + const firstRowContent = await documentCell.getVisibleText(); + expect(firstRowContent.includes('runtime-message-fieldmock-message')).to.be.equal(true); + + expect(await dataGrid.getDocCount()).to.be(5); + }); + + it('should navigate to alert results via view in app link using adhoc data view', async () => { + // navigate to discover using view in app link + await clickViewInApp(ADHOC_RULE_NAME); + + const selectedDataView = await PageObjects.discover.getCurrentlySelectedDataView(); + expect(selectedDataView).to.be.equal('search-source-*'); + + const documentCell = await dataGrid.getCellElement(0, 3); + const firstRowContent = await documentCell.getVisibleText(); + expect(firstRowContent.includes('runtime-message-fieldmock-message')).to.be.equal(true); + }); + + it('should display results after data view removal on clicking prev generated link', async () => { + await PageObjects.discover.selectIndexPattern(OUTPUT_DATA_VIEW); + await deleteDataView(sourceDataViewId); + + await openAlertResults(RULE_NAME); + + await checkInitialRuleParamsState(SOURCE_DATA_VIEW); + await checkInitialDataViewState(SOURCE_DATA_VIEW); + }); + + it('should not display results after data view removal on clicking viewInApp link', async () => { + await clickViewInApp(RULE_NAME); + + expect(await toasts.getToastCount()).to.be.equal(1); + const content = await toasts.getToastContent(1); + expect(content).to.equal( + `Error fetching search source\nCould not locate that data view (id: ${sourceDataViewId}), click here to re-create it` + ); + }); + + it('should display results after rule removal on following generated link', async () => { + await PageObjects.discover.selectIndexPattern(OUTPUT_DATA_VIEW); + const [{ id: firstAlertId }] = await getAlertsByName(RULE_NAME); + await deleteAlerts([firstAlertId]); + + await openAlertResults(firstAlertId, 'id'); + + await checkInitialRuleParamsState(SOURCE_DATA_VIEW); + await checkInitialDataViewState(SOURCE_DATA_VIEW); + }); + + it('should check that there are no errors detected after an alert is created', async () => { + const newAlert = 'New Alert for checking its status'; + await createDataView('search-source*'); + + await PageObjects.common.navigateToApp('management'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // TODO: Navigation to Rule Management is different in Serverless + await PageObjects.common.navigateToApp('triggersActions'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.click('createRuleButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.waitFor('rule name value is correct', async () => { + await testSubjects.setValue('ruleNameInput', newAlert); + const ruleName = await testSubjects.getAttribute('ruleNameInput', 'value'); + return ruleName === newAlert; + }); + + await testSubjects.click('.es-query-SelectOption'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('queryFormType_searchSource'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.click('selectDataViewExpression'); + await testSubjects.click('indexPattern-switcher--input'); + if (await testSubjects.exists('clearSearchButton')) { + await testSubjects.click('clearSearchButton'); + } + const dataViewsElem = await testSubjects.find('euiSelectableList'); + const sourceDataViewOption = await dataViewsElem.findByCssSelector( + `[title="search-source*"]` + ); + await sourceDataViewOption.click(); + + // TODO: Serverless O11y has a required "Role visibility" selector + // https://github.com/elastic/kibana/issues/168034 + if (await testSubjects.exists('ruleFormConsumerSelect')) { + await comboBox.set('ruleFormConsumerSelect', 'Stack Rules'); + } + + await testSubjects.click('saveRuleButton'); + + await retry.waitFor('confirmation modal', async () => { + return await testSubjects.exists('confirmModalConfirmButton'); + }); + + await testSubjects.click('confirmModalConfirmButton'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + + await openAlertRuleInManagement(newAlert); + + await retry.waitFor('success status', async () => { + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + return await testSubjects.exists('ruleStatus-ok'); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_data_view_create_delete.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_data_view_create_delete.ts new file mode 100644 index 0000000000000..ca7bc4bc55569 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_data_view_create_delete.ts @@ -0,0 +1,266 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const browser = getService('browser'); + const log = getService('log'); + const retry = getService('retry'); + const testSubjects = getService('testSubjects'); + const find = getService('find'); + const PageObjects = getPageObjects(['settings', 'common', 'header']); + + describe('creating and deleting default data view', function describeIndexTests() { + // failsOnMKI, see https://github.com/elastic/kibana/issues/171479 + this.tags(['failsOnMKI']); + before(async function () { + // TODO: emptyKibanaIndex fails in Serverless with + // "index_not_found_exception: no such index [.kibana_ingest]", + // so it was switched to `savedObjects.cleanStandardList()` + await kibanaServer.savedObjects.cleanStandardList(); + // TODO: Loading this from `es_archives` in `test_serverless` + // instead since minor modifications were required + await esArchiver.loadIfNeeded( + 'x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern' + ); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.uiSettings.replace({}); + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + }); + + after(async function () { + // TODO: Loading this from `es_archives` in `test_serverless` + // instead since minor modifications were required + await esArchiver.unload( + 'x-pack/test_serverless/functional/es_archives/kibana_sample_data_flights_index_pattern' + ); + + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + describe('can open and close editor', function () { + it('without creating index pattern', async function () { + await PageObjects.settings.clickKibanaIndexPatterns(); + await PageObjects.settings.clickAddNewIndexPatternButton(); + await testSubjects.click('closeFlyoutButton'); + await testSubjects.find('createDataViewButton'); + }); + }); + + describe('validation', function () { + it('can display errors', async function () { + await PageObjects.settings.clickAddNewIndexPatternButton(); + await PageObjects.settings.setIndexPatternField('log-fake*'); + await (await PageObjects.settings.getSaveIndexPatternButton()).click(); + await find.byClassName('euiFormErrorText'); + }); + + it('can resolve errors and submit', async function () { + await PageObjects.settings.setIndexPatternField('log*'); + await new Promise((e) => setTimeout(e, 500)); + await (await PageObjects.settings.getSaveDataViewButtonActive()).click(); + await PageObjects.settings.removeIndexPattern(); + }); + + it('correctly validates timestamp after index pattern changes', async function () { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await PageObjects.settings.clickAddNewIndexPatternButton(); + // setting the index pattern also sets the time field + await PageObjects.settings.setIndexPatternField('log*'); + // wait for timestamp fields to load + await new Promise((e) => setTimeout(e, 1000)); + // this won't have 'timestamp' field + await PageObjects.settings.setIndexPatternField('kibana*'); + // wait for timestamp fields to load + await new Promise((e) => setTimeout(e, 1000)); + await (await PageObjects.settings.getSaveIndexPatternButton()).click(); + // verify an error is displayed + await find.byClassName('euiFormErrorText'); + await testSubjects.click('closeFlyoutButton'); + }); + }); + + describe('special character handling', () => { + it('should handle special charaters in template input', async () => { + await PageObjects.settings.clickAddNewIndexPatternButton(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.settings.setIndexPatternField('❤️'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('createIndexPatternStatusMessage')).to.contain( + `The index pattern you entered doesn\'t match any data streams, indices, or index aliases.` + ); + }); + }); + + after(async () => { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + }); + }); + + describe('index pattern creation', function indexPatternCreation() { + let indexPatternId: string; + + before(function () { + return PageObjects.settings + .createIndexPattern('logstash-*') + .then((id) => (indexPatternId = id)); + }); + + it('should have index pattern in page header', async function () { + const patternName = await PageObjects.settings.getIndexPageHeading(); + expect(patternName).to.be('logstash-*'); + }); + + it('should have index pattern in url', function url() { + return retry.try(function tryingForTime() { + return browser.getCurrentUrl().then(function (currentUrl) { + expect(currentUrl).to.contain(indexPatternId); + }); + }); + }); + + it('should have expected table headers', function checkingHeader() { + return PageObjects.settings.getTableHeader().then(function (headers) { + log.debug('header.length = ' + headers.length); + const expectedHeaders = [ + 'Name', + 'Type', + 'Format', + 'Searchable', + 'Aggregatable', + 'Excluded', + ]; + + expect(headers.length).to.be(expectedHeaders.length); + + const comparedHeaders = headers.map(function compareHead(header, i) { + return header.getVisibleText().then(function (text) { + expect(text).to.be(expectedHeaders[i]); + }); + }); + + return Promise.all(comparedHeaders); + }); + }); + }); + + describe('edit index pattern', () => { + it('on edit click', async () => { + await PageObjects.settings.editIndexPattern('logstash-*', '@timestamp', 'Logstash Star'); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('indexPatternTitle')).to.contain( + `Logstash Star` + ); + }); + }); + it('can save with same name', async () => { + await PageObjects.settings.editIndexPattern( + 'logstash-*,hello_world*', + '@timestamp', + 'Logstash Star', + true + ); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('indexPatternTitle')).to.contain( + `Logstash Star` + ); + }); + }); + it('shows edit confirm message when editing index-pattern', async () => { + await PageObjects.settings.editIndexPattern( + 'logstash-2*', + '@timestamp', + 'Index Star', + true + ); + + await retry.try(async () => { + expect(await testSubjects.getVisibleText('indexPatternTitle')).to.contain(`Index Star`); + }); + }); + }); + + describe('index pattern edit', function () { + it('should update field list', async function () { + await PageObjects.settings.editIndexPattern( + 'kibana_sample_data_flights', + 'timestamp', + undefined, + true + ); + + await retry.try(async () => { + // verify initial field list + expect(await testSubjects.exists('field-name-AvgTicketPrice')).to.be(true); + }); + + await PageObjects.settings.editIndexPattern('logstash-*', '@timestamp', undefined, true); + await retry.try(async () => { + // verify updated field list + expect(await testSubjects.exists('field-name-agent')).to.be(true); + }); + }); + + it('should disable Save button after pressing', async function () { + await PageObjects.settings.clickEditIndexButton(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.try(async () => { + await PageObjects.settings.setIndexPatternField('logs*'); + }); + await PageObjects.settings.selectTimeFieldOption('@timestamp'); + + expect(await testSubjects.isEnabled('saveIndexPatternButton')).to.be(true); + await (await PageObjects.settings.getSaveDataViewButtonActive()).click(); + + // wait for the confirmation modal to open + await retry.waitFor('confirmation modal', async () => { + return await testSubjects.exists('confirmModalConfirmButton'); + }); + + // while the confirmation modal is open, we can check that the form button has actually become disabled + expect(await testSubjects.isEnabled('saveIndexPatternButton')).to.be(false); + + await testSubjects.click('confirmModalConfirmButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + }); + }); + + describe('index pattern deletion', function indexDelete() { + before(function () { + const expectedAlertText = 'Delete data view'; + return PageObjects.settings.removeIndexPattern().then(function (alertText) { + expect(alertText).to.be(expectedAlertText); + }); + }); + + it('should return to index pattern list', function indexNotInUrl() { + // give the url time to settle + return retry.try(function tryingForTime() { + return browser.getCurrentUrl().then(function (currentUrl) { + log.debug('currentUrl = ' + currentUrl); + expect(currentUrl).to.contain('management/kibana/dataViews'); + }); + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts new file mode 100644 index 0000000000000..6ef2f01618a6c --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_edit_field.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['settings', 'common']); + const testSubjects = getService('testSubjects'); + + describe('edit field', function () { + before(async function () { + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async function afterAll() { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + }); + + describe('field preview', function fieldPreview() { + before(async () => { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await PageObjects.settings.clickIndexPatternLogstash(); + }); + + it('should show preview for fields in _source', async function () { + await PageObjects.settings.filterField('extension'); + await testSubjects.click('editFieldFormat'); + await testSubjects.find('value'); + let previewText = ''; + await retry.waitForWithTimeout('get preview value', 1000, async () => { + previewText = await testSubjects.getVisibleText('value'); + return previewText !== 'Value not set'; + }); + expect(previewText).to.be('css'); + await PageObjects.settings.closeIndexPatternFieldEditor(); + }); + + it('should show preview for fields not in _source', async function () { + await PageObjects.settings.filterField('extension.raw'); + await testSubjects.click('editFieldFormat'); + await testSubjects.find('value'); + let previewText = ''; + await retry.waitForWithTimeout('get preview value', 1000, async () => { + previewText = await testSubjects.getVisibleText('value'); + return previewText !== 'Value not set'; + }); + expect(previewText).to.be('css'); + await PageObjects.settings.closeIndexPatternFieldEditor(); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_exclude_index_pattern.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_exclude_index_pattern.ts new file mode 100644 index 0000000000000..05f2545c5a899 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_exclude_index_pattern.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['settings', 'common']); + const es = getService('es'); + const security = getService('security'); + const testSubjects = getService('testSubjects'); + + describe('creating and deleting default index', function describeIndexTests() { + before(async function () { + await security.testUser.setRoles(['kibana_admin', 'index_a', 'index_b']); + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await es.transport.request({ + path: '/index-a/_doc', + method: 'POST', + body: { user: 'matt' }, + }); + + await es.transport.request({ + path: '/index-b/_doc', + method: 'POST', + body: { title: 'hello' }, + }); + await PageObjects.settings.createIndexPattern('index-*,-index-b'); + }); + + it('data view creation with exclusion', async () => { + const fieldCount = await PageObjects.settings.getFieldsTabCount(); + // five metafields plus keyword and text version of 'user' field + expect(parseInt(fieldCount, 10)).to.be(6); + }); + + after(async () => { + await es.transport.request({ + path: '/index-a', + method: 'DELETE', + }); + await es.transport.request({ + path: '/index-b', + method: 'DELETE', + }); + await PageObjects.settings.removeIndexPattern(); + await security.testUser.restoreDefaults(); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_index_pattern_filter.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_index_pattern_filter.ts new file mode 100644 index 0000000000000..9da55f122114c --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_index_pattern_filter.ts @@ -0,0 +1,203 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const retry = getService('retry'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['settings', 'common']); + const es = getService('es'); + + describe('index pattern filter', function describeIndexTests() { + before(async function () { + await kibanaServer.savedObjects.cleanStandardList(); + await kibanaServer.uiSettings.replace({}); + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + }); + + beforeEach(async function () { + await PageObjects.settings.createIndexPattern('logstash-*'); + }); + + afterEach(async function () { + await PageObjects.settings.removeIndexPattern(); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + it('should filter indexed fields by type', async function () { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await PageObjects.settings.clickIndexPatternLogstash(); + await PageObjects.settings.getFieldTypes(); + await PageObjects.settings.setFieldTypeFilter('keyword'); + + await retry.try(async function () { + const fieldTypes = await PageObjects.settings.getFieldTypes(); + expect(fieldTypes.length).to.be.above(0); + for (const fieldType of fieldTypes) { + expect(fieldType).to.be('keyword'); + } + }); + await PageObjects.settings.clearFieldTypeFilter('keyword'); + + await PageObjects.settings.setFieldTypeFilter('long'); + + await retry.try(async function () { + const fieldTypes = await PageObjects.settings.getFieldTypes(); + expect(fieldTypes.length).to.be.above(0); + for (const fieldType of fieldTypes) { + expect(fieldType).to.be('long'); + } + }); + await PageObjects.settings.clearFieldTypeFilter('long'); + }); + + it('should filter indexed fields by schema type', async function () { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await PageObjects.settings.clickIndexPatternLogstash(); + + await PageObjects.settings.addRuntimeField('_test', 'keyword', "emit('hi')"); + + const unfilteredFields = [ + '@message', + '@message.raw', + '@tags', + '@tags.raw', + '@timestamp', + '_id', + '_index', + '_score', + '_source', + '_test', + ]; + + expect(await PageObjects.settings.getFieldNames()).to.eql(unfilteredFields); + + await PageObjects.settings.setSchemaFieldTypeFilter('runtime'); + + expect(await PageObjects.settings.getFieldNames()).to.eql(['_test']); + + await PageObjects.settings.setSchemaFieldTypeFilter('indexed'); + + expect(await PageObjects.settings.getFieldNames()).to.eql(unfilteredFields); + }); + + it('should filter indexed fields when searched', async function () { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await PageObjects.settings.clickIndexPatternLogstash(); + + const unfilteredFields = [ + '@message', + '@message.raw', + '@tags', + '@tags.raw', + '@timestamp', + '_id', + '_index', + '_score', + '_source', + 'agent', + ]; + + expect(await PageObjects.settings.getFieldNames()).to.eql(unfilteredFields); + + await PageObjects.settings.filterField('@'); + + expect(await PageObjects.settings.getFieldNames()).to.eql([ + '@message', + '@message.raw', + '@tags', + '@tags.raw', + '@timestamp', + ]); + + await PageObjects.settings.filterField('@message'); + + expect(await PageObjects.settings.getFieldNames()).to.eql(['@message', '@message.raw']); + + expect( + (await testSubjects.getVisibleText('tab-indexedFields')).startsWith('Fields (2 /') + ).to.be(true); + + await testSubjects.click('clearSearchButton'); + + expect(await PageObjects.settings.getFieldNames()).to.eql(unfilteredFields); + }); + + it('should set "conflict" filter when "View conflicts" button is pressed', async function () { + const additionalIndexWithWrongMapping = 'logstash-wrong'; + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + + if (await es.indices.exists({ index: additionalIndexWithWrongMapping })) { + await es.indices.delete({ index: additionalIndexWithWrongMapping }); + } + + await es.indices.create({ + index: additionalIndexWithWrongMapping, + body: { + mappings: { + properties: { + bytes: { + type: 'keyword', + }, + }, + }, + }, + }); + + await es.index({ + index: additionalIndexWithWrongMapping, + body: { + bytes: 'wrong_value', + }, + refresh: 'wait_for', + }); + + await PageObjects.settings.clickIndexPatternLogstash(); + + await testSubjects.existOrFail('dataViewMappingConflict'); + + expect(await PageObjects.settings.getFieldTypes()).to.eql([ + 'text', + 'keyword', + 'text', + 'keyword', + 'date', + '_id', + '_index', + '', + '_source', + 'text', + ]); + + // set other filters to check if they get reset after pressing the button + await PageObjects.settings.filterField('unknown'); + await PageObjects.settings.setFieldTypeFilter('text'); + await PageObjects.settings.setSchemaFieldTypeFilter('runtime'); + expect(await PageObjects.settings.getFieldTypes()).to.eql([]); + + // check that only a conflicting field is shown + await testSubjects.click('viewDataViewMappingConflictsButton'); + expect(await PageObjects.settings.getFieldTypes()).to.eql(['keyword, long\nConflict']); + expect(await PageObjects.settings.getFieldNames()).to.eql(['bytes']); + + await es.indices.delete({ index: additionalIndexWithWrongMapping }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_runtime_fields.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_runtime_fields.ts new file mode 100644 index 0000000000000..810676e07df47 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_runtime_fields.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const log = getService('log'); + const browser = getService('browser'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['settings', 'common']); + const testSubjects = getService('testSubjects'); + + describe('runtime fields', function () { + this.tags(['skipFirefox']); + + before(async function () { + await browser.setWindowSize(1200, 800); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.uiSettings.replace({}); + }); + + after(async function afterAll() { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + }); + + describe('create runtime field', function describeIndexTests() { + const fieldName = 'atest'; + + it('should create runtime field', async function () { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await PageObjects.settings.clickIndexPatternLogstash(); + const startingCount = parseInt(await PageObjects.settings.getFieldsTabCount(), 10); + await log.debug('add runtime field'); + await PageObjects.settings.addRuntimeField( + fieldName, + 'Keyword', + "emit('hello world')", + false + ); + + await log.debug('check that field preview is rendered'); + expect(await testSubjects.exists('fieldPreviewItem', { timeout: 1500 })).to.be(true); + + await PageObjects.settings.clickSaveField(); + + await retry.try(async function () { + expect(parseInt(await PageObjects.settings.getFieldsTabCount(), 10)).to.be( + startingCount + 1 + ); + }); + }); + + it('should modify runtime field', async function () { + await PageObjects.settings.filterField(fieldName); + await testSubjects.click('editFieldFormat'); + await PageObjects.settings.setFieldType('Long'); + await PageObjects.settings.setFieldScriptWithoutToggle('emit(6);'); + await PageObjects.settings.toggleRow('formatRow'); + await PageObjects.settings.setFieldFormat('bytes'); + await testSubjects.find('changeWarning'); + await PageObjects.settings.clickSaveField(); + await PageObjects.settings.confirmSave(); + }); + + it('verify field format', async function () { + await testSubjects.click('editFieldFormat'); + const select = await testSubjects.find('editorSelectedFormatId'); + expect(await select.getAttribute('value')).to.be('bytes'); + await PageObjects.settings.closeIndexPatternFieldEditor(); + }); + + it('should delete runtime field', async function () { + await testSubjects.click('deleteField'); + await PageObjects.settings.confirmDelete(); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/_runtime_fields_composite.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_runtime_fields_composite.ts new file mode 100644 index 0000000000000..a047a4f0e85a5 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/_runtime_fields_composite.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const log = getService('log'); + const browser = getService('browser'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['settings', 'common']); + const testSubjects = getService('testSubjects'); + + describe('runtime fields', function () { + this.tags(['skipFirefox']); + + before(async function () { + await browser.setWindowSize(1200, 800); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.uiSettings.replace({}); + }); + + after(async function afterAll() { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + }); + + describe('create composite runtime field', function describeIndexTests() { + // Starting with '@' to sort toward start of field list + const fieldName = '@composite.test'; + + it('should create runtime field', async function () { + // TODO: Navigation to Data View Management is different in Serverless + await PageObjects.common.navigateToApp('management'); + await testSubjects.click('app-card-dataViews'); + await PageObjects.settings.clickIndexPatternLogstash(); + const startingCount = parseInt(await PageObjects.settings.getFieldsTabCount(), 10); + await log.debug('add runtime field'); + await PageObjects.settings.addCompositeRuntimeField( + fieldName, + "emit('a.a','hello world')", + false, + 1 + ); + + await log.debug('check that field preview is rendered'); + expect(await testSubjects.exists('fieldPreviewItem', { timeout: 1500 })).to.be(true); + + await PageObjects.settings.clickSaveField(); + + await retry.try(async function () { + expect(parseInt(await PageObjects.settings.getFieldsTabCount(), 10)).to.be( + startingCount + 1 + ); + }); + }); + + it('should modify runtime field', async function () { + const startingCount = parseInt(await PageObjects.settings.getFieldsTabCount(), 10); + await PageObjects.settings.filterField(fieldName); + await testSubjects.click('editFieldFormat'); + // wait for subfields to render + await testSubjects.find(`typeField_0`); + await new Promise((e) => setTimeout(e, 2000)); + await PageObjects.settings.setCompositeScript("emit('a',6);emit('b',10);"); + + // wait for subfields to render + await testSubjects.find(`typeField_1`); + await new Promise((e) => setTimeout(e, 500)); + + await PageObjects.settings.clickSaveField(); + await testSubjects.click('clearSearchButton'); + await retry.try(async function () { + expect(parseInt(await PageObjects.settings.getFieldsTabCount(), 10)).to.be( + startingCount + 1 + ); + }); + }); + + it('should delete runtime field', async function () { + await testSubjects.click('deleteField'); + await PageObjects.settings.confirmDelete(); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_views/index.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/index.ts new file mode 100644 index 0000000000000..6a512b6d6e273 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/index.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default ({ getService, loadTestFile, getPageObject }: FtrProviderContext) => { + describe('Data View Management', function () { + const esArchiver = getService('esArchiver'); + const svlCommonPage = getPageObject('svlCommonPage'); + + before(async () => { + // TODO: Serverless tests require login first + await svlCommonPage.login(); + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/makelogs'); + }); + + after(async () => { + await esArchiver.unload('test/functional/fixtures/es_archiver/makelogs'); + }); + + loadTestFile(require.resolve('./serverless')); + loadTestFile(require.resolve('./_data_view_create_delete')); + loadTestFile(require.resolve('./_runtime_fields')); + loadTestFile(require.resolve('./_runtime_fields_composite')); + loadTestFile(require.resolve('./_exclude_index_pattern')); + loadTestFile(require.resolve('./_index_pattern_filter')); + loadTestFile(require.resolve('./_edit_field')); + }); +}; diff --git a/x-pack/test_serverless/functional/test_suites/common/management/data_view_mgmt.ts b/x-pack/test_serverless/functional/test_suites/common/management/data_views/serverless.ts similarity index 97% rename from x-pack/test_serverless/functional/test_suites/common/management/data_view_mgmt.ts rename to x-pack/test_serverless/functional/test_suites/common/management/data_views/serverless.ts index e7905f6879823..896c95b6dc2bd 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/data_view_mgmt.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/data_views/serverless.ts @@ -9,7 +9,7 @@ import expect from 'expect'; import { DATA_VIEW_PATH } from '@kbn/data-views-plugin/server'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import { INITIAL_REST_VERSION } from '@kbn/data-views-plugin/server/constants'; -import { FtrProviderContext } from '../../../ftr_provider_context'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; const archivePath = 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index'; @@ -19,7 +19,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const supertest = getService('supertest'); const testSubjects = getService('testSubjects'); - describe('Data View Management', function () { + describe('Serverless tests', function () { this.beforeAll(async () => { await PageObjects.svlCommonPage.login(); }); diff --git a/x-pack/test_serverless/functional/test_suites/common/management/index.ts b/x-pack/test_serverless/functional/test_suites/common/management/index.ts index f20efc97b091d..c4d33393c9a88 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/index.ts @@ -15,7 +15,7 @@ export default ({ loadTestFile }: FtrProviderContext) => { loadTestFile(require.resolve('./transforms/search_bar_features')); loadTestFile(require.resolve('./transforms/transform_list')); loadTestFile(require.resolve('./advanced_settings')); - loadTestFile(require.resolve('./data_view_mgmt')); + loadTestFile(require.resolve('./data_views')); loadTestFile(require.resolve('./disabled_uis')); }); }; diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts index bbcd138e20160..bbb66a9841868 100644 --- a/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/index.ts @@ -11,5 +11,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('Serverless Common UI - Platform Security', function () { loadTestFile(require.resolve('./api_keys')); loadTestFile(require.resolve('./navigation/avatar_menu')); + loadTestFile(require.resolve('./user_profiles/user_profiles')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/platform_security/user_profiles/user_profiles.ts b/x-pack/test_serverless/functional/test_suites/common/platform_security/user_profiles/user_profiles.ts new file mode 100644 index 0000000000000..57ef995a4f7a6 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/platform_security/user_profiles/user_profiles.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getPageObjects }: FtrProviderContext) { + const pageObjects = getPageObjects(['svlCommonPage', 'common', 'userProfiles']); + + describe('User Profile Page', async () => { + before(async () => { + await pageObjects.svlCommonPage.login(); + }); + + describe('Theme', async () => { + it('should change theme based on the User Profile Theme control', async () => { + await pageObjects.common.navigateToApp('security_account'); + + const themeKeyPadMenu = await pageObjects.userProfiles.getThemeKeypadMenu(); + expect(themeKeyPadMenu).not.to.be(null); + + await pageObjects.userProfiles.changeUserProfileTheme('Dark'); + const darkModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(darkModeTag).to.be('v8dark'); + + await pageObjects.userProfiles.changeUserProfileTheme('Light'); + const lightModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(lightModeTag).to.be('v8light'); + + await pageObjects.userProfiles.changeUserProfileTheme('Space default'); + const spaceDefaultModeTag = await pageObjects.userProfiles.getThemeTag(); + expect(spaceDefaultModeTag).to.be('v8light'); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts new file mode 100644 index 0000000000000..7b8fb4b072847 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group5.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const baseTestConfig = await readConfigFile(require.resolve('../config.ts')); + + return { + ...baseTestConfig.getAll(), + testFiles: [ + require.resolve('../../common/discover/group1'), + require.resolve('../../common/discover/group2'), + require.resolve('../../common/discover/group3'), + ], + junit: { + reportName: 'Serverless Observability Functional Tests - Common Group 5', + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts new file mode 100644 index 0000000000000..9891e7b8ee488 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/common_configs/config.group6.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const baseTestConfig = await readConfigFile(require.resolve('../config.ts')); + + return { + ...baseTestConfig.getAll(), + testFiles: [ + require.resolve('../../common/discover/embeddable'), + require.resolve('../../common/discover/x_pack'), + require.resolve('../../common/discover_ml_uptime/discover'), + require.resolve('../../common/context'), + ], + junit: { + reportName: 'Serverless Observability Functional Tests - Common Group 6', + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts new file mode 100644 index 0000000000000..70cabf59051a9 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group5.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const baseTestConfig = await readConfigFile(require.resolve('../config.ts')); + + return { + ...baseTestConfig.getAll(), + testFiles: [ + require.resolve('../../common/discover/group1'), + require.resolve('../../common/discover/group2'), + require.resolve('../../common/discover/group3'), + ], + junit: { + reportName: 'Serverless Search Functional Tests - Common Group 5', + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts new file mode 100644 index 0000000000000..25b3a8802a6f0 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/search/common_configs/config.group6.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const baseTestConfig = await readConfigFile(require.resolve('../config.ts')); + + return { + ...baseTestConfig.getAll(), + testFiles: [ + require.resolve('../../common/discover/embeddable'), + require.resolve('../../common/discover/x_pack'), + require.resolve('../../common/discover_ml_uptime/discover'), + require.resolve('../../common/context'), + ], + junit: { + reportName: 'Serverless Search Functional Tests - Common Group 6', + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts b/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts index 0ae48d641be4b..ea76872a57876 100644 --- a/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts +++ b/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts @@ -29,6 +29,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('Building a new dashboard', function () { before(async () => { await PageObjects.svlCommonPage.login(); + await kibanaServer.savedObjects.cleanStandardList(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json' @@ -44,11 +45,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await kibanaServer.importExport.unload( 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json' ); + await kibanaServer.savedObjects.cleanStandardList(); await PageObjects.svlCommonPage.forceLogout(); }); it('can add a lens panel by value', async () => { - await PageObjects.lens.createAndAddLensFromDashboard({ ignoreTimeFilter: true }); + await PageObjects.lens.createAndAddLensFromDashboard({}); const newPanelCount = await PageObjects.dashboard.getPanelCount(); expect(newPanelCount).to.eql(1); }); diff --git a/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts new file mode 100644 index 0000000000000..d1637bf34b4fd --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group5.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const baseTestConfig = await readConfigFile(require.resolve('../config.ts')); + + return { + ...baseTestConfig.getAll(), + testFiles: [ + require.resolve('../../common/discover/group1'), + require.resolve('../../common/discover/group2'), + require.resolve('../../common/discover/group3'), + ], + junit: { + reportName: 'Serverless Security Functional Tests - Common Group 5', + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts new file mode 100644 index 0000000000000..f3276ecd3c67c --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/security/common_configs/config.group6.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const baseTestConfig = await readConfigFile(require.resolve('../config.ts')); + + return { + ...baseTestConfig.getAll(), + testFiles: [ + require.resolve('../../common/discover/embeddable'), + require.resolve('../../common/discover/x_pack'), + require.resolve('../../common/discover_ml_uptime/discover'), + require.resolve('../../common/context'), + ], + junit: { + reportName: 'Serverless Security Functional Tests - Common Group 6', + }, + }; +} diff --git a/x-pack/test_serverless/functional/test_suites/security/ml/data_frame_analytics_jobs_list.ts b/x-pack/test_serverless/functional/test_suites/security/ml/data_frame_analytics_jobs_list.ts index f0dbed0ca9a7e..3a4153b264cc6 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ml/data_frame_analytics_jobs_list.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ml/data_frame_analytics_jobs_list.ts @@ -20,7 +20,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.svlCommonPage.login(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ihp_outlier'); - await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier', '@timestamp'); + await ml.testResources.createDataViewIfNeeded('ft_ihp_outlier', '@timestamp'); await ml.api.createDataFrameAnalyticsJob( ml.commonConfig.getDFAIhpOutlierDetectionJobConfig(dfaJobId) diff --git a/x-pack/test_serverless/shared/config.base.ts b/x-pack/test_serverless/shared/config.base.ts index ec11099f946c0..6dee26203b532 100644 --- a/x-pack/test_serverless/shared/config.base.ts +++ b/x-pack/test_serverless/shared/config.base.ts @@ -16,15 +16,16 @@ import { kibanaTestSuperuserServerless, getDockerFileMountPath, } from '@kbn/test'; -import { CA_CERT_PATH, KBN_CERT_PATH, KBN_KEY_PATH, kibanaDevServiceAccount } from '@kbn/dev-utils'; +import { CA_CERT_PATH, kibanaDevServiceAccount } from '@kbn/dev-utils'; import { commonFunctionalServices } from '@kbn/ftr-common-functional-services'; +import { MOCK_IDP_REALM_NAME } from '@kbn/mock-idp-plugin/common'; import { services } from './services'; export default async () => { const servers = { kibana: { ...kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless), - protocol: 'https', + protocol: process.env.TEST_CLOUD ? 'https' : 'http', certificateAuthorities: process.env.TEST_CLOUD ? undefined : [Fs.readFileSync(CA_CERT_PATH)], }, elasticsearch: { @@ -68,16 +69,6 @@ export default async () => { 'xpack.security.authc.realms.jwt.jwt1.order=-98', `xpack.security.authc.realms.jwt.jwt1.pkc_jwkset_path=${getDockerFileMountPath(jwksPath)}`, `xpack.security.authc.realms.jwt.jwt1.token_type=access_token`, - - 'xpack.security.authc.realms.saml.cloud-saml-kibana.attributes.principal=urn:oid:0.0.7', - 'xpack.security.authc.realms.saml.cloud-saml-kibana.idp.entity_id=http://www.elastic.co/saml1', - 'xpack.security.authc.realms.saml.cloud-saml-kibana.order=101', - `xpack.security.authc.realms.saml.cloud-saml-kibana.idp.metadata.path=${getDockerFileMountPath( - idpPath - )}`, - `xpack.security.authc.realms.saml.cloud-saml-kibana.sp.acs=http://localhost:${servers.kibana.port}/api/security/saml/callback`, - `xpack.security.authc.realms.saml.cloud-saml-kibana.sp.entity_id=http://localhost:${servers.kibana.port}`, - `xpack.security.authc.realms.saml.cloud-saml-kibana.sp.logout=http://localhost:${servers.kibana.port}/logout`, ], ssl: true, // SSL is required for SAML realm }, @@ -89,10 +80,6 @@ export default async () => { }, sourceArgs: ['--no-base-path', '--env.name=development'], serverArgs: [ - '--server.ssl.enabled=true', - `--server.ssl.key=${KBN_KEY_PATH}`, - `--server.ssl.certificate=${KBN_CERT_PATH}`, - `--server.ssl.certificateAuthorities=${CA_CERT_PATH}`, `--server.restrictInternalApis=true`, `--server.port=${servers.kibana.port}`, '--status.allowAnonymous=true', @@ -147,7 +134,7 @@ export default async () => { // user navigates to `/login` page directly and enters username and password in the login form. '--xpack.security.authc.selector.enabled=false', `--xpack.security.authc.providers=${JSON.stringify({ - saml: { 'cloud-saml-kibana': { order: 0, realm: 'cloud-saml-kibana' } }, + saml: { 'cloud-saml-kibana': { order: 0, realm: MOCK_IDP_REALM_NAME } }, basic: { 'cloud-basic': { order: 1 } }, })}`, '--xpack.encryptedSavedObjects.encryptionKey="wuGNaIhoMpk5sO4UBxgr3NyW1sFcLgIf"', diff --git a/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml b/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml index a8f7adfc85777..8b0627d960a49 100644 --- a/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml +++ b/x-pack/test_serverless/shared/lib/security/kibana_roles/project_controller_security_roles.yml @@ -240,6 +240,7 @@ t3_analyst: privileges: - read - write + - maintenance - names: - .lists* - .items* @@ -293,12 +294,16 @@ threat_intelligence_analyst: - endgame-* - filebeat-* - logs-* - - .lists* - - .items* - packetbeat-* - winlogbeat-* privileges: - read + - names: + - .lists* + - .items* + privileges: + - read + - write - names: - .alerts-security* - .siem-signals-* @@ -317,8 +322,7 @@ threat_intelligence_analyst: - application: "kibana-.kibana" privileges: - feature_ml.read - - feature_siem.read - - feature_siem.read_alerts + - feature_siem.all - feature_siem.endpoint_list_read - feature_siem.blocklist_all - feature_securitySolutionCases.all @@ -603,6 +607,7 @@ endpoint_operations_analyst: privileges: - read - write + - maintenance applications: - application: "kibana-.kibana" privileges: @@ -653,11 +658,15 @@ endpoint_policy_manager: - logs-* - packetbeat-* - winlogbeat-* + - risk-score.risk-score-* + privileges: + - read + - names: - .lists* - .items* - - risk-score.risk-score-* privileges: - read + - write - names: - .alerts-security* - .siem-signals-* diff --git a/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts b/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts index 4721a6f71d10e..ce922732796fe 100644 --- a/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts +++ b/x-pack/test_serverless/shared/services/deployment_agnostic_services.ts @@ -21,6 +21,7 @@ const deploymentAgnosticApiIntegrationServices = _.pick(apiIntegrationServices, 'esSupertest', 'indexPatterns', 'ingestPipelines', + 'indexManagement', 'kibanaServer', 'ml', 'randomness', diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index b4fdeb93c91cf..6f843b935d63f 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -48,7 +48,7 @@ "@kbn/rison", "@kbn/discover-plugin", "@kbn/data-plugin", - "@kbn/security-api-integration-helpers", + "@kbn/std", "@kbn/data-view-field-editor-plugin", "@kbn/data-plugin", "@kbn/dev-utils", @@ -63,8 +63,10 @@ "@kbn/cloud-security-posture-plugin", "@kbn/reporting-plugin", "@kbn/management-settings-ids", + "@kbn/fleet-plugin", "@kbn/apm-synthtrace", "@kbn/apm-synthtrace-client", "@kbn/reporting-export-types-csv-common", + "@kbn/mock-idp-plugin", ] } diff --git a/yarn.lock b/yarn.lock index 2551fb95cdf74..6a0fcd1fe02fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,10 +35,10 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@anthropic-ai/sdk@^0.6.2": - version "0.6.2" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.6.2.tgz#4be415e6b1d948df6f8e03af84aedf102ec74b70" - integrity sha512-fB9PUj9RFT+XjkL+E9Ol864ZIJi+1P8WnbHspN3N3/GK2uSzjd0cbVIKTGgf4v3N8MwaQu+UWnU7C4BG/fap/g== +"@anthropic-ai/sdk@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" + integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -48,6 +48,7 @@ form-data-encoder "1.7.2" formdata-node "^4.3.2" node-fetch "^2.6.7" + web-streams-polyfill "^3.2.1" "@apidevtools/json-schema-ref-parser@^9.0.6": version "9.0.9" @@ -3141,6 +3142,10 @@ version "0.0.0" uid "" +"@kbn/calculate-auto@link:packages/kbn-calculate-auto": + version "0.0.0" + uid "" + "@kbn/canvas-plugin@link:x-pack/plugins/canvas": version "0.0.0" uid "" @@ -4129,6 +4134,10 @@ version "0.0.0" uid "" +"@kbn/custom-icons@link:packages/kbn-custom-icons": + version "0.0.0" + uid "" + "@kbn/custom-integrations-plugin@link:src/plugins/custom_integrations": version "0.0.0" uid "" @@ -4301,6 +4310,10 @@ version "0.0.0" uid "" +"@kbn/elastic-agent-utils@link:packages/kbn-elastic-agent-utils": + version "0.0.0" + uid "" + "@kbn/elastic-assistant-plugin@link:x-pack/plugins/elastic_assistant": version "0.0.0" uid "" @@ -5057,10 +5070,18 @@ version "0.0.0" uid "" +"@kbn/ml-ui-actions@link:x-pack/packages/ml/ui_actions": + version "0.0.0" + uid "" + "@kbn/ml-url-state@link:x-pack/packages/ml/url_state": version "0.0.0" uid "" +"@kbn/mock-idp-plugin@link:packages/kbn-mock-idp-plugin": + version "0.0.0" + uid "" + "@kbn/monaco@link:packages/kbn-monaco": version "0.0.0" uid "" @@ -5917,10 +5938,6 @@ version "0.0.0" uid "" -"@kbn/subscription-tracking@link:packages/kbn-subscription-tracking": - version "0.0.0" - uid "" - "@kbn/synthetics-plugin@link:x-pack/plugins/synthetics": version "0.0.0" uid "" @@ -8374,10 +8391,10 @@ "@tanstack/query-core" "4.29.11" use-sync-external-store "^1.2.0" -"@testim/chrome-version@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@testim/chrome-version/-/chrome-version-1.1.3.tgz#fbb68696899d7b8c1b9b891eded9c04fe2cd5529" - integrity sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A== +"@testim/chrome-version@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@testim/chrome-version/-/chrome-version-1.1.4.tgz#86e04e677cd6c05fa230dd15ac223fa72d1d7090" + integrity sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g== "@testing-library/dom@^8.0.0": version "8.19.0" @@ -11562,7 +11579,7 @@ axios@^0.26.0: dependencies: follow-redirects "^1.14.8" -axios@^1.3.4, axios@^1.4.0, axios@^1.6.0: +axios@^1.3.4, axios@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== @@ -12834,18 +12851,18 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromedriver@^119.0.0: - version "119.0.0" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-119.0.0.tgz#f250c442e72266f3e28d2b1eebc6a671a8629340" - integrity sha512-3TmabGT7xg57/Jbsg6B/Kqk3HaSbCP1ZHkR5zNft5vT/IWKjZCAGTH9waMI+i5KHSEiMH0zOw/WF98l+1Npkpw== +chromedriver@^119.0.1: + version "119.0.1" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-119.0.1.tgz#064f3650790ccea055e9bfd95c600f5ea60295e9" + integrity sha512-lpCFFLaXPpvElTaUOWKdP74pFb/sJhWtWqMjn7Ju1YriWn8dT5JBk84BGXMPvZQs70WfCYWecxdMmwfIu1Mupg== dependencies: - "@testim/chrome-version" "^1.1.3" - axios "^1.4.0" - compare-versions "^6.0.0" + "@testim/chrome-version" "^1.1.4" + axios "^1.6.0" + compare-versions "^6.1.0" extract-zip "^2.0.1" https-proxy-agent "^5.0.1" proxy-from-env "^1.1.0" - tcp-port-used "^1.0.1" + tcp-port-used "^1.0.2" chromium-bidi@0.4.28: version "0.4.28" @@ -13254,7 +13271,7 @@ compare-versions@3.5.1: resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.5.1.tgz#26e1f5cf0d48a77eced5046b9f67b6b61075a393" integrity sha512-9fGPIB7C6AyM18CJJBHt5EnCZDG3oiTJYy0NjfIAGjKpzv0tkxWko7TNQHF5ymqm7IH03tqmeuBxtvD+Izh6mg== -compare-versions@^6.0.0: +compare-versions@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.0.tgz#3f2131e3ae93577df111dba133e6db876ffe127a" integrity sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg== @@ -14355,13 +14372,6 @@ debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, de dependencies: ms "2.1.2" -debug@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== - dependencies: - ms "^2.1.1" - debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -14369,6 +14379,13 @@ debug@4.1.1: dependencies: ms "^2.1.1" +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -17859,13 +17876,13 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@4.7.7, handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== +handlebars@4.7.8, handlebars@^4.7.7: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -18842,10 +18859,10 @@ io-ts@^2.0.5: resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.0.5.tgz#e6e3db9df8b047f9cbd6b69e7d2ad3e6437a0b13" integrity sha512-pL7uUptryanI5Glv+GUv7xh+aLBjxGEDmLwmEYNSx0yOD3djK0Nw5Bt0N6BAkv9LadOUU7QKpRsLcqnTh3UlLA== -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= +ip-regex@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" + integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== ip@^1.1.8: version "1.1.8" @@ -19405,7 +19422,7 @@ is-url-superb@^4.0.0: resolved "https://registry.yarnpkg.com/is-url-superb/-/is-url-superb-4.0.0.tgz#b54d1d2499bb16792748ac967aa3ecb41a33a8c2" integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== -is-url@^1.2.2, is-url@^1.2.4: +is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== @@ -19479,14 +19496,14 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -is2@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.1.tgz#8ac355644840921ce435d94f05d3a94634d3481a" - integrity sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA== +is2@^2.0.6: + version "2.0.9" + resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.9.tgz#ff63b441f90de343fa8fac2125ee170da8e8240d" + integrity sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g== dependencies: deep-is "^0.1.3" - ip-regex "^2.1.0" - is-url "^1.2.2" + ip-regex "^4.1.0" + is-url "^1.2.4" isarray@0.0.1: version "0.0.1" @@ -20688,12 +20705,12 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -langchain@^0.0.151: - version "0.0.151" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.0.151.tgz#10c1ebdda0d772e49dbca755ada6307c9280f601" - integrity sha512-RA7/ELK5dqUgv5glIP5Wm5JmbnrjH/eeROYdKGDGaDUNZrRJ2CLuEu+oJH7hcE5hpPoPlkLBCs/vz4hvr/YtYw== +langchain@^0.0.192: + version "0.0.192" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.0.192.tgz#4998440d70b44092bf8724d693920fe2ab84753f" + integrity sha512-/QFWTx8wTXz2hkUZbZ+MiI1UNzmPZCMZg3ZXCJGFjDKFqnaPJG47SuVLu8AaefnyYlbxNhKcku++rUjDNzFQFw== dependencies: - "@anthropic-ai/sdk" "^0.6.2" + "@anthropic-ai/sdk" "^0.9.1" ansi-styles "^5.0.0" binary-extensions "^2.2.0" camelcase "6" @@ -20704,16 +20721,15 @@ langchain@^0.0.151: js-yaml "^4.1.0" jsonpointer "^5.0.1" langchainhub "~0.0.6" - langsmith "~0.0.31" + langsmith "~0.0.48" ml-distance "^4.0.0" - object-hash "^3.0.0" - openai "~4.4.0" + openai "^4.19.0" openapi-types "^12.1.3" p-queue "^6.6.2" p-retry "4" uuid "^9.0.0" yaml "^2.2.1" - zod "^3.21.4" + zod "^3.22.3" zod-to-json-schema "^3.20.4" langchainhub@~0.0.6: @@ -20721,10 +20737,10 @@ langchainhub@~0.0.6: resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.6.tgz#9d2d06e4ce0807b4e8a31e19611f57aef990b54d" integrity sha512-SW6105T+YP1cTe0yMf//7kyshCgvCTyFBMTgH2H3s9rTAR4e+78DA/BBrUL/Mt4Q5eMWui7iGuAYb3pgGsdQ9w== -langsmith@~0.0.31: - version "0.0.33" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.0.33.tgz#0b8b0a7b9981777f37df86748892e417bdf94aea" - integrity sha512-8dVBjJsuIwsnUFtA6OJ85k2wWzpka+LsF2EFzpzpF3yOHO/Ui7oeCMobyp6L7QcgWIBdRUIJY6sNSxAW0uAMHg== +langsmith@~0.0.48: + version "0.0.48" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.0.48.tgz#3a9a8ce257271ddb43d01ebf585c4370a3a3ba79" + integrity sha512-s0hW8iZ90Q9XLTnDK0Pgee245URV3b1cXQjPDj5OKm1+KN7iSK1pKx+4CO7RcFLz58Ixe7Mt+mVcomYqUuryxQ== dependencies: "@types/uuid" "^9.0.1" commander "^10.0.1" @@ -22662,7 +22678,7 @@ negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -23146,11 +23162,6 @@ object-hash@^1.3.0, object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - object-identity-map@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/object-identity-map/-/object-identity-map-1.0.2.tgz#2b4213a4285ca3a8cd2e696782c9964f887524e7" @@ -23357,10 +23368,10 @@ openai@^3.3.0: axios "^0.26.0" form-data "^4.0.0" -openai@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.4.0.tgz#dbaab326eb044ddec479951b245850c482678031" - integrity sha512-JN0t628Kh95T0IrXl0HdBqnlJg+4Vq0Bnh55tio+dfCnyzHvMLiWyCM9m726MAJD2YkDU4/8RQB6rNbEq9ct2w== +openai@^4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.19.0.tgz#201bf971d2296b028f852fe9dabf61c4e5b96e71" + integrity sha512-cJbl0noZyAaXVKBTMMq6X5BAvP1pm2rWYDBnZes99NL+Zh5/4NmlAwyuhTZEru5SqGGZIoiYKeMPXy4bm9DI0w== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -23370,6 +23381,7 @@ openai@~4.4.0: form-data-encoder "1.7.2" formdata-node "^4.3.2" node-fetch "^2.6.7" + web-streams-polyfill "^3.2.1" openapi-types@^10.0.0: version "10.0.0" @@ -28580,13 +28592,13 @@ tcomb@^3.0.0, tcomb@^3.2.17: resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-3.2.29.tgz#32404fe9456d90c2cf4798682d37439f1ccc386c" integrity sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ== -tcp-port-used@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.1.tgz#46061078e2d38c73979a2c2c12b5a674e6689d70" - integrity sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q== +tcp-port-used@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.2.tgz#9652b7436eb1f4cfae111c79b558a25769f6faea" + integrity sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA== dependencies: - debug "4.1.0" - is2 "2.0.1" + debug "4.3.1" + is2 "^2.0.6" teex@^1.0.1: version "1.0.1" @@ -31349,7 +31361,7 @@ zod-to-json-schema@^3.20.4: resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.21.4.tgz#de97c5b6d4a25e9d444618486cb55c0c7fb949fd" integrity sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw== -zod@^3.21.4, zod@^3.22.3: +zod@^3.22.3: version "3.22.3" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.3.tgz#2fbc96118b174290d94e8896371c95629e87a060" integrity sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==